在Mathematica

时间:2015-05-12 02:37:53

标签: performance loops wolfram-mathematica

所以我使用递归方程生成一个遗传漂移模型来研究变量{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;
&#13;
&#13;

pqs是最终结果。

这个工作正常,但运行需要大约15.982986秒,我需要运行九个变量的函数。他们以任何方式加速循环吗?

我已阅读compiling the code might work,但我不确定如何使用Compile功能。我也试过了ReapSow而不是Append,但我无法让它发挥作用。

我还不熟悉编码,所以任何基本提示都会受到赞赏。

ps:运行pqs = SimulateReps[0.001, 10000, 1000,{0.25, 0.25, 0.25, 0.25},10];后出现错误消息,但它似乎不会影响结果。

0 个答案:

没有答案