【发布时间】:2021-02-27 21:28:41
【问题描述】:
我尝试在 SymPy 中以 2 种不同形式求解一个方程,但存在错误和无限循环。这是在 Python 3.8.8 和 SymPy 1.7.1 上,在两个设备上的结果相同。相比之下,Mathematica 在一秒钟内解决了这两个问题。
方程式
from sympy import *
x,xh,xhh,p,q,r = symbols('x xh xhh p q r')
eq1 = ((2*q**2-2*r**2)/(-q - r + xh) - 2*q - 2*r + x + xhh
+ sqrt(4*p*x + 4*p*xh + 4*q**2 + x**2 + 2*x*xh + xh**2)
+ sqrt(4*p*xh + 4*q**2 + xh**2 + xhh**2 + 2*xhh*(2*p + xh))
)
eq2 = (4*q**2 + 4*q*r - q*x - 2*q*xh - r*x - 2*r*xh + x*xh + xhh*(-q - r + xh)
+ (-q - r + xh)*sqrt(4*p*xh + 4*q**2 + xh**2 + xhh**2 + 2*xhh*(2*p + xh))
+ (-q - r + xh)*sqrt(4*p*x + 4*p*xh + 4*q**2 + x**2 + 2*x*xh + xh**2)
)
A,C,D,F,G,H = symbols('A C D F G H')
eq3 = A + xhh + C/D + sqrt(F) + sqrt(G + H*xhh + xhh**2)
解决尝试
解决第一种形式solve(eq1,xhh)返回错误
Traceback (most recent call last):
File "<ipython-input-24-9923c6f02abd>", line 1, in <module>
solve(eq1,xhh)
File "/Users/jacobrichardson/anaconda/envs/env_sympy/lib/python3.8/site-packages/sympy/solvers/solvers.py", line 1097, in solve
solution = _solve(f[0], *symbols, **flags)
File "/Users/jacobrichardson/anaconda/envs/env_sympy/lib/python3.8/site-packages/sympy/solvers/solvers.py", line 1460, in _solve
gen = f_num.match(D.xreplace({d: w}))[w]
TypeError: 'NoneType' object is not subscriptable
解决第二个solve(eq2,xhh) 运行了一个多小时,但在我的两台设备上都没有完成!
确实在我的手动帮助下,第三种形式解决了solve(eq3,xhh)
[(-A**2*D**2 - 2*A*C*D - 2*A*D**2*sqrt(F) - C**2 - 2*C*D*sqrt(F) - D**2*F + D**2*G)/(D*(2*A*D + 2*C + 2*D*sqrt(F) - D*H))]
有什么方法可以让 SymPy 像 Mathematica Solve[eq1,xhh] 和 Solve[eq2,xhh] 一样轻松方便地求解 eq1 和 eq2 等方程?
等价方程
print(simplify(eq1 * (-q - r + xh) - eq2)) # "0" equations 1 and 2 equivalent up to one singularity
print(simplify(eq1 -
eq3.subs([(A,-2*q - 2*r + x),(C,2*q**2 - 2*r**2),(D,-q - r + xh),
(F,4*p*x + 4*p*xh + 4*q**2 + x**2 + 2*x*xh + xh**2),
(G,4*p*xh + 4*q**2 + xh**2),(H,2*(2*p + xh))]))) # "0" equations 1 and 3 equivalent
【问题讨论】:
标签: python wolfram-mathematica sympy