使用sympy.solve无法获得真正的解决方案

时间:2015-01-15 04:48:02

标签: python sympy nonlinear-functions

我尝试用sympy.solve解决非线性方程组。它给了我一个复杂的解决方案集。 然后我在matlab中尝试了这个方程式系统,得到了一个我认为正确的实际解决方案集,因为这实际上是一个几何问题,我在CAD软件中测试了这个解决方案。

那么......为什么sympy.solve给了我一个复杂的解决方案集?在哪里我犯了错误......或错误?

这是我写的代码:

import sympy
x1=0
y1=-620
r1=920
zqua=126
yqua=276
x3=51
rm=205
r3=104

x0 = sympy.Symbol('x0')
y0 = sympy.Symbol('y0')
r0 = sympy.Symbol('r0')

f1=r0+((x0-x1)**2+(y0-y1)**2)**0.5-r1
f2=(zqua-x0)**2+(yqua-y0)**2-r0**2
f3=r0+((x0-x3)**2+(y0-rm)**2)**0.5-r3

A=sympy.solve((f1,f2,f3), (x0, y0, r0))
print A

这是它给出的解决方案:

[(132.229058631742 - 3.4301208813066*I, 282.298802365236 + 1.7767794177989*I, -8.07109966646592 + 1.26065122532955*I), (132.229058631742 + 3.4301208813066*I, 282.298802365236 - 1.7767794177989*I, -8.07109966646592 - 1.26065122532955*I)]

1 个答案:

答案 0 :(得分:3)

虽然你对f1和f3中r的差异有正确的标志,但如果你用f2中已经完成的正方形(符号不再重要)写的话,你会获得2个真正的答案:

>>> f1=(x0-x1)**2+(y0-y1)**2-(r0 - r1)**2
>>> f2=(zqua-x0)**2+(yqua-y0)**2-r0**2
>>> f3=(x0-x3)**2+(y0-rm)**2-(r3 - r0)**2
>>>
>>> A=sympy.solve((f1,f2,f3), (x0, y0, r0))
>>> [[i.n(2) for i in w] for w in A]
[[73., 2.2e+2, 79.], [88., 2.5e+2, 48.]]
>>>

SymPy应该已经找到了其他表示的根,但它选择了-79和-48,而这些结果不符合原始方程,因此从报告的解决方案中排除。

相关问题