1
$\begingroup$

my problem is kind of straight forward:

I want to simulate something, and in order to do so, i calculated some realisations.

In the end, i have, for now, 500 (complex) functions and saved them. Each of them now has about 120 kB. I calculated the average, so I get a function that takes about 60MB if I save it.

No problem here.

Now I wanted to plot this average-function (or at least the Real-part of it). Problem is: loading and/or plotting this equation takes unholy long.

Is there a possibility to simplify this equation ? (Simplify and FullSimplify doesnt work - I need something different)

Thanks already

edit:

To explain what I did and why the defined function-files are this big: What I did was to define a function $f_{p}(t,s)=\sum_z r_z^2\cdot\exp(i(100-z)(t-s))$. Here, every $r_z$ is randomly distributed and i take the sum over 2000 different values. And I need p=500 different realisations (different set of random numbers) of these function. In the end I wanted to calculate the mean, e.g. $mean(t)=\frac{1}{500}\sum_p f_p(t,0)$. Worked fine. Now I saved $mean(t)$ as an ".m" file, as well as the real part $ReMean(t)$. Worked too. Now I wanted to load the file and plot it. For p=4 instead of p=500 it works in a tolerable time (so no problem in the code), but for p=500 not. As I said, the function $ReMean(t)$ , saved as an ".m" file, has roughly 60 MB.

$\endgroup$
6
  • 1
    $\begingroup$ With now specifics on what you do and how the function looks like, I doubt anybody can help you. Also, what exactly do you mean by "function"? How do you save it? Do you really mean that the expression is 120kB big? $\endgroup$ Commented Sep 16, 2017 at 16:24
  • $\begingroup$ Thanks for the answer! I'll edit my post as soon as some calculations are finished (can't open anything at the time...) And yes, the expression is this long/big. $\endgroup$ Commented Sep 16, 2017 at 16:38
  • $\begingroup$ $z$ ist just some index i'm summing up over, for the $r_z$ it just means that for every $z$ I've got a new gaussian distributed random number with expectationvalue and variance that vary for each $z$.$z$ in the exponent takes 500 different values that lie next to each other, e.g. there are $z$ values in some intervall $[a,b]$ with. $\endgroup$ Commented Sep 16, 2017 at 19:11
  • $\begingroup$ For example z takes 500 values with equal distance to each other in $[1,2]$ and for every value there is some random $r_z $number associated to it $\endgroup$ Commented Sep 16, 2017 at 19:19
  • $\begingroup$ I just made something up. It doesn't matter, I think, to issue of speed, whether I did it exactly right. (Even if $r_z$ is supposed to be real, it makes no difference to the speed.) $\endgroup$ Commented Sep 16, 2017 at 19:21

1 Answer 1

3
$\begingroup$

If you don't need symbolic expressions for the functions, I would suggest sticking as closely as possible to numeric evaluation. All you need to store is the vector of values of $z$ and for each $p$, the vector of $r_z$ values. The $r$ values may be stored as a $p \times z$ matrix of values. Below, the code shows $f_p$ being computed for all $p$ using the identical code used to compute $f$ for single $p$.

(* calculates OP's function; for a list of r vectors *) ClearAll[myfun]; myfun[r_?MatrixQ, z_?VectorQ, x_] := Dot[r^2, Exp[I (100 - z) x]]; (* computes all f_p *) myfun[r_?VectorQ, z_?VectorQ, x_] := Dot[r^2, Exp[I (100 - z) x]]; (* computes f for a single vector r *) rr = RandomComplex[1 + I, {500, 2000}]; (* made-up data: p x z array of r_z values *) zz = RandomReal[100, 2000]; (* made-up z indices *) DumpSave["/tmp/foo.mx", {"rr", "zz"}] (* save just the parameters *) (* {"rr", "zz"} *) Clear[rr, zz]; (* clear rr, zz to test Get *) << /tmp/foo.mx; // AbsoluteTiming (* read (Get, <<) the parameters back in *) (* {0.006875, Null} *) meanfn[x_?NumericQ] := Mean[Re@myfun[rr, zz, x]]; Plot3D[ meanfn[t - s], {t, 0, 0.1}, {s, 0, 0.1} ] // AbsoluteTiming 

Mathematica graphics

Given the speed of Dot and the Math Kernel Library, I'm not sure how this could be made faster.

$\endgroup$

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.