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
。
至于为什么会这样,好吧,非线性系统很难这样解决。大多数算法倾向于根据起点确定性地找到解决方案。如果您需要尝试多个起点,请尝试基于网格的搜索。
我正在尝试求解如下联立方程组:
"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
。
至于为什么会这样,好吧,非线性系统很难这样解决。大多数算法倾向于根据起点确定性地找到解决方案。如果您需要尝试多个起点,请尝试基于网格的搜索。