Drexel dragonThe Math ForumDonate to the Math Forum



Search All of the Math Forum:

Views expressed in these public forums are not endorsed by Drexel University or The Math Forum.


Math Forum » Discussions » Software » comp.soft-sys.math.mathematica

Topic: Compiling numerical iterations
Replies: 7   Last Post: Mar 5, 2013 4:15 AM

Advanced Search

Back to Topic List Back to Topic List Jump to Tree View Jump to Tree View   Messages: [ Previous | Next ]
Dr. Peter Klamser

Posts: 23
Registered: 6/11/11
Re: Compiling numerical iterations
Posted: Feb 27, 2013 3:04 AM
  Click to see the message monospaced in plain text Plain Text   Click to reply to this topic Reply

Hi Cornelius,

your code is not slow because you use Mathematica but because you are not
writing in functional and Mathematica style.

Use /@, @@, pure Functions like #1^2& etc. to realize your algorithm.

Plus @@ {a, b, c, d} is much faster then procedural programming.

Kind regards from Peter



2013/2/26 firlefranz <cornelius.franz@gmx.net>:
> Thanks a lot! To be honest, some of the commands Ray is using, I've never seen before. I stopped using mathematica before version 5 came out.
>
> Coming back to Peters statement of exporting the code from Mathematica to C. How this can be done starting from my or Ray's code? There is an automated C-code-gernerator implemented in Mathematica 9, am I right?
>
>
> As a step forward to the first little peace of code, here is another try, which is not really optimized. The be concrete, I try to simulate the autocorrelation function of a random walk, which is doing a step at none equally distant time steps. This has to been done for a long random walk for many particles. Instead of doing an average over many random walks and calculate one autocorrelation function I want to simulate many correlation functions and make an average over them. Since the time steps are non equal, I wrote a sub-function, which creates a new time axis and taking the necessary value for the random walk from the first table.
>
> Here is what I come up with. It's running in a reasonable time for one particle, but for a real statistic ensemble, I have to do it over 1.000.000 particles for a long time. Optimizing this or (probably better) exporting it to C would hopefully help a lot. So how to export it?
>
> Clear["Global`*"]
> SeedRandom[1234567890];
> zeitmax = 100;(* muss ein Integer sein *)
> numteilchen = 1;
> tauj = 1;
> corr = Table[0, {i, 1, zeitmax/10}];
>
> SucheIndex[zeitliste_, zeit_, maxindex_] :=
> Module[{i},
> For[i = 1, i <= maxindex, i++,
> If[zeitliste[[i]] > zeit, Break[]];
> ];
> i - 1
> ];
>
> For[j = 1, j <= numteilchen, j++,
> (* Zeitachse generieren von 0 bis zeitmax *)
> t = 0;
> i = 1;
> tabzeit = {};
> time = AbsoluteTiming[While[True,
> tabzeit = Append[tabzeit, t];
> dt = -tauj*Log[1 - RandomReal[]];
> If[t > zeitmax, Break[]];
> t = t + dt;
> i++;
> ];
> ];
> Print[time];
> maxidx = i;
>
> (* Random Walk *)
> time = AbsoluteTiming[
> tabwalk = Table[0, {i, 1, maxidx}];
> a = 0;
> For[i = 1, i <= maxidx, i++,
> tabwalk[[i]] = a;
> If[RandomReal[{-1, 1}] > 0, a = a + 1, a = a - 1];
> ];
> ];
> Print[time];
> (*tabwalk=Table[Subscript[b, i],{i,1,maxidx}];*)
>
> (* Korrelationsfunktion berechnen *)
> time = AbsoluteTiming[
> For[k = 1, k <= zeitmax/10, k++,
> For[n = 1, n <= zeitmax/10*9, n++,
> corr[[k]] =
> corr[[k]] +
> tabwalk[[SucheIndex[tabzeit, n - 1, maxidx]]]*
> tabwalk[[SucheIndex[tabzeit, n + k - 2, maxidx]]]/
> zeitmax*10/9/numteilchen;
> (*Print[corr//N];*)
> ];
> ];
> ];
> Print[time];
> Print[corr // N];
> ];
> Table[{tabzeit[[i]], tabwalk[[i]]}, {i, 1, maxidx}]
> corr // N
>





Point your RSS reader here for a feed of the latest messages in this topic.

[Privacy Policy] [Terms of Use]

© Drexel University 1994-2014. All Rights Reserved.
The Math Forum is a research and educational enterprise of the Drexel University School of Education.