簡體   English   中英

解壓縮模擬參數

[英]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.odeintscipy.integrate.odescipy.optimize.minimize測試了這個想法,它運行正常。 例如,在以下代碼中,您可以使用costcost2作為第一個參數來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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM