Hello Stéphane,
In Scilab 6.0.2 without format("e", 24)
--> h = %eps/128, x0=%pi/4
h =
1.735D-18
x0 =
0.7853982
--> (cos(x0+h)-cos(x0-h))/2/h
ans =
0.
--> cos(x0+%i*h)
ans =
0.7071068
--> imag(cos(x0+%i*h))/h
ans =
-0.7071068
--> -sin(x0)
ans =
-0.7071068
It seems to be close of Matlab's outputs, no ?
I probably not understand your problem ...
Antoine
Le 12/09/2019 à 10:26, Stéphane Mottelet a écrit :
Hello all,
The subject has been already discussed a lot but I would like it to be
discussed again because I now have a real rationale to promote a
change in the way complex numbers with small imaginary part are
displayed.
I don't know if some of you were aware of the clever technique of
complex-step derivative approximation, but until yesterday I was not
(see e.g.
http://mdolab.engin.umich.edu/sites/default/files/Martins2003CSD.pdf).
Roughly speaking, using the extension of a real function x->f(x) to
the complex plane allows to compute an approximation of the derivative
f'(x0) at a real x0 without using a substraction, like in the central
difference formula (f(x0+h)-f(x0-h))/2/h which is subject to
substractive cancelation when h is small. In Scilab most operators and
elementary functions are already complex-aware so this is easy to
illustrate the technique. For example let us approximate the
derivative of x->cos(x) at x=%pi/4, first with the central difference
formula, then with the complex step technique:
--> format("e",24)
--> h=%eps/128, x0=%pi/4
h =
1.73472347597680709D-18
x0 =
7.85398163397448279D-01
--> (cos(x0+h)-cos(x0-h))/2/h
ans =
0.00000000000000000D+00
--> imag(cos(x0+%i*h))/h
ans =
-7.07106781186547462D-01
--> -sin(x0)
ans =
-7.07106781186547462D-01
You can see the pathological approximation with central difference
formula and the perfect (up to relative machine precision)
approximation of complex-step formula.
However, the following is a pity:
--> cos(x0+%i*h)
ans =
7.07106781186547573D-01
We cannot see the imaginary part although seeing the latter is
fundamental in the complex-step technique. We have to force the
display like this, and frankly I don't like having to do that with my
students:
--> imag(cos(x0+%i*h))
ans =
-1.22663473334669916D-18
I hope that you will find that this example is a good rationale to
change the default display of Scilab. To feed the discussion, here is
how Matlab displays things, without having to change the default
settings:
>> h=eps/128, x0=pi/4
h =
1.7347e-18
x0 =
0.7854
>> (cos(x0+h)-cos(x0-h))/2/h
ans =
0
>> cos(x0+i*h)
ans =
0.7071 - 0.0000i
>> imag(cos(x0+i*h))/h
ans =
-0.7071
>> -sin(x0)
ans =
-0.7071
_______________________________________________
users mailing list
users@lists.scilab.org
http://lists.scilab.org/mailman/listinfo/users