将固定长度的数组作为参数传递给odeint

时间:2020-10-31 21:02:45

标签: python scipy differential-equations particle-swarm

我想估计一组微分方程的参数。我发现PSO算法是可行的,因此我使用了来自scipy的 pySwarms 框架和 odeint 方法。由于PSO是一种优化算法,因此我必须减少误差函数,该误差函数定义为函数的估计值与基准之间的差。所以管道是:

  1. PSO估计方程的参数
  2. 用这些参数求解方程式
  3. 计算误差函数
  4. 更新估算值以减少误差。

由于pySwarm中的优化程序返回一个点数组,该数组的长度等于粒子的数量,每个值彼此不同,因为它与特定粒子有关,因此可以将此向量作为<的参数传递em> odeint 函数并让其完成所有工作?还是我必须遍历所有可能的参数值并求解模型(就像我所做的那样)?您能否建议是否可以改善我的解决方案? 这是模型:

def SIR_model(x, t, N,beta,gamma):
    S,I,R = x
    dSdt = (-beta*I*S)/N
    dIdt= (beta*I*S)/N -gamma*I
    dRdt = gamma*I
    return [dSdt,dIdt,dRdt]

这是成本函数:

def cost_function(parameters,x0,S_true,I_true,R_true):
    t = np.linspace(0,50,50)

    beta=parameters[:,0]
    gamma = parameters[:,1]
    error = []
    for b,g in zip(beta,gamma):
       x=odeint(SIR_model_without_p,x0,t,args=(1000,b,g))
       S = x[:, 0]
       I = x[:, 1]
       R = x[:, 2]
       error.append(abs((S_true-S).sum()+(I_true-I).sum()+(R_true-R).sum()))
    return error

我认为我可以使用带有map函数的thread方法来并行运行不同的模型,这是一个好的解决方案吗?

0 个答案:

没有答案