繁体   English   中英

如何解决 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=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 详细回答), 如何使用 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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM