我对编程真的很陌生,我对整个最小化业务有点不知所措,所以这可能只是一个简单的错误,但是当我尝试在下面运行我的代码时,它只是返回我输入的 x0 值在开始。
我正在尝试做的事情:我有两个由点 f(x) 和 h(x) 组成的“函数”。f(X) 可以认为是一条测量曲线,h(x) 是一条参考曲线。我正在尝试使用最小二乘法来找到最适合测量结果的参考曲线的水平位移、x 比例和 y 比例项。
我正在使用 interpolate 函数将样条曲线拟合到参考数据,因此样条曲线可用于沿曲线查找中间值。
这是我的代码:
import numpy
from scipy import optimize
from scipy import interpolate
def f(x):
vals = {1: 0.35, 17: 0.45, 33: 0.67, 49: 0.8, 65: 0.73, 81: 0.65, 97: 0.51, 113: 0.27, 129: 0.01, 145: -0.1,
161: -0.19, 177: -0.21, 193: -0.2, 209: -0.23, 225: -0.24, 241: -0.25, 257: -0.23, 273: -0.26, 289: -0.28,
305: -0.22, 321: -0.24, 337: -0.12, 353: 0.14}
return vals[x]
def h(x):
vals = {1: -0.2, 17: -0.2, 33: -0.2, 49: -0.2, 65: -0.2, 81: -0.2, 97: -0.2, 113: -0.2, 129: -0.1, 145: 0.1,
161: 0.32, 177: 0.4, 193: 0.7, 209: 0.81, 225: 0.7, 241: 0.6, 257: 0.5, 273: 0.3, 289: 0, 305: -0.1,
321: -0.2, 337: -0.2, 353: -0.2}
return vals[x]
x1 = []
y1 = []
for i in range(1, 365, 16):
x1.append(i)
y1.append(h(i))
tck = interpolate.splrep(x1, y1)
fun = lambda x: ((1 / 22.8125 * numpy.sum(
(f(i) - (x[0] * interpolate.splev((x[1] * (i + x[2]) + 0.5), tck)) - 0.5) ** 2 for i in range(1, 365, 16))) ** (
1 / 2))
bnds = ((0.3, 1.5), (0.3, 1.5), (0, 150))
res = optimize.minimize(fun, (1, 1, 0), method='SLSQP', bounds=bnds)
print res.x
同样,当我运行它时,我只是得到 res.x 的 [1.0, 1.0, 0.0]。有什么想法吗?
谢谢!