[Scilab-users] display of complex/not real numbers, again

Stéphane Mottelet stephane.mottelet at utc.fr
Thu Sep 12 10:26:26 CEST 2019


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


-- 

Stéphane Mottelet
Ingénieur de recherche
EA 4297 Transformations Intégrées de la Matière Renouvelable
Département Génie des Procédés Industriels
Sorbonne Universités - Université de Technologie de Compiègne
CS 60319, 60203 Compiègne cedex
Tel : +33(0)344234688
http://www.utc.fr/~mottelet




More information about the users mailing list