[Scilab-users] lack of simplification for rational

Serge Steer Serge.Steer at inria.fr
Wed Nov 23 21:20:54 CET 2016


First of all if you compute the rational fraction numerator or 
denominator from their roots (and if they are complex conjugate) the 
result is a complex polynomial even if the imaginary part is not shown.

Second: the simplification of numerical rational fraction is a very 
difficult problem. As Tim said  the roots computed by numerical 
algorithm cannot be use for that purpose.
Just try:
p=poly(ones(1,n),"x","c");
r=roots(p)
plot(real(r)-1,imag(r),"+")
You will see the roots on a circle which radius is of order %eps^(1/n) !
It is not a bug just a consequence of the numerical computations.

The simplication algorithm present in Scilab tryes to find reasonable 
simplification based on the bezout equation error. But it has only be 
written for the real case.

The bug fixes Samuel pointed to you  allow simplification for complex 
polynomials having zero  imaginary parts.
Serge
Le 23/11/2016 à 19:37, philippe a écrit :
> Hi,
>
> I  have a problem  to simplify automatically rational with an 
> imaginary part. In my case  I only manipulate polynomials with real 
> coefficients but some imaginary part arise due to rounding errors. See 
> this example :
>
> -->X=poly(0,'x');
>
> -->A=(X-1)^2;
>
> -->B=(X-1)*(X-2);
>
> -->R=A/B// = (X-1)/(X-2)
>  R  =
>
>   - 1 + x
>     -----
>   - 2 + x
>
> -->A=clean(A+%eps*(1+%i))//  add a rounding error
>  A  =
>
> Partie réelle
>
>
>               2
>     1 - 2x + x
> Partie imaginaire
>
>
>     0
>
> -->R=A/B// = no simplifications
>  R  =
>
>                 2
>     1 - 2x +  1x
>    --------------
>               2
>     2 - 3x + x
>
>
> I can't simplify R, even using simp(R), I've found some work around 
> applying clean  to numerator/denominator coefficients TWICE (I don't 
> known why twice?!?!?)  :
>
> -->R=poly(clean(coeff(numer(R))),'x')/poly(clean(coeff(denom(R))),'x')
>  R  =
>
>              2
>   - 2 + x + x
>     ---------
>              2
>   - 6 + x + x
>
> -->R=poly(clean(coeff(numer(R))),'x')/poly(clean(coeff(denom(R))),'x')
>  R  =
>
>     2 + x
>     -----
>     6 + x
>
> but of course this doesn't work  for polynomials with complex 
> coefficients like :
>
>
> -->(X+%i)/(X^2+1) // = 1/(X-%i)
>  ans  =
>
>
>    i +  1x
>    --------
>          2
>     1 + x
>
> I would like to find a solution for all polynomials with real/complex 
> coefficients , any idea ?
>
> Philippe
>
> _______________________________________________
> users mailing list
> users at lists.scilab.org
> http://lists.scilab.org/mailman/listinfo/users





More information about the users mailing list