所以我使用递归方程生成一个遗传漂移模型来研究变量{pab,pAb,paB,pAB}
的变化
Psel[{pab_, pAb_, paB_, pAB_},s_] :=
({pab, pAb, paB, pAB} {1, 1 + s, 1 + s, (1 + s)^2})
/(1 + s pAb + s paB + (2 s + s^2) pAB)
Pdrift[{pab_, pAb_, paB_, pAB_}, Npop_] :=
If[Npop == Infinity, {pab, pAb, paB, pAB},
RandomVariate[MultinomialDistribution[Npop, {pab, pAb, paB, pAB}]]
/N[Npop]];
DriftEquation[{pab_, pAb_, paB_, pAB_}, s_, Npop_] :=
Pdrift[Psel[{pab, pAb, paB, pAB}, s], Npop];

然后在For
循环中tmax
次运行。然后使用reps
循环重复此循环Do
次。完全归入函数
SimulateReps[s_, Npop_, tmax_, pint_, reps_] :=
Module[{i, pqs, pqsrun, t, DriftEquS},
pqs = {};
DriftEquS[{pab_, pAb_, paB_, pAB_}] =
Simplify[DriftEquation[{pab, pAb, paB, pAB}, s, Npop]];
Do[pqsrun = Table[{{0, 0, 0, 0}, {0, 0, 0, 0}}, {tmax}];
pqsrun[[1]] = pint;
For[t = 1, t < tmax, t++,
pqsrun[[t + 1]] = DriftEquS[pqsrun[[t]]]];
pqs = Append[pqs, pqsrun];, {reps}];
Return[pqs];
];
pqs = SimulateReps[0.001, 10000, 1000, {0.25, 0.25, 0.25, 0.25},10];
&#13;
pqs
是最终结果。
这个工作正常,但运行需要大约15.982986秒,我需要运行九个变量的函数。他们以任何方式加速循环吗?
我已阅读compiling the code might work,但我不确定如何使用Compile
功能。我也试过了Reap
和Sow
而不是Append
,但我无法让它发挥作用。
我还不熟悉编码,所以任何基本提示都会受到赞赏。
ps:运行pqs = SimulateReps[0.001, 10000, 1000,{0.25, 0.25, 0.25, 0.25},10];
后出现错误消息,但它似乎不会影响结果。