【发布时间】:2022-01-15 05:34:20
【问题描述】:
我正在尝试使用 scipy.minimize 解决一组方程,但是我没有得到令人满意的结果,所以也许我弄错了。 我想求解以下方程组。
12.25 * (x + y * 2.2 + z * 4.84) - 8.17437483750257 = 0
12.25 * (x + y * 3.1 + z * 9.61) - 21.9317236606432 = 0
12.25 * (x + y * 4 + z * 16) - 107.574834524443 = 0
使用 Wolfram Alpha 我得到答案
x=22.626570068753, y=-17.950683342597, z=3.6223614029055
这确实解决了方程组,给出的残差为
9.407585821463726e-12
现在我使用 scipy.minimize:
import numpy as np
from scipy.optimize import fsolve
from scipy.optimize import minimize
def my_func(p):
points = [8.17437483750257, 21.9317236606432, 107.574834524443]
h1 = abs(12.25 * (p[0] + p[1] * 2.2 + p[2] * 4.84) - points[0])
h2 = abs(12.25 * (p[0] + p[1] * 3.1 + p[2] * 9.61) - points[1])
h3 = abs(12.25 * (p[0] + p[1] * 4 + p[2] * 16) - points[2])
return h1 + h2 + h3
ini = np.array([22, -15, 5]) # Initial points close to solution
res = minimize(my_func, ini)
print(res)
fun: 1.4196640741924451
hess_inv: array([[ 20.79329103, -14.63447889, 2.36145776],
[-14.63447889, 10.30037625, -1.66214485],
[ 2.36145776, -1.66214485, 0.26822135]])
jac: array([ 12.25 , 60.02499545, 254.43249989])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 261
nit: 8
njev: 64
status: 2
success: False
x: array([ 21.39197235, -17.08623345, 3.48344393])
首先,它说success=False,其次它找到不是最优的解决方案。
为什么初始值接近最优解却无法找到这些解。
优化器的定义有问题吗?
尝试运行它并给出 [0,0,0] 的初始值,但结果很糟糕
ini = np.array([0, 0, 0]) # Initial points close to solution
res = minimize(my_func, ini)
print(res)
fun: 73.66496363902732
hess_inv: array([[ 0.98461683, -0.04223651, -0.1207056 ],
[-0.04223651, 0.88596592, -0.31885642],
[-0.1207056 , -0.31885642, 0.13448927]])
jac: array([ 12.25 , 15.92499924, -18.98750019])
message: 'Desired error not necessarily achieved due to precision loss.'
nfev: 164
nit: 1
njev: 40
status: 2
success: False
x: array([0.02901304, 0.08994042, 0.29448233])
注意:我不想使用fsolve 来查找解决方案,而是使用minimize。
原因是我的真正问题涉及到的方程多于未知数,所以最后我想要一个能够最大限度地减少所有这些方程的误差的解决方案。
然而,由于它没有给出好的结果,我想首先测试一个存在精确解决方案的简单问题。但即使在这种情况下,它也不起作用。
一旦我使它适用于这个问题,我将扩展它添加更多方程。
【问题讨论】:
-
你的系统是线性的,为什么要使用非线性优化方法而不是仅仅使用线性代数解决它???
-
我编辑了这个问题。最后,我想要一个用于方程多于未知数的系统的优化器。系统仍然是线性的,但解决方案不会是精确的,它只是一个最小的误差。我怎样才能得到一个线性最小化器来解决这个问题?
-
这听起来像是矩的广义方法。将差异平方而不是使用绝对值有帮助吗?例如。
h1 =(12.25 * (p[0] + p[1] * 2.2 + p[2] * 4.84) - points[0])**2 -
@ForceBru。是的!我改变了平方的总和,它给出了确切的结果。谢谢。如果你把它作为答案,我会接受它
-
@SembeiNorimaki 如果你的方程比未知数多,但系统仍然是线性的,那么它仍然可以使用线性代数求解,解决方案是使用线性最小二乘法,如 f.ex . numpy.linalg.lstsq
标签: python scipy scipy-optimize-minimize