Scipy优化。最小化具有2个实变量和1个参数的复杂函数

时间:2020-04-02 12:53:59

标签: python-3.x scipy complex-numbers scipy-optimize scipy-optimize-minimize

我希望最小化具有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)

但是这给了我错误,即使以这种方式minimize(function, 2, 4, 5)仅使3最小也给了我很多错误,而minimize(function, (2,4,5))就是给了>missing 2 required positional arguments: 'y' and 'a'.。 / p>

接下来,对于复杂的事情,我在回答中看到它说将功能分成2个实函数,以最小的方式求解它们,然后将两个结果融合为一个。但是我不确定我是否理解,是否有人可以帮助我。该函数是一个复数函数(实部和虚部),但输入(2个变量1个常量)是实数。

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

1 个答案:

答案 0 :(得分: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))