python – 使用PyDSTool解决网络上的ODE
作者:互联网
使用scipy.integrate一段时间后,我需要更多功能,如分叉分析或参数估计.这就是为什么我对使用PyDSTool感兴趣,但从文档中我无法弄清楚如何使用ModelSpec,如果这实际上是什么将引导我解决方案.
这是我尝试做的一个玩具示例:我有一个带有两个节点的网络,两个节点具有相同的(SIR)动态,由两个ODE描述,但初始条件不同.这些方程通过Epsilon耦合在节点之间(见下面的公式).
公式作为更好阅读的图片,’n’和’m’是索引,而不是指数〜>
http://image.noelshack.com/fichiers/2014/28/1404918182-odes.png
(遗憾的是,无法在堆栈上使用上传)
在两个节点的情况下,我的代码(使用PyDSTool)看起来像这样:
#multiple SIR metapopulations
#parameter and initial condition definition; a dict is a must
import PyDSTool as pdt
params={'alpha': 0.7, 'beta':0.1, 'epsilon1':0.5,'epsilon2':0.5}
ini={'s1':0.99,'s2':1,'i1':0.01,'i2':0.00}
DSargs=pdt.args(name='SIRtest_multi',
ics=ini,
pars=params,
tdata=[0,20],
#the for-macro generates formulas for s1,s2 and i1,i2;
#sum works similar but sums over the expressions in it
varspecs={'s[o]':'for(o,1,2,-alpha*s[o]*sum(k,1,2,epsilon[k]*i[k]))',
'i[l]':'for(l,1,2,alpha*s[l]*sum(m,1,2,epsilon[m]*i[m]))'})
#generator
DS = pdt.Generator.Vode_ODEsystem(DSargs)
#computation, a trajectory object is generated
trj=DS.compute('test')
#extraction of the points for plotting
pts=trj.sample()
#plotting; pylab is imported along with PyDSTool as plt
pdt.plt.plot(pts['t'],pts['s1'],label='s1')
pdt.plt.plot(pts['t'],pts['i1'],label='i1')
pdt.plt.plot(pts['t'],pts['s2'],label='s2')
pdt.plt.plot(pts['t'],pts['i2'],label='i2')
pdt.plt.legend()
pdt.plt.xlabel('t')
pdt.plt.show()
但在我最初的问题中,每个节点有超过1000个节点和5个ODE,每个节点都耦合到不同数量的其他节点,并且所有节点的epsilon值都不相等.所以修补这种语法并没有让我接近解决方案.
我实际想到的是为每个节点构建单独的子模型/求解器(?)的方法,它有自己的参数(epsilons,因为它们对于每个节点都是不同的).然后将它们相互链接.这就是我不知道在PyDSTool中是否可能的问题,以及它是否是处理这类问题的方法.
我查看了示例和PyDSTool的文档,但无法弄清楚如何做到这一点,所以非常感谢帮助!如果我尝试做事的方式是非正统的或简单的愚蠢,欢迎你提出如何更有效地做到这一点的建议. (这实际上是更有效/快速/更好的方法来解决这样的问题:将它细分为许多小型(仍未解耦)模型/求解器或一次包含所有ODE的那些?)
(我既不是数学家也不是程序员,但愿意学习,所以请耐心等待!)
解决方法:
解决方案绝对不是建立单独的仿真模型.这是行不通的,因为很多变量将在子模型之间连续耦合.你绝对必须将所有的ODE放在一起.
听起来您需要的解决方案是使用ModelSpec对象构造.这些允许您从符号片段中分层构建子模型定义.它们可以有自己的“epsilon”参数等.当你完成时,你会声明所有的部分,让PyDSTool为你制作包含ODE定义的最终字符串.我建议你看看教程示例:
http://www.ni.gsu.edu/~rclewley/PyDSTool/Tutorial/Tutorial_compneuro.html
和提供的示例:ModelSpec_test.py,MultiCompartments.py.但是,请记住,您仍然必须拥有参数和耦合数据的源(即,从文件加载的大矩阵或字典),以便能够自动化构建模型的过程,否则您仍然会编写它一切都是手工制作的.
您必须为要拥有的组件构建一些类.您还可以创建一个工厂函数(比较neuralcomp.py工具箱中的’makeSoma’),该函数将获取所有子组件并基于对每个声明的组件进行求和来创建ODE.最后,您可以通过它们在层次结构中的位置来引用参数.一个可能是’s1.epsilon’而另一个可能是’i4.epsilon’.
不幸的是,要有效地构建这样的模型,你将不得不学习做一些更复杂的编程!首先要了解本教程中的所有步骤.您可以通过SourceForge支持讨论直接向我发送电子邮件,或者在您开始使用后发送电子邮件并提出具体问题.
标签:python,networking,ode 来源: https://codeday.me/bug/20190629/1321143.html