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))
我正在寻找最小化具有 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))