我正在尝试解决一个联立方程组,如下所示:
"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。
程序返回的答案满足最终方程,但违反了所有其他方法。
有谁知道为什么会这样?获得这些方程式(以及其他许多方程式)的正确解决方案对我目前的项目至关重要。
答案 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
。
至于为什么这样做,非线性系统很难像这样解决。大多数算法倾向于根据起点确定性地找到解决方案。如果您需要尝试多个起点,请尝试基于网格的搜索。