为模拟解压缩参数

2024-04-19 23:05:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我做了很多ODE模拟,并使用了一些python参数优化工具(例如。scipy.optimize.minimize.最小化,需要以列表形式传递参数。这使得它们非常麻烦,因为我必须将参数称为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

这真是胡思乱想,令人不满意的原因有很多。每当我需要向模拟中添加新的参数时,我必须修改params列表并更改如何在simulate函数中手动解包列表;在每一轮模拟中创建新的引用都会浪费一些时间,等等

我想知道是否有一个合理的、非kludgey的解决方案:用名称定义参数,将它们作为列表传递给函数,然后在列表中用相同的名称引用它们。在


Tags: 工具函数名称列表参数k2k1scipy
2条回答

我通常按照乔兰在回答中的建议做:

def sim(params, timerange):
    k1, k2, N = params
    ...

但你也可以这样做:

^{pr2}$

(至少,这在Python2.7中是可行的。我用scipy.integrate.odeintscipy.integrate.ode和{}测试了这个想法,效果很好。例如,在下面的代码中,可以使用cost或{}作为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']
def sim(params,timerange):
    k1,k2,N = params

我想是你想要的。。,。。如果你添加了一个额外的参数,你只需要在N。。。但这不是一个可选的论点

或者更好

^{pr2}$

相关问题 更多 >