簡體   English   中英

為什么SymPy無法解決具有復雜系數的二次方程

[英]Why SymPy can't solve quadratic equation with complicated coefficients

SymPy可以輕松地以短簡單系數求解二次方程。 例如:

from pprint import pprint
from sympy import *
x,b,f,Lb,z = symbols('x b f Lb z')
eq31 = Eq((x*b + f)**2, 4*Lb**2*z**2*(1 - x**2))
pprint(eq31)
sol = solve(eq31, x)
pprint(sol)

但是系數稍大-它不能:

from pprint import pprint
from sympy import *
c3,b,f,Lb,z = symbols('c3 b f Lb z')
phi,Lf,r = symbols('phi Lf r')
eq23 = Eq(
    (
        c3 * (2*Lb*b - 2*Lb*f + 2*Lb*r*cos(phi + pi/6))
        + (Lb**2 - Lf**2 + b**2 - 2*b*f + 2*b*r*cos(phi + pi/6) + f**2 - 2*f*r*cos(phi + pi/6) + r**2 + z**2)
    )**2,
    4*Lb**2*z**2*(1 - c3**2)
    )
pprint(eq23)
print("\n\nSolve (23) for c3:")
solutions_23 = solve(eq23, c3)
pprint(solutions_23)

為什么?

這不是特定於Sympy的-像Maple或Mathematica之類的其他程序也遇到相同的問題:在求解方程式時, solve需要基於對變量和方程式結構的假設來選擇適當的求解策略(例如,參見Sympy的Solvers )。 。 這些選擇通常是啟發式的,通常是不正確的(因此,沒有解決方案,或者首先嘗試了錯誤的策略)。 此外,變量的假設通常是廣義的(例如,復雜而不是實數)。

因此,對於復雜的方程,求解策略通常必須由用戶給出。 例如,您可以使用:

sol23 = roots(eq23.lhs - eq23.rhs, c3)

由於支持符號解決方案,因此您可以做的一件事是求解通用二次方並替換您的特定系數:

>>> eq = eq23.lhs-eq23.rhs
>>> a,b,c = Poly(eq,c3).all_coeffs()
>>> var('A:C')
(A, B, C)
>>> ans=[i.xreplace({A:a,B:b,C:c}) for i in solve(A*x**2 + B*x + C,x)]
>>> print filldedent(ans)
...

但是,如果您只是簡化和檢查,則可以得到相同的結果:

>>> ans=solve(eq23,c3,simplify=False,check=False)

(這些是解決呼叫的真正昂貴的部分。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM