2016-12-29 33 views
2

我寫了一個代碼,對於r和阿爾法使用SciPy的最小化某個功能。但是我遇到了一個將參數傳遞給函數的問題。minimazing功能,如何將參數傳遞到函數SciPy的

#!/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) 

有人能解釋我如何以正確的方式傳遞參數嗎?

回答

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來完成,一個lambdapartial

  • optimize一個args參數。致電quad時,您已經在使用args功能。

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 ]) 
1

首先,我要指出一點,可能會混淆您:您有一個名爲全球(實際上,模塊級)的變量rhomy_function內的局部變量rho。這些不一樣。這可能有助於清楚的事情了全局變量,這個重命名爲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的值,您存儲的名稱爲rho_0。但my_function需要參數:parametersrho。你不能用一個參數來調用它。這就是爲什麼Python給出你遇到的錯誤。

爲了做你想做的事,你必須知道opt.minimize需要函數作爲它的第一個參數。例如,你可以調用

opt.minimize(my_function, ...) 

什麼你給它的調用函數的結果,

opt.minimize(my_function(...), ...) 

這是不一樣的東西。

如你所知,你傳遞給opt.minimize功能需要有像

def my_function(parameters, arg0, arg1, ...): 
    ... 

簽名。當你想爲特定的值傳遞給arg0arg1等,您使用的opt.minimizeargs說法。

opt.minimize(my_function, parameters_0, args=(arg0_value, arg1_value, ...) 

裏面opt.minimize,在每個評估步驟,將選擇值的parameters,收拾起來成一個元組,並傳遞作爲第一個參數my_function,而它不管你傳遞給args反向:它將該元組解包爲單個參數,並在parameters之後將它們傳遞給my_function

+0

我明白了!謝謝你的深刻解釋!這對我幫助很大! – Monica