如何求解 Python 中的非线性系统

How to solve a non-linear system in Python

我有三个不同的 3D 方程,我想得到它们之间的交集(系统的解)。我的变量是 x,y,z

方程式:

-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 = 12.580**2

如何求解 python 中的非线性系统?

如果你重写函数:

-0.006683 x**2 - 0.06893 x + 56.73- z = 0
0.002538 y**2 - 1.115 y + 56.73 - z = 0
(x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2 = 0

这有点帮助。

你有三个方程和三个未知数。

蛮力法是遍历 x、y 和 z 值(在 x、y 和 z 的某个域上),并查看所有方程式接近零的程度。

fa = -0.006683 x**2 - 0.06893 x + 56.73- z
fb = 0.002538 y**2 - 1.115 y + 56.73 - z
fc = (x-24.680)**2+(y-238.341)**2+(z+13.971)**2 - 12.580**2

使用 'cost function',例如 cost=fa * fa + fb * fb + fc * fc ,并寻找最小值。

还有其他方法,比如Nelder-Mead法,可以使用,而且效率更高。 https://en.wikipedia.org/wiki/Nelder%E2%80%93Mead_method

找到最小值后,您可以使用原始搜索范围,并根据您需要的精度将其缩小。

@warped 提供了一个更好、更 Pythonic 的解决方案,但是,总是存在 没有 解决方案或多个解决方案的可能性。顺便说一句,这是几何问题吗?最后一个方程看起来像一个球体方程。

from scipy.optimize import fsolve
import math

def equations(p):
    x, y, z = p
    return (-0.006683 * x*x - 0.06893 * x + 56.73- z, \
            0.002538 * y*y - 1.115 * y + 56.73 - z, \
          (x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2)

x, y, z =  fsolve(equations, (1,1,1))

print (equations((x,y,z)))

print(x,y,z)

使用 SymPy 在这个问题中提到的方法(@Oscar Benjamin 详细回答),How to solve a pair of nonlinear equations using Python?

您可以通过其他方式找到其他解决方案。但是,这种方法没有找到任何解决方案,至少我第一次尝试时是这样。

from sympy import *

x, y, z = symbols('x, y, z')
eq1 = Eq(-0.006683 * x * x - 0.06893 * x + 56.73- z, 0)
eq2 = Eq(0.002538 * y * y - 1.115 * y + 56.73 - z, 0)
eq3 = Eq((x-24.680)**2+(y-238.341)**2+(z+13.971)**2-12.580**2, 0)

sol = solve([eq1, eq2, eq3], [x, y,z])


print(sol)
print("")
if(len(sol)>1):
    soln = [tuple(v.evalf() for v in s) for s in sol]
    for idx, each in enumerate(soln):
        print(idx,each)