Решение ограниченной нелинейной минимизации с помощью scipy в Python

Попытка решить простую нелинейную задачу минимизации с одной переменной.

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])

Функция выглядит как that, и поэтому мне нужны границы, чтобы ограничить решение локальным максимумом, который меня интересует.


person George    schedule 12.08.2014    source источник
comment
не могли бы вы попробовать bounds = ((2,200),)?   -  person ambi    schedule 12.08.2014
comment
@ambi, на самом деле это решило это. Думаю, я сделал опечатку с первой попытки. Быстрый встречный вопрос: исходя из фона C, легко определить тип аргумента по сигнатуре функции. В этом сценарии, как новый пользователь может узнать, что он принимает кортеж, не глядя на источник (github.com/scipy/scipy/blob/v0.14.0/scipy/optimize/)?   -  person George    schedule 13.08.2014


Ответы (1)


Должен быть:

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, который содержит только один tuple (2,200), в minimize().

person CT Zhu    schedule 12.08.2014
comment
Как я упоминал в комментарии выше, я пришел из фона C, где тип аргумента легко определить по сигнатуре функции. В этом сценарии, как новый пользователь может узнать, что он принимает кортеж, не глядя на источник (github.com/scipy/scipy/blob/v0.14.0/scipy/optimize/)? - person George; 13.08.2014
comment
@George К сожалению, одна из проблем в Python заключается в том, что трудно увидеть, какие типы принимает функция. Обычно это поясняется в документации - в документации для minim () сказано, что границы - это последовательность - Причина, по которой он не указывает кортеж, заключается в том, что это действительно будет работать с любым итеративным, например, это может быть список. - person mxbi; 12.04.2017