[英]Unpacking parameters for a simulation
我做了很多ODE模擬,我使用了一些python參數優化工具(例如scipy.optimize.minimize, emcee ),這些工具需要將參數作為列表傳入。 這使得它們非常麻煩,因為我必須將參數稱為params[0]
, params[1]
等,而不是實際描述它們在模擬中的作用的更直觀的名稱。 到目前為止,我對此的解決方案是這樣的:
k1 = 1.0
k2 = 0.5
N = 0.01
params = [k1,k2,N]
def sim(params,timerange):
k1 = params[0]
k2 = params[1]
N = params[2]
# run the simulation
這實際上是很好的,並且由於許多原因而不能令人滿意。 每當我需要向模擬添加新參數時,我必須修改參數列表並更改我在模擬函數中手動解壓縮列表的方式; 浪費一些時間在每一輪模擬等方面做出新的參考。
我想知道是否有一個理智的,非kludgey解決方案用於定義帶有名稱的參數,將它們作為列表傳遞給函數,然后通過列表中的相同名稱引用它們。
def sim(params,timerange):
k1,k2,N = params
是你想要的我想..,..如果你添加了一個額外的參數,你只需要在N之后添加它......但它不是一個可選的參數
或者更好
def sim(*params,**kwargs):
timerange = kwargs.get('timerange',default_timerange)
K1,K2,N = params #assuming you know you have exactly 3
#then call it like so
sim(k1,k2,N,timerange=(-100,100))
我經常按照喬倫在答案中的建議行事:
def sim(params, timerange):
k1, k2, N = params
...
但你也可以這樣做:
def sim((k1, k2, N), timerange):
...
(至少,它適用於Python 2.7。我沒有嘗試過其他Python版本。)我用scipy.integrate.odeint
, scipy.integrate.ode
和scipy.optimize.minimize
測試了這個想法,它運行正常。 例如,在以下代碼中,您可以使用cost
或cost2
作為第一個參數來minimize
:
from scipy.optimize import minimize
def cost(z, a, b):
x, y = z
c = (x - a)**2 + (y - b)**2
return c
def cost2((x, y), a, b):
c = (x - a)**2 + (y - b)**2
return c
if __name__ == "__main__":
a = 5.0
b = 1.5
x0 = 4.2
y0 = 1.5
sol = minimize(cost2, (x0, y0), args=(a,b))
print sol['x']
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.