我已经编写了一个代码,用于使用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)
有人能解释我如何以正确的方式传递论据吗?
答案 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
。可以使用def
,lambda
或partial
完成此操作。
给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_function
和parameters
。你不能用一个参数来调用它。这就是为什么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
。