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



我想最小化一个有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个变量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))

最新更新