亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何用 Python 重新排列一個復雜的方程

如何用 Python 重新排列一個復雜的方程

揚帆大魚 2022-10-06 16:52:00
我想r使用 Python 重新排列變量的以下等式。P = C * ((1-(1+r)**(-n)))/r + fv*(1+r)**(-n)tor = blabla...我知道 sympy 與這樣的重新安排任務有關。所以,我寫了下面的代碼。# Solve the equation for rimport sympyfrom sympy import symbolsP, C, r, n, fv = sympy.symbols('P C r n fv')eq = sympy.Eq(P, C * ((1-1/(1+r)**n))/r + fv/(1+r)**n)sympy.solve(eq, r)但是,我得到了這樣的錯誤。NotImplementedError                       Traceback (most recent call last)<ipython-input-47-a183add313da> in <module>      3 P, C, r, n, fv = sympy.symbols('P C r n fv')      4 eq = sympy.Eq(P, C * ((1-1/(1+r)**n))/r + fv/(1+r)**n)----> 5 sympy.solve(eq, r)~\Anaconda3\lib\site-packages\sympy\solvers\solvers.py in solve(f, *symbols, **flags)   1169     ###########################################################################   1170     if bare_f:-> 1171         solution = _solve(f[0], *symbols, **flags)   1172     else:   1173         solution = _solve_system(f, symbols, **flags)~\Anaconda3\lib\site-packages\sympy\solvers\solvers.py in _solve(f, *symbols, **flags)   1740    1741     if result is False:-> 1742         raise NotImplementedError('\n'.join([msg, not_impl_msg % f]))   1743    1744     if flags.get('simplify', True):NotImplementedError: multiple generators [r, (r + 1)**n]No algorithms are implemented to solve equation -C*(1 - (r + 1)**(-n))/r + P - fv*(r + 1)**(-n)我猜想 sympy 無法計算功率。你知道如何對方程執行這種復雜的重排嗎?我正在使用 Python==3.7,sympy==1.4。
查看完整描述

2 回答

?
米脂

TA貢獻1836條經驗 獲得超3個贊

這不是一個簡單的方程來解決。它與功率計算無關,只是方程太復雜,sympy 無法求解 r。


但是,如果其他變量有特定值并且您需要求解 r(即為非平凡方程找到零),則可以使用數值求解器:nsolve


# Solve the equation for r

from sympy import var, Eq, solve


var('C, r, n, fv, P', positive = True)


# this throws an error: no algorithms are implemented to solve equation

equation = Eq(P, C * ((1-1/(1+r)**n))/r + fv/(1+r)**n)


# a simple calculation for power works fine

equation = Eq(P, (1+r)**n)

solve(equation, r)


查看完整回答
反對 回復 2022-10-06
?
慕標5832272

TA貢獻1966條經驗 獲得超4個贊

您要解決的方程式是:


In [23]: eq                                                                                                                       

Out[23]: 

      ?           -n?               

    C??1 - (r + 1)  ?             -n

P = ───────────────── + fv?(r + 1)  

            r 

我們可以將它重新排列成這樣的多項式


In [24]: eq2 = Eq(eq.lhs * (1+r)**n * r, eq.rhs * (1+r)**n * r).expand()                                                          


In [25]: eq2                                                                                                                      

Out[25]: 

           n            n           

P?r?(r + 1)  = C?(r + 1)  - C + fv?r

現在我們看到這是一個多項式,只是指數n是符號的。一般來說,這種方程不會有一個可以用封閉形式表達的解——這就是為什么 sympy 沒有針對這種特殊情況的算法(它不是 sympy 本身的限制)。


可以對這個方程進行數值求解,但只有當我們對每個參數都有數值時,數值求解才有效。如果我們用數字代替參數,那么nsolve可以用數字找到解決方案:


In [26]: eq3 = eq.subs({P:1, C:2, fv:1, n:100})                                                                                   


In [27]: eq3                                                                                                                      

Out[27]: 

                   ?        1     ?

                 2??1 - ──────────?

                   ?           100?

        1          ?    (r + 1)   ?

1 = ────────── + ──────────────────

           100           r         

    (r + 1)                        


In [28]: nsolve(eq3, r, 1)                                                                                                        

Out[28]: 2.00000000000000

但請注意,此方程的解不是唯一的,例如 -2 也是這里的解:


In [52]: nsolve(eq3, r, -1.9)                                                                                                     

Out[52]: -2.00000000000000

這個特殊的方程有大約 100 個根,但不一定都是實數。


查看完整回答
反對 回復 2022-10-06
  • 2 回答
  • 0 關注
  • 193 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號