Python 带参数极小化函数
目前,我有以下代码定义函数Python 带参数极小化函数,python,numpy,scipy,mathematical-optimization,Python,Numpy,Scipy,Mathematical Optimization,目前,我有以下代码定义函数f a = #something b = #something c = #something def f(x): """Evaluates some function that depends on parameters a, b, and c""" someNumber = #some calculation return someNumber 理想情况下,我会定义f(x,a,b,c),但我正在最小化关于x的f,并且SciPy的优化工具箱不允
f
a = #something
b = #something
c = #something
def f(x):
"""Evaluates some function that depends on parameters a, b, and c"""
someNumber = #some calculation
return someNumber
理想情况下,我会定义f(x,a,b,c),但我正在最小化关于
x
的f
,并且SciPy的优化工具箱不允许最小化参数中带有参数的函数。也就是说,我想为a、b
和c
的多个值运行最小化代码。有什么方法可以做到这一点吗?您可以在args
from scipy.optimize import minimize
minimize(f, x0, args=(a, b, c))
这是一个关于使用
minimize
的简单问题和答案。如果其他用户需要更具体的东西,这里有一个简单的例子
广义二次方程:
In [282]: def fun(x, a,b,c):
...: return a*x**2 + b*x + c
In [283]: optimize.minimize(fun, 10, args=(1,0,0))
Out[283]:
fun: 1.7161984122524196e-15
hess_inv: array([[ 0.50000001]])
jac: array([ -6.79528891e-08])
message: 'Optimization terminated successfully.'
nfev: 15
nit: 4
njev: 5
status: 0
success: True
x: array([ -4.14270251e-08])
In [284]: optimize.minimize(fun, 10, args=(1,1,1))
Out[284]:
fun: 0.7500000000000221
hess_inv: array([[ 0.49999999]])
jac: array([ 3.12924385e-07])
message: 'Optimization terminated successfully.'
nfev: 12
nit: 2
njev: 4
status: 0
success: True
x: array([-0.49999985])
该函数也可以将数组作为输入,但仍需要返回单个(标量)值:
最好确保函数使用建议的x0
和args运行,例如
In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1)
Out[291]: 633
如果您不能调用目标函数,或者对其参数如何工作感到困惑,
minimize
并不是一个灵丹妙药。这种最小化只与您对目标函数的理解一样好。使用functools“冻结”具有特定a、b、c
值的函数。部分?@pm2r这样做会起作用,我很高兴我现在知道了这个工具,但正如@Liteye所指出的minimize
实际上允许我传递它的参数。谢谢不用担心partial
在您需要时非常好,但我不知道SciPy,所以这只是一个建议。显然,莱特耶的答案是正确的方法很抱歉,我找到了一个旧答案,但我认为另一个问题可能是重复的。如何添加一个约束,该约束取决于最小化变量x和其中一个参数,例如a。对于x+a<1的附加约束,我有一个类似的问题。@user1936752,我认为使用与目标函数相同的参数调用约束,即(x,)+args
(元组连接)。所以他们必须有相同的签名,或者至少有一个兼容的。谢谢你的评论。也许我无法正确地表达我的问题,所以我在这里问了一个单独的问题:。如果你有时间看,我将非常感激!调用args
中的参数是否需要与调用函数体f
中的参数相同?是否也f
保持f(x)
,还是变成f(x,a,b,c)
?
In [291]: fun(np.array([10,10,10]), np.array([1,2,3]), 1, 1)
Out[291]: 633