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

Stéphane Mottelet stephane.mottelet at utc.fr
Thu Sep 12 11:59:20 CEST 2019


Le 12/09/2019 à 11:55, Antoine ELIAS a écrit :
> 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 ?

No, Scilab display is singularly different:

--> cos(x0+%i*h)
  ans  =
    0.7071068

the above has an imaginary part, which is quite small, but essential in 
the computation. Matlab is quite explicit here:

 >> cos(x0+i*h)
ans =
    0.7071 - 0.0000i


> 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. 
>> https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/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 at lists.scilab.org
> https://antispam.utc.fr/proxy/1/c3RlcGhhbmUubW90dGVsZXRAdXRjLmZy/lists.scilab.org/mailman/listinfo/users 
>

-- 
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