我想估计一组微分方程的参数。我发现PSO算法是可行的,因此我使用了来自scipy的 pySwarms 框架和 odeint 方法。由于PSO是一种优化算法,因此我必须减少误差函数,该误差函数定义为函数的估计值与基准之间的差。所以管道是:
由于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方法来并行运行不同的模型,这是一个好的解决方案吗?