Почему не работает минимизация с ограничениями в SciPy?
Всем привет. Не могу понять, почему не работает вот этот код:
import numpy as np
from scipy.optimize import minimize
from scipy.integrate import quad
def квоткл(h05, s):
return np.sqrt((h05 - 1.4886311954691858)**2 + (s - 2.2641146383382207)**2)
def Обеспволн(h05, s):
def φ(h3):
return 1/h3*np.exp(-(s * np.log(h3/h05))**2 / 2)
return 1 - quad(φ, 0, 3.5)[0]/quad(φ, 0, np.inf)[0]
def Ограничение(h05, s):
return Обеспволн(h05, s) - 0.06
con = {'type': 'eq', 'fun': Ограничение}
minimize(квоткл, (0.5, 0.5), constraints=con, method='slsqp')
В итоге программа зачем-то просит дополнительный аргумент s для функции Ограничение
Ответы (1 шт):
Автор решения: Nikel P
→ Ссылка
Работает, если передавать переменные кортежем.
import numpy as np
from scipy.optimize import minimize
from scipy.integrate import quad
def квоткл(X):
h05, s = X
return np.sqrt((h05 - 1.4886311954691858)**2 + (s - 2.2641146383382207)**2)
def Обеспволн(X):
h05, s = X
def φ(h3):
return 1/h3*np.exp(-(s * np.log(h3/h05))**2 / 2)
return 1 - quad(φ, 0, 3.5)[0]/quad(φ, 0, np.inf)[0]
def Ограничение(X):
return Обеспволн(X) - 0.06
con = {'type': 'eq', 'fun': Ограничение}
A = minimize(квоткл, (0.5, 0.5), constraints=con, method='slsqp')
Наверно, про это описано где-то в справке к пакету.