Scipy.optimize differential_evolution索引错误:元组索引超出范围

时间:2017-06-03 18:23:51

标签: python numpy scipy linear-algebra differential-evolution

我有一个平滑函数f(x)= sin(x / 5)* exp(x / 10)+ 5 * exp(-x / 2)任务是找到一个非平滑函数的最小值h (x)= int(f(x)),间隔为1到30.换句话说,f(x)的每个值都转换为int类型,函数只取整数值。

我使用2种方法从scipy.optimize中找到最小值:minimize和differential_evolution。最小化给出了 -5 的结果,而differential_evolution给出索引错误:元组索引超出范围 问题是为什么和出了什么问题?

以下是代码:

import math
import numpy as np
from scipy.optimize import minimize
from scipy.optimize import differential_evolution
from scipy.linalg import *
import matplotlib.pyplot as plt

def f(x):
    return np.sin(x / 5.0) * np.exp(x / 10.0) + 5 * np.exp((-x / 2.0))

def h(x):
    return f(x).astype(int)

x = np.arange(1, 30)
y = h(x)

plt.plot(x, y)
plt.show()


#res = minimize(h, 30, method='BFGS')
#print res

res = differential_evolution(h, [1, 30])
print res

1 个答案:

答案 0 :(得分:1)

那是因为bounds的{​​{1}}参数需要一系列(最小,最大)对。鉴于您只有一对x的最小值和最大值,您可以执行以下操作:

differential_evolution

会导致:

res = differential_evolution(h, [(1, 30)])
print res

有关详细信息,请参阅官方文档:https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.optimize.differential_evolution.html

我希望这会有所帮助。