Re: Compile
- To: mathgroup at smc.vnet.net
- Subject: [mg48314] Re: [mg48302] Compile
- From: Andrzej Kozlowski <akoz at mimuw.edu.pl>
- Date: Sun, 23 May 2004 06:15:40 -0400 (EDT)
- References: <200405220704.DAA08873@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
I wonder how you managed to get an error about Random[NormalDistribution[0,1]], since there are errors in you code that should stop you ever getting to that point. First of all you have the a right square bracket in the wrong place, I mean the last one below: > MCCall=Compile[{{S, K, T, r, div, sig},{M, _Integer},{ N, _Integer}}] secondly, the syntax {S, K, T, r, div, sig} is quite wrong (look at the help for Compile), thirdly you need to load the Statistics`NormalDistribution` package, fourthly, in any case your function is very unlikely to compile well, if at all, so that it will probably be no faster than without compiling. You will do much better to re-write your code in a functional way, using Nest instead of For (For is very inefficient in Mathematica), that alone will give you a substantial speed up. Finally, you might want to have a look at my posting with the subject "strange problems with Random" , otherwise you might be surprised that your answers turn out not to be very accurate. Andrzej Kozlowski On 22 May 2004, at 16:04, John wrote: > Hi, > > i am new to mathematica, i have written a monte carlo simulation for an > option, I wanted to compile the function, but i just get errors > concerning > the Random[NormalDistribution[0,1]] function, could anybody help, > thats the > code: > > MCCall=Compile[{{S, K, T, r, div, sig},{M, _Integer},{ N, _Integer}}], > Module[{dt, nudt, sigsdt, lns, sumct, i, j, lnst, st, ct}, > dt = T/N; > nudt = (r - div - 0.5*sig^2)*dt; > sigsdt = sig*Sqrt[dt]; > lns = Log[S]; > sumct = 0; > i = 1; > j = 1; > a = {}; > For[i = 1, i < M, > lnst = lns; > For[j = 1, j < N, > lnst = lnst + nudt + sigsdt*Random[NormalDistribution[0, 1]]; j++]; > st = Exp[lnst]; > ct = Max[0, (st - K)]; > sumct = sumct + ct; > a = Append[a, sumct/(i*Exp[-r*T])]; i++]; > sumct/(M*Exp[-r*T])]]; > > TIA John >
- References:
- Compile
- From: "John" <john34@sepei.com>
- Compile