在计算空间位置距离的时候,有时会涉及到三元方程组的求解,这个时候可以使用 scipy 中的 fsolve 函数。
例如,我们知道有个点 (x, y, z) 到 (0,0,0) 的距离为 1,到 (1.414,0,0) 的距离为 1,到 (1.414,1.414,1) 的距离为 1.414。那么使用方程组表达就是:
from scipy.optimize import fsolveimport 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]。可以自行尝试一下。这是因为非线性方程组通常有多个近似解,对初始值比较敏感,所以设置初始值要小心。