Hi Thomas,

The solver for dx=0 of some function fx, and then the running of fx to find f(x) of the extremum found by dx is quite successful. When I run dx for, say, pi/4 (let's be simple and use fx=sin x), I get ~0 instead of ~.707

Why is dx successful in solve, but not as a means to find dx of a specific x value?

(08-26-2018 04:47 PM)lrdheat Wrote: [ -> ]Why is dx successful in solve, but not as a means to find dx of a specific x value?

(08-21-2018 12:34 AM)Thomas Klemm Wrote: [ -> ]For a small discrete h, this can be approximated by

\(\frac{\partial f}{\partial x}\approx\frac{\Im[f(x + ih)]}{h}\)

Since we search for stationary points we set:

\(\frac{\partial f}{\partial x}=0\)

Which we approximate with just:

\(\Im[f(x + ih)]=0\)

To return an approximation for the derivative we have to divide \(\Im[f(x + ih)]\) by \(h\):

Code:

`LBL "dF"`

MVAR "x"

MVAR "h"

RCL "x"

RCL "h"

COMPLEX

XEQ "Fx"

COMPLEX

RCL÷ "h"

END

With your example:

We can calculate the value of \(\frac{d}{dx}\sin(x)\) at \(x=1\):

1E-6

STO "h"

1

STO "x"

XEQ "dF"

x: 5.40302305868e-1
Compare this with \(\cos(1)\):

1

COS

x: 5.40302305868e-1

Best regards

Thomas

(08-26-2018 04:47 PM)lrdheat Wrote: [ -> ]When I run dx for, say, pi/4 (let's be simple and use fx=sin x), I get ~0 instead of ~.707

my guess is you forget to divide by h:

df(x) ~ Im((f(x + i*h)) / h

Code:

`>>> from cmath import *`

>>> h = 1e-6

>>> sin(complex(pi/4, h).imag

7.0710678118666542e-07

>>> _ / h

0.70710678118666548

A blog from the inventor of Complex Step Differentiation Algorithm.

It had a fully worked out example, showing very stable and accurate estimates:

https://blogs.mathworks.com/cleve/2013/1...entiation/
Real part of f(x + h*I) is also useful, for getting second derivative (involve subtraction):

http://ancs.eng.buffalo.edu/pdf/ancs_pap..._gnc06.pdf
Since we already have the value of y = f(x + h*I) of approximate extremum x, we can improve it:

Code:

`from cmath import *`

f = lambda x: sin(x) ** exp(x) # rework post 3

x, h = 14.137167, 1e-6 # try to improve extremum x

y = f(complex(x, h))

# Newton's method, using f''(x) = 2/(h*h) * (f(x).real - y.real)

x -= h/2 * y.imag / (f(x).real - y.real)

2nd order x = 14.137167

3rd order x = 14.1371669412

Actual x = 14.137166942003920 ...