在计算空间位置距离的时候,有时会涉及到三元方程组的求解,这个时候可以使用 scipy 中的 fsolve 函数。

例如,我们知道有个点 (x, y, z) 到 (0,0,0) 的距离为 1,到 (1.414,0,0) 的距离为 1,到 (1.414,1.414,1) 的距离为 1.414。那么使用方程组表达就是:

$$ \begin{align} &(x)^2+(y)^2+(z)^2 = 1\\\\ &(x-1.414)^2 +(y)^2+(z)^2 = 1\\\\ &(x-1.414)^2 + (y-1.414)^2 + (z-1)^2 = 2 \end{align} $$

from scipy.optimize import fsolve
import numpy as np
# https://blog.csdn.net/weixin_41140174/article/details/108993828

def func(i):
    x, y, z = i[0], i[1], i[2]
    res = [
        x**2 + y**2 + z**2 - 1,  # 保持这个值为0
        (x-1.414)**2 + y**2 + z**2 -1,
        (x-1.414)**2 + (y-1.414)**2 + (z-1)**2 - 2,
    ]
    return res

init_guess = [0.5, 0.5, 0]  
# 猜测的初始估计值,不要偏离真实值太大就行

r = fsolve(func, init_guess)
# 打印结果
print(r)

# 检验结果
print(np.isclose(func(r), [0, 0, 0]))
# isclose中还可以设置 tolerance 参数如 1e-3,表示相对差值不超过 0.001

结果是应当是 [0.707, 0.707, 0],输出是浮点值,但数值跟这个标准答案应该非常接近。

但如果修改初始值为 [0.5, 0.5, 0.5],则会得出另外一个结果,给出的点是 [0.707, 0.235, 0.667]。可以自行尝试一下。这是因为非线性方程组通常有多个近似解,对初始值比较敏感,所以设置初始值要小心。

最后修改:2024 年 09 月 28 日
请大力赞赏以支持本站持续运行!