minimazing函数,如何将参数传递给函数scipy

时间:2016-12-29 22:20:10

标签: python scipy

我已经编写了一个代码,用于使用scipy最小化关于r和alpha的某个函数。但是我遇到了将参数传递给函数的问题。

#!/usr/bin/env python
import numpy as np
from scipy.integrate import quad
import scipy.optimize as opt

def integrand(t, alpha, r):
    return np.exp(-alpha*(t-r))**2

def my_function(parameters, rho):
    alpha = parameters[0]
    r = parameters[1]
    return quad(integrand, 0, rho, args=(alpha, r))[0]

alpha_0 = 1
r_0 = 1
rho = 5.0

vec_expint = np.vectorize(my_function)

res = opt.minimize(my_function(rho), np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
print(res)

我想将集成边界作为变量。我添加了一个变量rho,我收到以下错误消息:

 res = opt.minimize(my_function(rho), np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
    TypeError: my_function() takes exactly 2 arguments (1 given)

有人能解释我如何以正确的方式传递论据吗?

3 个答案:

答案 0 :(得分:1)

您已定义:

def my_function(parameters, rho):

现在尝试

my_function(1)

错误是什么?显而易见的Python,对吧?当你运行

 res = opt.minimize(**my_function(rho)**, np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})

它甚至没有超越我突出显示的那个表达。

有几种解决方案:

  • 定义一个只接受一个参数parameters的新函数,并预先定义rho。可以使用deflambdapartial完成此操作。

  • optimize args个参数。您在调用args时已使用quad功能。

答案 1 :(得分:1)

使用args参数。

我的代码:

#!/usr/bin/env python
import numpy as np
from scipy.integrate import quad
import scipy.optimize as opt

def integrand(t, alpha, r):
    return np.exp(-alpha*(t-r))**2

def my_function(parameters, rho):
    alpha = parameters[0]
    r = parameters[1]
    return quad(integrand, 0, rho, args=(alpha, r))[0]

alpha_0 = 1
r_0 = 1
rho = 5.0

vec_expint = np.vectorize(my_function)

res = opt.minimize(my_function, np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, args=(rho),options={'gtol': 0.01, 'maxiter': 5})
print(res)

输出:

     fun: 0.0018415003336983448
     jac: array([-0.00523077,  0.00762011])
 message: 'Optimization terminated successfully.'
    nfev: 12
     nit: 2
    njev: 3
  status: 0
 success: True
       x: array([ 2.06899361, -1.1785839 ])

答案 2 :(得分:1)

首先,让我指出一件可能让您感到困惑的事情:您在rho内有一个名为rho的全局(实际上是模块级)变量和一个名为my_function的局部变量}。这些都不一样。它可能有助于清除将全局变量重命名为rho_0,即将代码的最后几行替换为:

alpha_0 = 1
r_0 = 1
rho_0 = 5.0

vec_expint = np.vectorize(my_function)

res = opt.minimize(my_function(rho_0), np.asarray([alpha_0, r_0]), method='CG', tol=1.e-2, options={'gtol': 0.01, 'maxiter': 5})
print(res)

现在,您遇到的问题来自于在my_function(rho)的通话中写opt.minimize。当您编写my_function(rho)时,这意味着您使用一个参数调用 my_function,并且该参数是您在名称下存储的5.0的值{ {1}}。但rho_0需要两个参数:my_functionparameters。你不能用一个参数来调用它。这就是为什么Python会给出你遇到的错误。

为了做你想做的事,你必须要知道rho需要函数作为它的第一个参数。例如,您可以致电

opt.minimize

你给它的是调用函数的结果,

opt.minimize(my_function, ...)

这不是一回事。

如您所知,传递给opt.minimize(my_function(...), ...) 的函数需要具有类似

的签名
opt.minimize

如果要将特定值传递给def my_function(parameters, arg0, arg1, ...): ... arg0等,请使用arg1的{​​{1}}参数。

args

opt.minimize内,在每个评估步骤中,它会选择opt.minimize(my_function, parameters_0, args=(arg0_value, arg1_value, ...) 的值,将它们打包成一个元组,并将其作为第一个参数传递给opt.minimize,而它与传递给parameters的任何内容相反:它将该元组解包为单个参数,并在my_function之后将它们传递给args