Почему не работает минимизация с ограничениями в 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')

Наверно, про это описано где-то в справке к пакету.

→ Ссылка