Scipy optimize.minimize 具有 2 个实变量和 1 个参数的复杂函数

Scipy optimize.minimize a complex function with 2 real variables and 1 argument

我正在寻找最小化具有 2 个变量和 1 个常量的非线性复杂函数。我发现了一个关于如何最小化复杂函数的问题,我认为它可行(?)我还没有尝试过,因为我想首先解决多变量单参数问题。

例如一个超级简单的实函数:

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

我可以对 3 个参数进行最小化,但不能对 2 个变量 1 个常量进行最小化。如果我这样做

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

它工作正常。

我发现这个问题是有人问我类似的问题,但答案对我不起作用,答案是:

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 个实函数,用最小化解决它们,然后将两个结果融合为一个。但我不确定我是否理解,所以如果有人可以在那里帮助我。该函数是一个复函数(实部和虚部)但输入(2 个变量 1 个常量)是实数。

也许有一个包可以做到这一点?

您可以通过将要在最小化过程中改变的参数与其他参数分开来实现。类似于:

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