【问题标题】:Scipy Minimize SLSQP simply returns x0Scipy Minimize SLSQP 只返回 x0
【发布时间】:2013-10-10 08:50:54
【问题描述】:

我真的是编程新手,我对整个最小化业务有点不知所措,所以这可能只是一个简单的错误,但是当我尝试在下面运行我的代码时,它只是返回 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

再次,当我运行它时,我只是得到 [1.0, 1.0, 0.0] 的 res.x。有什么想法吗?

谢谢!

【问题讨论】:

    标签: python scipy


    【解决方案1】:

    1 / 2 在没有from __future__ import division 的 Python2 中等于 0,这似乎是导致您的问题的原因。替换为0.51./2 后,我得到了

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

    res.x

    【讨论】:

      猜你喜欢
      • 2019-12-16
      • 1970-01-01
      • 1970-01-01
      • 2019-10-01
      • 2014-10-01
      • 2019-09-01
      • 2020-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多