Optimising Monte Carlo simulation

9 views (last 30 days)
Johan Burger
Johan Burger on 7 Dec 2020
Commented: Johan Burger on 10 Dec 2020
I am trying to run a Monte Carlo simulation on a very complex equation (19 input variables) at about 1-10k iterations. Some of the inputs remain constant throughout the computation, while others (8 variables) are randomised at each iteration using the norminv function and a random probability. As you might imagine, this simulation becomes very expensive as the amount of iterations are increased.
Presently, I am using the parfor function on a 4-core laptop with each run needing around 5min per 1000 iterations. The 8 variable inputs are recalculated at each iteration and then passed to a function that calculates the final answer (although I previously had this in the body of the loop and it didn't make much difference).
My question is, how can I optimise this computation? I would need to run several of these simulations for my project and would like to trim down the time.

Answers (1)

Jeff Miller
Jeff Miller on 7 Dec 2020
Some suggestions--hopefully not a waste of your time:
  1. Use the profiler to find out where time is spent, so you can focus your speed-up efforts on those portions of the code.
  2. It sounds like 11 of your variables are fixed across all iterations. Maybe you can compute pieces of your very complex equation that use those variables just once in advance, saving yourself recomputation of those same values at each iteration.
  3. "randomised ...using norminv and a random p" It's probably faster to just generate a random number directly rather than generating p and then looking up the corresponding normal.
  4. "randomised at each iteration..." Its probably faster to generate & store vectors of 1-10k random values before starting the iteration process, and then using the stored random value for each iteration. That cuts down on function calling overhead because you only call the random function(s) once rather than 1-10k times.
  4 Comments
Johan Burger
Johan Burger on 9 Dec 2020
Thank you Jeff. I have thought about my problem and have decided to approach it from another angle. Thanks
Johan Burger
Johan Burger on 10 Dec 2020
Turns out the problem was that I was using the symsum function and calling it 3-4 times per simulation. Instead I just used normal summation and it drastically increased the speed of computation!

Sign in to comment.

Categories

Find more on Parallel Computing in Help Center and File Exchange

Products


Release

R2020b

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!