scipy.optimize.root 返回不正确的解决方案

scipy.optimize.root returning incorrect solution

我正在尝试求解如下联立方程组:

"145.0x/21025 = -0.334" 
"(-48.402x-96.650y+96.650z)/21025 = -0.334" 
"(-48.402x+132.070y+35.214z)/21025 = -0.334" 
"sqrt(x^2+y^2+z^2) = 145.0"

我正在使用以下 Python 脚本:

from scipy.optimize import root
from numpy import sqrt
from sys import argv, stdout

initGuesses = eval(argv[1])
equations = argv[2:]

def f(variables):
    x,y,z = variables
    results = []
    for eqn in equations:
        results.append(eval(eqn))
    return results

solution = root(f, initGuesses, method="lm")
stdout.write(str(solution["x"][0]) + "," + str(solution["x"][1]) + "," + str(solution["x"][2]))
stdout.flush()

程序调用如下:

python3 SolvePosition3D.py "(1,1,1)" "(145.0*x+0.0*y+0.0*z)/21025.0+0.334" "(-48.402*x-96.650*y+96.650*z)/21025+0.334" "(-48.402*x+132.070*y+35.214*z)/21025+0.334" "sqrt(x**2+y**2+z**2)-145.0"

我收到以下输出:

48.2699997956,35.4758788666,132.042180583

这个方案是错误的;正确的解大概是

-48,-35,-132

这是相同的数字,但 * -1。

程序返回的答案满足最终方程,但违反了所有其他方程。

有人知道为什么会这样吗?获得这些方程(以及许多其他类似方程)的正确解对我当前的项目至关重要。

我能够通过添加

运行 代码
from numpy import sqrt
from scipy.optimize import root

并切换到常规的旧照片作为解决方案。

你开始的猜测似乎是错误的。如您所说,从 (1, 1, 1) 开始,寻根器收敛到 48.2699997956,35.4758788666,132.042180583。如果您插入 (-1,-1,-1),您将得到预期的 -48.2649482763,-35.4698607274,-132.050694891

至于为什么会这样,好吧,非线性系统很难这样解决。大多数算法倾向于根据起点确定性地找到解决方案。如果您需要尝试多个起点,请尝试基于网格的搜索。