Scipy.optimize differential_evolution Index error: tuple index out of range
Scipy.optimize differential_evolution Index error: tuple index out of range
我有一个平滑函数 f(x) = sin(x / 5) * exp(x / 10) + 5 * exp(-x / 2) 任务是找到一个非平滑函数的最小值function h(x) = int(f(x)) 在1到30的区间上。换句话说,f(x)的每个值都被转换为int类型,函数只取整数值。
我正在使用 2 种方法从 scipy.optimize 中找到最小值:最小化和 differential_evolution。最小化给出了 -5 的结果,而 differential_evolution 给出了 Index error: tuple index out of range
问题是为什么以及出了什么问题?
代码如下:
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
那是因为 differential_evolution
的 bounds
参数需要一个 (min, max) 对序列。鉴于您只有一对 x 的最小值和最大值,您可以执行以下操作:
res = differential_evolution(h, [(1, 30)])
print res
这将导致:
fun: -11.0
message: 'Optimization terminated successfully.'
nfev: 92
nit: 5
success: True
x: array([ 25.76747524])
更多信息请查看官方文档:https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.optimize.differential_evolution.html
希望对您有所帮助。
我有一个平滑函数 f(x) = sin(x / 5) * exp(x / 10) + 5 * exp(-x / 2) 任务是找到一个非平滑函数的最小值function h(x) = int(f(x)) 在1到30的区间上。换句话说,f(x)的每个值都被转换为int类型,函数只取整数值。
我正在使用 2 种方法从 scipy.optimize 中找到最小值:最小化和 differential_evolution。最小化给出了 -5 的结果,而 differential_evolution 给出了 Index error: tuple index out of range 问题是为什么以及出了什么问题?
代码如下:
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
那是因为 differential_evolution
的 bounds
参数需要一个 (min, max) 对序列。鉴于您只有一对 x 的最小值和最大值,您可以执行以下操作:
res = differential_evolution(h, [(1, 30)])
print res
这将导致:
fun: -11.0
message: 'Optimization terminated successfully.'
nfev: 92
nit: 5
success: True
x: array([ 25.76747524])
更多信息请查看官方文档:https://docs.scipy.org/doc/scipy-0.19.0/reference/generated/scipy.optimize.differential_evolution.html
希望对您有所帮助。