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

如何在Python中求解非线性系统,python,equation-solving,nonlinear-functions,Python,Equation Solving,Nonlinear Functions,我有三个不同的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-

我有三个不同的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,并寻找最小值

还有其他方法,如内尔德-米德法,可以使用,而且效率更高

一旦你找到一个最小值,你就可以根据你需要的准确度,选择你原来的搜索范围,并使其更精细

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

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详细回答)

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

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)

从分析角度还是从数字角度?这能回答你的问题吗@翘曲有一个更好的解决方案。是的,这是一个几何问题!正如你所指出的,最后一个方程是球面方程。我要试试你建议的不同的东西。谢谢注意,在发布内容中搜索的初始条件是(1,1,1);使用不同的初始搜索参数(如(100100))可以得到不同的答案。检查参考资料:!有什么方法可以让我得到系统的所有解决方案吗?啊,那是另一个问题。解决这个问题的一种方法是对初始条件使用不同的起点。由于您在x-y-z坐标系中工作,因此可以尝试8个极端(立方体的点,例如,(100010001000),(10001000,-1000)等)以及(0,0,0)。这不会告诉您所有信息,但可能只是一个开始。例如,二维圆与二维抛物线的交点可能会得到0、1、2、3或4个解决方案。这在很大程度上取决于问题的详细信息。请注意中的答案;Symphy可以提供多个解决方案。