Scilab Website | Contribute with GitLab | Mailing list archives | ATOMS toolboxes
Scilab Online Help
2023.0.0 - English


partial fraction decomposition


elts = pfss(Sl)
elts = pfss(Sl,rmax)
elts = pfss(Sl,cord)
elts = pfss(Sl,rmax,cord)



A linear dynamical system in state-space, or a transfer function representation (see syslin), or any rational fraction.


A real number controlling the conditioning of block diagonalization (see bdiag).


A character string with possible values 'c' or 'd'.


List of linear systems, or list of rationals: the components of the decomposition.

If Sl is a transfer function or any other rational and has an integer part (degree(Sl.num)>=degree(Sl.den)), elts(1:$-1) are rational components and elts($) is the integer part (polynomial).


Partial fraction decomposition of the linear system Sl.

elts is the list of linear systems which add up to Sl i.e. elts=list(S1,S2,S3,...,Sn) with:

Sl = S1 + S2 +... +Sn.

Each Si contains some poles of S according to the block-diagonalization of the A matrix of S.

For non proper systems, the polynomial part of Sl is returned in elts($).

If Sl is given in transfer form, it is first converted into state-space by tf2ss and each subsystem Si is then converted in transfer form by ss2tf.

The A matrix is of the state-space is put into block diagonal form by function bdiag. The optional parameter rmax is sent to bdiag, rmax should be set to a large number to enforce block-diagonalization.

If the optional flag cord='c' is given the elements in elts are sorted according to the real part (resp. magnitude if cord='d') of the eigenvalues of A matrices.


// With a linear system (state-space):
W = ssrand(1,1,6);
elts = pfss(W);
W1 = 0;
for k = 1:size(elts)
    W1 = W1 + ss2tf(elts(k));
clean(ss2tf(W) - W1)
// With a rational (transfer function or any other one), without integer part:
num = 22801+4406.18*%s + 382.37*%s^2 + 21.02*%s^3;
den = 22952.25 + 4117.77*%s + 490.63*%s^2 + 33.06*%s^3 + %s^4; // degree(den)>degree(num)
h2 = syslin('c',num/den)
d = pfss(h2)

// With a rational with an integer part: degree(num)>=degree(den):
num = 22801+4406.18*%s + 382.37*%s^2 + 21.02*%s^3 + %s^5;
h2 = syslin('c',num/den)
d = pfss(h2)
typeof(d($)) // last component = integer part = polynomial

See also

  • pbig — eigen-projection
  • bdiag — block diagonalization, generalized eigenvectors
  • coffg — Co-factors of a matrix of polynomials or rationals
  • dtsi — Continuous time dynamical systems stable anti-stable decomposition
Report an issue
<< markp2ss Linear System Representation pol2des >>

Copyright (c) 2022-2023 (Dassault Systèmes)
Copyright (c) 2017-2022 (ESI Group)
Copyright (c) 2011-2017 (Scilab Enterprises)
Copyright (c) 1989-2012 (INRIA)
Copyright (c) 1989-2007 (ENPC)
with contributors
Last updated:
Mon Mar 27 11:52:43 GMT 2023