传递具有多个自变量和多个参数的函数以scipy优化最小化

时间:2020-02-25 13:51:43

标签: python scipy keyword-argument scipy-optimize scipy-optimize-minimize

this question之后,我想让我的问题尽可能具体,重点放在我无法解决的部分上。考虑一个非常简单的功能:

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

现在,我想使用scipy.optimize.minimize或任何其他现有函数来找到xy(即参数)以在给定常数{的情况下最小化foo {1}},ab(即args)。如果我只有一个参数并且有多个参数,那么从this page可以做到:

c

如果我只有独立变量,没有常量args,那么从this page可以做到:

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函数的最佳方法,将不胜感激。感谢您的提前支持。

1 个答案:

答案 0 :(得分:1)

您可以使用foolambda自己绑定它们,而不是传递functools.partial并让scipy传递常量参数:

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, ...)