Scipy最小化SLSQP只返回x0

时间:2013-10-10 00:39:42

标签: python scipy

我对编程非常陌生,而且我对这个整体最小化的业务有点了解,所以这可能只是一个简单的错误,但是当我尝试运行下面的代码时,它只返回x0值我投入了开始。

我正在尝试做什么: 我有两个由点f(x)和h(x)组成的“函数”。 f(X)可以被认为是测量曲线,h(x)是参考曲线。我正在尝试使用最小二乘法来找到最适合参考曲线的测量结果的水平位移,x刻度和y刻度项。

我使用插值函数将样条拟合到参考数据,因此样条曲线可用于沿曲线找到中间值。

这是我的代码:

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

同样,当我运行这个时,我只需要获得[1.0,1.0,0.0] res.x.有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

没有1 / 2的Python2中的

from __future__ import division等于0,这似乎是造成问题的原因。用0.51./2替换后,我得到了

[  3.00000000e-01   1.14967789e+00   7.48854782e-04]

代表res.x