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

Can't get real solution with sympy.solve

我尝试 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)]

尽管您对 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,这些结果不满足原始方程,因此被排除在报告的解决方案之外。