【控制系統1–2】利用SymPy作部分分式運算

Len Hou
4 min readMay 27, 2019

--

本文是為了紀錄如何使用Python函式庫SymPy作部分分式的運算

Photo by Plush Design Studio on Unsplash

什麼是部分分式?

部分分式(partial fraction)通常是用來計算反拉氏轉換時會用到計算技巧,例如假設有一個s域函數F(s)如下:

經過「部份分式」運算之後會變成,

以利於作後續的反拉氏轉換。

所以部份分式的主要課題就是如何把A和B計算出來

在說明如何計算之前,我們先來看看怎麼樣的函數可以作部份分式。

同樣假設有一個F(s)函數

其中,N(s)和D(s)代表s域的多項式(註:分子的英文是numerator,所以開頭以N代表;而分母的英文是denominator,開頭就以D代表)。

如果N(s)的次數小於D(s)的次數,稱F(s)為嚴格真分有理函數。能夠作部份分式的函數必須為嚴格真分有理函數。

但總是會遇到函數不是上述的情況,如果是N(s)的次數大於或等於D(s)的話,通常可以用長除法解決。

例如下面函數:

其中,N(s)次數為3(因為第一項s3為3次方)、D(s)次數為2(因為第一項s2為2次方),F(s)就不是嚴格真分有理函數。

用手計算的方法

我們回來看看上面的例子:

1. 解聯立方程式:

上式通分後:

然後,因為

所以解聯立方程式得到:A=-1、B=2

2. 代入根算法:

大概一般人都不會用上面慢的算法,會是用代入根的方式來求解:

求A的時候,s帶入-2:

求B的時候,s帶入-3:

用SymPy計算的方法

看過了如何用手計算的方法後,比上面的例子複雜的情況很多(例如重根、共軛複根等),利用代入根算法並搭配解聯立方程式求解,已經可以解出大部分教科書的習題。

運用Python的SymPy函式庫,除了解習題時作驗算以外,比習題更加複雜的情況,都可以使用電腦幫忙求解。

還沒安裝Python或者SymPy的朋友,可以看一下此篇文章,先做好準備。

安裝好的朋友,可直接打開終端機,輸入python後開始進行:

先匯入sympy模組:

>>> from sympy import *

再來定義代數s:

>>> from sympy.abc import s

輸入上面的簡單例子:

>>> f = (s+1)/((s+2)*(s+3))

在SymPy內,部分分式的方法叫做apart(),利用該方法即可求解:

>>> apart(f)

得出答案為:

>>> 2/(s + 3) — 1/(s + 2)

單根的情況看完了,我們來試試重根和共軛複根的情況:

>>> f = (s+5)/((s+2)**2*(s**2+4*s+5))

f看起來有點複雜,也可以用下列指令讓函數看起來比較舒服一點:

>>> init_printing(use_unicode=True)

確認輸入沒錯之後,求部分分式:

>>> apart(f)-(s + 5)/(s**2 + 4*s + 5) + 1/(s + 2) + 3/(s + 2)**2

這邊先簡單的說明到此為止,如果意猶未盡,可以看一下SymPy官方教學文件(https://docs.sympy.org/latest/tutorial/simplification.html),除了說明部分分式以外,還有因式分解、三角函數簡化等等的強大功能,很值得參考研究哦。

--

--

Len Hou

I am a PhD student in Taiwan studying control system, offshore wind energy and mechatronics. Here is the place for sharing my learning notes.