scipy.optimize.root返回错误的解决方案

时间:2017-11-23 09:41:41

标签: python scipy equation-solving

我正在尝试解决一个联立方程组,如下所示:

"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。

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

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

1 个答案:

答案 0 :(得分:2)

我能够通过添加

来运行代码
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

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