Scipy optimize.minimize сложная функция с 2 действительными переменными и 1 аргументом - PullRequest
1 голос
/ 02 апреля 2020

Я хочу минимизировать нелинейную комплексную функцию с 2 переменными и 1 константой. Я нашел вопрос о том, как минимизировать сложную функцию, и я думаю, что она работает (?) Я еще не пробовал, потому что я хочу, чтобы сначала решить проблему с несколькими переменными одним аргументом.

Например, супер простая действительная функция:

def function(param):
    x, y, a = param
    return(x**2 + y**2 + a*x)

Я могу сделать минимизацию по 3 параметрам, но не по 2 переменным, 1 константе. Если я делаю

minimize(function, [2,4,5])

, то все работает нормально.

Я нашел этот вопрос, когда кто-то спросил что-то похожее на меня, но ответ не работает для меня, ответ говорит: do:

def function(x, y, a):
    return(x**2 + y**2 + a*x)
minimize(function, 2, 4 args=5)

, но это дает мне ошибки, даже просто минимизируя с помощью 3 таким образом minimize(function, 2, 4, 5) дает мне много строк ошибок, и таким образом minimize(function, (2,4,5)) дает >missing 2 required positional arguments: 'y' and 'a'. .

Далее для сложной вещи, которую я посмотрел в ответе, было сказано разделить функцию на две реальные функции, решить их с помощью минимизации, а затем объединить оба результата в одну. Но я не уверен, что понял, так что если кто-то может помочь мне там. Функция является сложной функцией (действительная и мнимая часть), но входные данные (2 переменные 1 постоянная) действительны.

Может быть, есть пакет, который делает это?

1 Ответ

1 голос
/ 02 апреля 2020

Вы можете сделать это, отделяя аргументы, которые вы хотите изменить в процессе минимизации, от других. Что-то вроде:

from scipy.optimize import minimize

def function(t, a):
    x, y = t
    return(x**2 + y**2 + a*x)

res = minimize(function, (2, 4), args=5)

Если вы не хотите изменять сигнатуру функции и внутренние компоненты, вы можете использовать оболочку:

from scipy.optimize import minimize

def function(x, y, a):
    return(x**2 + y**2 + a*x)

def wrapper(f, a):
    def newfunc(t):
        return f(*t, a)
    return newfunc

res = minimize(wrapper(function, 5), (2, 4))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...