HP Forums
CAS diff() giving incorrect results - Printable Version

+- HP Forums (https://www.hpmuseum.org/forum)
+-- Forum: HP Calculators (and very old HP Computers) (/forum-3.html)
+--- Forum: HP Prime (/forum-5.html)
+--- Thread: CAS diff() giving incorrect results (/thread-17507.html)



CAS diff() giving incorrect results - Wes Loewer - 09-22-2021 07:10 PM

A couple of years ago I posted about a problem with the diff() command (https://www.hpmuseum.org/forum/thread-13532.html). The problem still exists in the most recent firmware.

I guess I had forgotten about the issue because I ran into the problem again yesterday, only it's worse than I original thought. The problem arises when you try to evaluate a derivative at a value, which is something that frequently comes up in calculus and physics.

For instance, evaluating the 2nd derivative of x^3 at x=4.

diff(x^3,x,2)|x = 4

which should evaluate to 6*x|x=4 which is 24. However, the CAS substitutes 4 in for x BEFORE differentiating, so the expression is interpreted as

diff(4^3,4,2) = diff(64,4,2)

which is meaningless.

Even worse than no answer is giving the wrong answer. If the value of x contains pi, then you get incorrect results.

diff(x^3+π^4,x)|x = π

should result in 3*x^2|x=π which is 3*π^2. Instead, the line is interpreted as

diff(π^3+π^4,π)

and now π is treated as a variable. So the result is 3*π^2+4*π^3.

This issue came to light yesterday when I was checking my test answer key and entered this (using primes which is equivalent to diff).

(x^2*cos(x))''|x = π

evaluated to -2 instead of π^2-2. I assumed that I had made some silly mistake in my work by hand. It took several repeated attempts before I concluded that I was correct and the calculator was wrong.

I realize I could use the d/dx template which works correctly, but there is no template for 2nd or higher order derivatives and

(∂(∂(x^2*cos(x),x),x)|(x = π))

looks really awkward (especially in Textbook mode) and using the ' (primes) is so very convenient. It's really an order of operations issue in which |x=a should be applied AFTER the diff() command has completed, not BEFORE.

And it seems only natural that the HP "Prime" should be able to correctly work with "primes". Big Grin


RE: CAS diff() giving incorrect results - parisse - 09-22-2021 07:26 PM

I have already tried to make | work as you expect with diff, but that was not successfull, it's too complicated. Please use subst
Code:

subst(diff(x^3,x,2),x = 4)
or just parentheses like
Code:

diff(x^3,x,2)(x = 4)



RE: CAS diff() giving incorrect results - Wes Loewer - 09-23-2021 06:20 PM

(09-22-2021 07:26 PM)parisse Wrote:  I have already tried to make | work as you expect with diff, but that was not successfull, it's too complicated. Please use subst

Okay, thanks for that info. That's good to know.

Quote:or just parentheses like
Code:

diff(x^3,x,2)(x = 4)

That's an interesting notation. It appears to work for other functions as well. Is there any way to use it with primes? When I try (x^3)''(x = 4) it gives a warning and returns (6*x) = 24, with the expression on the left and the result on the right. Is this the intended behavior?


RE: CAS diff() giving incorrect results - toml_12953 - 09-23-2021 07:26 PM

(09-23-2021 06:20 PM)Wes Loewer Wrote:  
(09-22-2021 07:26 PM)parisse Wrote:  I have already tried to make | work as you expect with diff, but that was not successfull, it's too complicated. Please use subst

Okay, thanks for that info. That's good to know.

Quote:or just parentheses like
Code:

diff(x^3,x,2)(x = 4)

That's an interesting notation. It appears to work for other functions as well. Is there any way to use it with primes? When I try (x^3)''(x = 4) it gives a warning and returns (6*x) = 24, with the expression on the left and the result on the right. Is this the intended behavior?

For that expression, the pipe does work

(x^3) | (x = 4) 64


RE: CAS diff() giving incorrect results - Albert Chan - 09-24-2021 10:48 AM

(09-23-2021 06:20 PM)Wes Loewer Wrote:  When I try (x^3)''(x = 4) it gives a warning and returns (6*x) = 24,

When I try same expression in the emulator, above return only 24, without warning.
I beiieve (x^3)''(x = 4) equivalent to subst((x^3)'', x = 4), only less typing.

Quote:That's an interesting notation. It appears to work for other functions as well.

If the expression is not a function, the notation may get confused with implied multiply.

XCAS> (1+x+x^2) (x=0.1)

Warning : using implicit multiplication for (1+x+x^2)(x=0.1)
x*(x^2+x+1)=(0.1*(x^2+x+1))

CAS> (1+x+x^2) (x=0.1)         → "Syntax Error"

We can get around the problem (both CAS and XCAS) with identity function.

CAS> id(1+x+x^2) (x=0.1)       → 1.11


RE: CAS diff() giving incorrect results - Wes Loewer - 09-24-2021 04:28 PM

(09-24-2021 10:48 AM)Albert Chan Wrote:  
(09-23-2021 06:20 PM)Wes Loewer Wrote:  When I try (x^3)''(x = 4) it gives a warning and returns (6*x) = 24,

When I try same expression in the emulator, above return only 24, without warning.
I beiieve (x^3)''(x = 4) equivalent to subst((x^3)'', x = 4), only less typing.

That's interesting. That's exactly what I was hoping to accomplish.
What version are you using? I tried this on the following versions:

2020-01-16 (HW-A, VC)
no warning, returns 24

2020-09-08 (HW-A), 2021-05-05 (HW-D), 2021-06-09 (VC)
has warning, returns 6*x=24


RE: CAS diff() giving incorrect results - Albert Chan - 09-24-2021 05:23 PM

Hi, Wes Loewer

It was an old version: Build: 2.1.14181 (2018 10 16)


RE: CAS diff() giving incorrect results - Wes Loewer - 09-24-2021 07:59 PM

(09-24-2021 05:23 PM)Albert Chan Wrote:  It was an old version: Build: 2.1.14181 (2018 10 16)

Okay, I guess something changed since then.


RE: CAS diff() giving incorrect results - parisse - 09-25-2021 04:04 PM

f(x=...) will work if f is an expression. It will not work with e.g. (x^3)'' because the parser will not detect that it's an expression (and it will do like if it was implicit multiplication because x appears in both).
If you work with derivatives, it's a good idea to save them in variables. First f:=x^3'', then f(x=4)


RE: CAS diff() giving incorrect results - Albert Chan - 09-25-2021 05:03 PM

(09-23-2021 06:20 PM)Wes Loewer Wrote:  When I try (x^3)''(x = 4) it gives a warning and returns (6*x) = 24
(09-25-2021 04:04 PM)parisse Wrote:  f(x=...) will work if f is an expression. It will not work with e.g. (x^3)'' because the parser will not detect that it's an expression (and it will do like if it was implicit multiplication because x appears in both).

Why does older version detected the expression, but not newer version ?
Does this mean newer versions of HP Prime CAS support implied multiplication ?

It still does not explain Wes Loewer weird result.
Assuming parser get confused, assumed implicit multiplication, we should have:

CAS> (6*x) * (x = 4)       → 6*x^2 = 24*x


RE: CAS diff() giving incorrect results - Albert Chan - 09-26-2021 12:04 PM

I thought that expression|(x=a) notation can be simulated with eval(subst(quote(expression), x=a))
But, not quite. subst version is better ! (I skipped eval, because f(x) not defined)

CAS> 'integrate(f(x),x)' (x = t*t

integrate(f(t*t)*(t+t),t)

CAS> 'integrate(f(x),x, 1, 2)' (x = t*t

integrate(f(t*t)*(t+t),t, 1, √2)


CAS> integrate(f(x),x) |x = t*t

x*f(t^2)

CAS> integrate(f(x),x, 1, 2) |x = t*t

integrate(f(x),x, 1, 2)

---

I may have found a quoting bug. If quoted expression is saved to a variable, quote is gone.

CAS> assume( t >= 0)
CAS> m := 'integrate(1/(√x*(x+1)),x)' (x = t*t)

integrate(1/(√(t*t)*(t*t+1))*(t+t),t)

CAS> m // should have matched Ans

2*atan(t)

Update: another bug, if we use notation x = a .. b

CAS> 'integrate(f(x),x = 1 .. 2)' (x = t*t

integrate(f(t*t),(t*t) = (1 .. 2))