问题描述
我想估计一组微分方程的参数。我发现PSO算法是可行的,因此我使用了来自scipy的 pySwarms 框架和 odeint 方法。由于PSO是一种优化算法,因此我必须减少误差函数,该误差函数定义为函数的估计值与基准之间的差。所以管道是:
- PSO估计方程的参数
- 用这些参数求解方程式
- 计算误差函数
- 更新估算值以减少误差。
由于pySwarm中的优化程序返回一个点数组,该数组的长度等于粒子的数量,每个值彼此不同,因为它与特定粒子有关,因此可以将此向量作为 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,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方法来并行运行不同的模型,这是一个好的解决方案吗?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)