【问题标题】:Scipy.optimize differential_evolution Index error: tuple index out of rangeScipy.optimize different_evolution 索引错误:元组索引超出范围
【发布时间】:2023-04-10 10:43:02
【问题描述】:

我有一个平滑函数 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 中找到最小值:最小化和差分进化。最小化给了我 -5 的结果,而 difference_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

【问题讨论】:

  • 同时微分_进化方法对初始平滑函数效果很好 - res = different_evolution(f, [1, 30])

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


【解决方案1】:

这是因为 differential_evolutionbounds 参数需要一个 (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

我希望这会有所帮助。

【讨论】:

  • 哇!非常感谢。我花了一个小时弄清楚发生了什么:(
  • 不客气!像这样的事情有时也会让我陷入困境:(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多