Fracciones Parciales – Separar con Python

Referencia: Oppenheim 9.4 p671/pdf699. Lathi B5 pdf21, Schaum/HSu 3.8.C p120

Se pueden separar en fraciones parciales del siguiente ejemplo:

H(s) = \frac{2s^2 +5}{s^2 +3s+2}

se requiere obtener los residuos, polos y términos directos al separar en fracciones parciales entre dos polinomios P(s)/Q(s).

\frac{P(s)}{Q(s)} = \frac{ceros(1)}{s - polos(1)}+\frac{ceros(2)}{s - polos(2)}+\text{ ... } \text{ ... }+\frac{ceros(n)}{s - polos(n)}+ganancia(s)

Se puede realizar de dos formas usando Python, en ambas se requiere definir los vectores P y Q.

Sympy – fórmulas simbólicas

La primera usando Sympy para crear las fórmulas simbólicas y luego formar una  fracción, separar las partes Sympy.apart()

Para los datos proporcionados en el ejemplo se tiene como resultado:

P = [2, 0, 5]
Q = [1, 3, 2]

Fracciones parciales:
2 - 13/(s + 2) + 7/(s + 1)

con las instrucciones sympy:

# Expansión en fracciones parciales
# P es numerador, Q es denominador

P = [2, 0, 5]
Q = [1, 3, 2]

import sympy as sym
s = sym.Symbol('s')
n = len(P)
m = len(Q)
Ps = 0
for i in range(0,n,1):
    Ps = Ps + P[i]*s**(n-i)
Qs = 0
for i in range(0,m,1):
    Qs = Qs + Q[i]*s**(m-i)
fraccion = Ps/Qs
parciales = sym.apart(fraccion)

# Salida - polinomio
print('Fracciones parciales:')
print(parciales)

Las fórmulas simbólicas permiten agrupar y realizar operaciones entre varios sistemas además de expandir, separar, y evaluar las expresiones. Util principalmente para la sección de transformadas de Laplace.

Un resumen de sympy se muestra en:

Fórmulas simbólicas – Sympy


Scipy – Procesar señales

La segunda forma es usando libreria scipy.signal.residue con los valores de P y Q:

ceros(n)   :  [-13.   7.]
polos(n)   :  [-2. -1.]
ganancia(s):  [ 2.]
>>>

Con los resultados el equivalente en Laplace es:

transformado al dominio del tiempo,
H(t) = (−13e−2t + 7e−t)u(t) + 2δ(t)

las instrucciones adicionales a la sección anterior son:

# Usando scipy.signal.residue

import scipy.signal as senal
ceros,polos,ganancia = senal.residue(P,Q)

# SALIDA - coeficientes
print()
print('ceros(n)   : ', ceros)
print('polos(n)   : ', polos)
print('ganancia(s): ', ganancia)

Publicado por

Edison Del Rosario

edelros@espol.edu.ec / Profesor del FIEC/FCNM-ESPOL