python实现利用留数定理分解分式多项式
編寫之初
由于利用留數(shù)定理分解分式多項式的計算麻煩,所以決定用python做一個利用留數(shù)定理分解分式多項式程序,實現(xiàn)只要輸入多項式就可以得到各種中間參數(shù)和最終拆分結(jié)果的目的。從本程序可以得到:分解后每項多項式分子值、計算分解后每項多項式分子值的過程展示、最終分解結(jié)果展示。
算數(shù)實現(xiàn)
利用留數(shù)定理分解分式多項式計算過程以下圖為例所示
對于算數(shù)運算形象的理解:以該式為例,分解后各項分母為原多項式分母中的各項(s、(s+2)、(s+3)2)加上這些項中高次冪項去掉次冪為分母的項((s+3));分解后各項分子為原多項式分母依次去掉各項后求極限所得值(-4、1/3、3)以及n(n>1)次冪項去掉該項后的n階微分式求極限所得值(-10/3)。也依據(jù)這個思路編寫程序。
依賴的包
1.sympy模塊
sympy模塊,可以進行符號計算,可以定義符號變量,進行代數(shù)運算,以及微分運算、積分運算等。
2.re正則化模塊
re模塊是python獨有的匹配字符串的模塊,該模塊中提供的很多功能是基于正則表達式實現(xiàn)的。
完整代碼及注釋
import sympy as sp import res = sp.symbols('s') # 創(chuàng)建符號變量print('以 6*(s+1)/(s*(s+2)*(s+3)**2) 形式為例') Y = input('請輸入待分解多項式:') # 復制 例 6*(s+1)/(s*(s+2)*(s+3)**2)# denominator = y.split('/')[0] # 分子項 molecule = Y.split('/')[1] # 分母項moleculelist = molecule.strip('()').split('*') # 分母每項 # print(moleculelist)reg = re.compile(r"(?<=\*)\d+") # 獲取分式中的冪數(shù) match=reg.search(Y) pow = match.group(0)molecule_number = 0 # 初始化分母項索引 # 計算拆分后各項值 while molecule_number < len(moleculelist):try:if moleculelist[molecule_number] != '':if moleculelist[molecule_number + 1] != '':y = Y.replace(moleculelist[molecule_number]+'*', '') # 得到用來計算 該項分子值 的多項式if moleculelist[molecule_number] == 's':value = sp.limit(y, s, 0) # 求極限計算 該項分子值print('\n計算分母為' + str(moleculelist[molecule_number]) +'項的分子:limit——>0 ', y)print('計算得;', value)else:limit_value = -int(re.findall('(\d+)', moleculelist[molecule_number])[0]) # 獲取求極限時的 極限參數(shù)value = sp.limit(y, s, limit_value) # 求極限計算 該項分子值print('計算分母為' + str(moleculelist[molecule_number]) +'項的分子:limit——>' + str(limit_value), y)print('計算得:', value)else:y = Y.replace('*' + moleculelist[molecule_number] + '**' + pow, '') # 得到用來計算 該項分子值 的多項式limit_value = -int(re.findall('(\d+)', moleculelist[molecule_number])[0]) # 獲取求極限時的 極限參數(shù)value = sp.limit(y, s, limit_value) # 求極限計算 該項分子值print('計算分母為' + str(moleculelist[molecule_number]) + '**' + pow + '項的分子:limit——>' + str(limit_value), y)print('計算得:', value)y_diff = sp.together(sp.diff(y, s, int(pow)-1)) # 求解 除n次冪項外分式 n階導數(shù)limit_value = -int(re.findall('(\d+)', moleculelist[molecule_number])[0]) # 獲取求極限時的 極限參數(shù)value = sp.limit(y_diff, s, limit_value) # 求極限計算 該項分子值print('計算分母為' + str(moleculelist[molecule_number]) + '項的'+ str(int(pow)-1) + '階導數(shù)的分子:limit——>' + str(limit_value), y_diff)print('計算得:', value)except: passmolecule_number += 1# print(molecule+'\n'+molecule) print('分解結(jié)果為:',sp.apart(Y, s)) # 拆分結(jié)果運行結(jié)果
運行代碼,首先以例示形式輸入待分解多項式,得到分解過程及結(jié)果
感悟與不足
本來打算純手寫一個留數(shù)定理分解分式多項式的程序,但是由于其中涉及到極限與微分的計算,而這兩個模塊編寫起來又要一定時間,于是借助了sympy模塊輔助編程,但是我意外地發(fā)現(xiàn),sympy模塊居然自帶多項式分解函數(shù) sympy.apart()因此我也在呈現(xiàn)分解結(jié)果時用到了這個函數(shù),免去了字符串處理當中的一系列麻煩。因此如果大家對多項式分解的過程不在意,只想得到分解結(jié)果,只需執(zhí)行sympy.apart()函數(shù)即可,至于它其中的運算原理我也不得而知。
總結(jié)
以上是生活随笔為你收集整理的python实现利用留数定理分解分式多项式的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: db4o java_DB4O 社区版 8
- 下一篇: python脚本厉害吗?使用seleni