передача функции с несколькими независимыми переменными и несколькими аргументами для оптимизации оптимизации свести к минимуму - PullRequest
1 голос
/ 25 февраля 2020

После этого вопроса я хочу сделать мой вопрос как можно более точным c, сосредоточив внимание на той части, которую я не могу решить. Рассмотрим очень простую функцию:

def foo(x, y, a, b, c):
    return a * x**4 + b * y**2 + c

. Теперь я хочу использовать scipy.optimize.minimize или любую другую существующую функцию, чтобы найти x и y (то есть параметры) для минимизации * 1009. * с учетом констант a, b и c (т. е. аргументов). Если бы я имел только один параметр и умножил аргументы, то с этой страницы я мог бы сделать:

def foo(x, *args):
    a, b, c = args
    return a * x**4 + b * x**2 + c

# X0 = to some scalar
# ARGS = a tuple of scalars (A, B, C) 

x_min = scipy.optimize.minimize(foo, x0=X0, args=ARGS)

и если бы у меня были только независимые переменные, без постоянных аргументов, то из эту страницу Я мог бы сделать:

def foo(*params):
    x, y = params
    return 4 * x**4 + 2 * y**2 + 1

# P0 = to a list of scalars [X0, Y0] 

x_min = scipy.optimize.minimize(foo, x0=P0)

Однако я не могу использовать любой из вышеперечисленных синтаксисов. Я считаю, что я должен определить свою функцию как что-то вроде:

def foo(*args, **kwargs):
    x, y = args
    a, b, c = tuple(kwargs.values())
    return a * x**4 + b * y**2 + c

, но тогда я не знаю, как передать args и kwargs в функции scipy.optimize. Буду признателен, если вы поможете мне понять, как лучше всего определить функцию foo с несколькими независимыми параметрами и постоянными аргументами для функций scipy.optimize. Спасибо за вашу поддержку заранее.

1 Ответ

1 голос
/ 25 февраля 2020

Вместо того, чтобы передавать foo и заставлять Сципи передавать постоянные аргументы, вы можете связать их самостоятельно, используя lambda или functools.partial:

A, B, C = some_const_values
foo1 = lambda x, y: foo(x, y, A, B, C)

Или:

import functools
foo1 = functools.partial(foo, a=A, b=B, c=C)

Тогда:

x_min = scipy.optimize.minimize(foo1, ...)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...