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