gpt4 book ai didi

python - 使用sympy进行符号数学,代码永远运行

转载 作者:行者123 更新时间:2023-12-04 13:44:29 26 4
gpt4 key购买 nike

我正在尝试求解 x 和 y 的联立方程,但没有得到任何结果(代码一直在运行)。我觉得错误与在方程中使用 sqrt 有关,但不确定。有人可以帮我解决这个问题吗?

from __future__ import division
from sympy import Symbol,sqrt,solve
x = Symbol('x')
y = Symbol('y')
z = Symbol('z')
a = Symbol('a')
b = Symbol('b')
c = Symbol('c')
d = Symbol('d')
e = Symbol('e')
f = Symbol('f')
g = Symbol('g')
h = Symbol('h')
print (solve((sqrt((c-a)**2+(d-b)**2)+sqrt((x-c)**2+(y-d)**2)-2*sqrt((x-a)**2+(y-b)**2),(y-b)*(e-a)-(x-a)*(f-b)) ,x,y))

最佳答案

这是一个(另一个)问题,您必须依赖 CAS 的 A 并让 SymPy 帮助您,而不是依赖 SymPy(在当前状态下)来完成所有工作。以下假设eqs是您在 OP 中给出的要求解的两个方程的列表。
请注意,第二个方程在两个符号中都是线性的。求解 y并代入第一个方程。

>>> yis = solve(eqs[1], y)[0]
>>> eq0 = eqs[0].subs(y,yis)
这给出了一个包含很多符号的表达式,这会减慢速度。它也有两个术语 sqrt依赖于 x .替换 sqrt 的那些参数使用虚拟符号,然后 unrad以多项式形式得到它的表达式,恢复替换和因子:
>>> from sympy.solvers.solvers import unrad, S
>>> reps = {i.base:Dummy() for i in eq0.atoms(Pow) if i.has(x) and i.exp==S.Half}
>>> ireps = {v:k for k,v in reps.items()}
>>> poly = unrad(eq0.xreplace(reps), *reps.values())[0].xreplace(ireps).factor()
使用 factor始终使用是一个昂贵的过程,但如果您知道没有它,问题将需要很长时间,那么值得一试。在这种情况下,四次方程简化为易于求解且不需要检查或简化的二次方程的乘积:
>>> xis = solve(poly, x)
x的三种解决方案并且这些中的每一个都可以代入 y 的表达式中得到三个解。解决方案足够大,因此未在此处显示。
>>> count_ops(xis)
386

关于python - 使用sympy进行符号数学,代码永远运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51407938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com