scipy.optimize.minimize многомерный

Я пытаюсь свести к минимуму следующую функцию:

def func(x, *args):
  #""" Objective function """
       return ((2*math.pi*2000*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1000))

с ограничениями, границами и начальными значениями:

 guess=[4,5]
 d1=3
 d2=10 
 h1=3
 h2=10
 v=50
 cons = ({'type': 'ineq','fun' : lambda x: math.pi*x[1]*((x[0]/2)**2)-v})
 bnds = ((d1, d2), (h1, h2))

и оптимизация веселья:

scipy.optimize.minimize(func,guess, method='SLSQP',bounds=bnds, 
constraints=cons)

но я не получаю никакого решения:

fun: 48281.04745868263
jac: array([ 25783.35449219,   2828.42675781])
message: 'Positive directional derivative for linesearch'
nfev: 12
nit: 7
njev: 3
status: 8
success: False
x: array([ 3.        ,  7.07344142])

Помогите мне, пожалуйста.

1 ответ

Решение

Это выглядит крайне нестабильным с точки зрения численной оптимизации. Возможно, это может сработать, если для сохранения заданы некоторые границы. Но быстро растущие вещи, такие как 2^n призывают к неприятностям.

Теперь, если я правильно интерпретирую вашу функцию, вы можете разделить ее на 1000; который влияет на меньшие значения, понравился оптимизатору. Это в основном масштабирование цели.

Сравните свое веселье:

# ((2*math.pi*2000*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1000))
     fun: 48258.32083419573
     jac: array([ 25775.48237605,   2828.42712477])
 message: 'Positive directional derivative for linesearch'
    nfev: 44
     nit: 10
    njev: 6
  status: 8
 success: False
       x: array([ 3.        ,  7.06540634])

с:

# ((2*math.pi*2*((x[0]/2)**2))+(2**(x[0]/2)*(x[1])*1))
     fun: 48.2813631259886
     jac: array([ 25.78346395,   2.82842684])
 message: 'Optimization terminated successfully.'
    nfev: 12
     nit: 3
    njev: 3
  status: 0
 success: True
       x: array([ 3.        ,  7.07355302])

Если вам нужна исходная цель, сделайте умножение постобработки!

Другие вопросы по тегам