用Python的scipy求解有界非线性最小化问题

7 投票
1 回答
10832 浏览
提问于 2025-04-18 17:02

我在尝试解决一个简单的非线性最小化问题,只有一个变量。

from scipy.optimize import minimize
import math

alpha = 0.05
waiting = 50
mean_period = 50
neighborhood_size = 5

def my_func(w):
    return -(2/(w+1) + alpha*math.floor(waiting/mean_period))*(1-(2/(w+1) + alpha*math.floor(waiting/mean_period)))**(neighborhood_size-1)

print minimize(my_func, mean_period, bounds=(2,200))

这段代码给了我

ValueError: length of x0 != length of bounds

我是不是输入错了?应该怎么格式化呢?

如果我去掉限制条件,我得到的结果是:

status: 2
  success: False
     njev: 19
     nfev: 69
 hess_inv: array([[1]])
      fun: array([-0.04072531])
        x: array([50])
  message: 'Desired error not necessarily achieved due to precision loss.'
      jac: array([-1386838.30676792])

这个函数看起来像这样,所以我需要这些限制条件来把解决方案限制在我感兴趣的局部最大值范围内。

1 个回答

12

应该是这样的:

print minimize(my_func, mean_period, bounds=((2,200),))

  status: 0
 success: True
    nfev: 57
     fun: array([-0.08191999])
       x: array([ 12.34003932])
 message: 'CONVERGENCE: NORM_OF_PROJECTED_GRADIENT_<=_PGTOL'
     jac: array([  2.17187379e-06])
     nit: 4

对于每一个参数,你都需要提供一个范围,所以在这里我们需要传递一个 tuple(元组),这个元组里面只包含一个元组 (2,200),然后传给 minimize() 函数。

撰写回答