Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 带参数极小化函数_Python_Numpy_Scipy_Mathematical Optimization - Fatal编程技术网

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