[Scilab-users] partial fractions
Samuel Gougeon
sgougeon at free.fr
Wed Dec 29 21:32:47 CET 2021
Hello Federico,
Le 16/07/2021 à 21:11, Federico Miyara a écrit :
>
> Dear All,
>
> I'm wonderig whether there is a standard method to obtain the partial
> fraction expansion of a rational function.
>
> Searching, I've found the function pfss(), which purportedly is meant
> for that, but I find it doesn't give a complete solution. For instance:
>
> // Poles and zeros
> p = [-8:-1];
> z = [0 0 0 0];
>
> // Numerator and denominator
> N = prod(%s - z)
> D = prod(%s - p)
>
> // Rational function
> H = N/D
>
> // Partial fractions
> HH = pfss(H)
>
> The result is
>
> HH =
> HH(1)
>
> -8 -5.7428571s -3.9515873s² +0.2960317s³ -0.0946429s⁴ -0.006746s⁵
> -0.0001984s⁶
> ------------------------------------------------------------------------------
>
> 40320 +69264s +48860s² +18424s³ +4025s⁴ +511s⁵ +35s⁶ +s⁷
>
> HH(2)
>
> 0.0001984
> ---------
> 1 +s
>
> The second component in the list is indeed one of the partial
> fractions, but the first one is not an irreductible version.
The pfss() rmax option must be used, and set to a big value, for
instance 1/%eps.
https://help.scilab.org/docs/6.1.0/en_US/pfss.html
Then:
--> D = list2vec(pfss(H,1/%eps))'
D =
-0.8126984 3.3347222 -5.4 4.3402778 -1.7777778 0.3375
-0.0222222 0.0001984
---------- --------- ---- --------- ---------- ------
---------- ---------
8 +s 7 +s 6 +s 5 +s 4 +s 3 +s 2
+s 1 +s
--> clean(sum(D)-H)
ans =
0
-
1
> Computing HH(1) + HH(2) yields H with good approximation.
>
> I guess I could proceed iteratively with HH(1), but it would be nice
> to have a function performing this automatically. I couldn't find such
> a function
In addition, partfrac() is available on FileExchange since 2015 @
https://fileexchange.scilab.org/toolboxes/451000
It manages poles multiplicity. With it, your example (with only simple
poles) gives the following:
--> H = N/D
H =
s⁴
-------------------------------------------------------------------
40320 +109584s +118124s² +67284s³ +22449s⁴ +4536s⁵ +546s⁶ +36s⁷ +s⁸
--> [I, R, F, T] = partfrac(H);
--> I // integer part of the fraction
I =
0.
--> R // Undecomposed remainder of the fraction
R =
s⁴
-------------------------------------------------------------------
40320 +109584s +118124s² +67284s³ +22449s⁴ +4536s⁵ +546s⁶ +36s⁷ +s⁸
--> F // Decomposition: row #1 = numerators ; row #2 = poles value ;
row #3 = poles multiplicity
F =
-0.8126984 3.3347222 -5.4 4.3402778 -1.7777778 0.3375
-0.0222222 0.0001984
-8. -7. -6. -5. -4. -3. -2.
-1.
1. 1. 1. 1. 1. 1. 1. 1.
--> T // Decomposition output as text
T =
" -0.8126984 3.3347222 -5.4 4.3402778 -1.7777778 0.3375
-0.0222222 0.0001984"
"0 + ---------- + --------- + ---- + --------- + ---------- + ------
+ ---------- + ---------"
" 8+%s 7+%s 6+%s 5+%s 4+%s 3+%s
2+%s 1+%s "
--> D = F(1,:)./((%s-F(2,:)).^F(3,:))
D =
-0.8126984 3.3347222 -5.4 4.3402778 -1.7777778 0.3375
-0.0222222 0.0001984
---------- --------- ---- --------- ---------- ------
---------- ---------
8 +s 7 +s 6 +s 5 +s 4 +s 3 +s 2
+s 1 +s
--> clean(R-sum(D))
ans =
0
-
1
Regards
Samuel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.scilab.org/pipermail/users/attachments/20211229/51f5d770/attachment.htm>
More information about the users
mailing list