Re: Compiled function
- To: mathgroup at smc.vnet.net
- Subject: [mg93845] Re: Compiled function
- From: SigmundV <sigmundv at gmail.com>
- Date: Thu, 27 Nov 2008 05:28:39 -0500 (EST)
- References: <gggqfq$320$1@smc.vnet.net> <ggj7fo$j5d$1@smc.vnet.net>
Hello, Thank you for the answer, Michael. How can you conclude that the code does not compile fully in either case? I used the With construct so that I would not have to change the Module each time I wanted a new function fa. I also agree that Compile is scarcely documented. Perhaps someone can tell us the reason for this. /Sigmund On Nov 26, 11:13 am, Michael Weyrauch <michael.weyra... at gmx.de> wrote: > Hello, > > if you look at the compiled code, you will see, that it does not > fully compile in both cases. It's only somewhat worse in case of > fa with Piecewice[], since expressions with the Head Piecewise cannot be > compiled anyway, since compiled code only supports real, complex, > integer and a few other basic data. > > I suggest to rewrite the code using IF[] or other Mathematica > constructs, which can be compiled easily. > > (Writing code that compiles properly in Mathematica is more an art than > a science since Compile[ ] is really poorly documented. I hope this will > change in the (distant?) future...) > > Michael > > SigmundV schrieb: > > > Dear group, > > > Consider the following: > > > derData[data_, h_] := (Drop[data, 1] - Drop[data, -1])/h; > > front = With[ > > {fa = > > Function[{x, y}, Piecewise[{{0, 2 <= x <= 3 && 2 <= y = <= 3}}, 1], > > Listable], > > fc = Function[{x, y}, (x y + 10)^0]}, > > Compile[{{r, _Real, 2}, {dt, _Real}, {\[Theta], _Real}}, > > Module[{x, y, a, b, c, C = Cos[\[Theta]], S = Sin[\[Theta]]= , da, > > db, dc, dx, dy, cxy, xy, cxyxy, xnew, ynew, > > dphi = 2 \[Pi]/1000}, > > > x = r[[All, 1]]; y = r[[All, 2]]; > > dx = derData[x, dphi]; dx = Join[dx, {dx[[1]]}]; > > dy = derData[y, dphi]; dy = Join[dy, {dy[[1]]}]; > > > a = fa[x, y]; > > b = 2 a; c = fc[x, y]; > > da = derData[a, dphi]; da = Join[da, {da[[1]]}]; db = = 2 da; > > dc = derData[c, dphi]; dc = Join[dc, {dc[[1]]}]; > > > cxy = dc dt + S dx + C dy; xy = C dx - S dy; > > cxyxy = a^2 cxy^2 + b^2 xy^2; > > > xnew = > > x + dt c S + dt^2 (-a^2 b db (dc dt S + dx))/cxyxy + > > dt (a^2 C cxy - b^2 S xy) Sqrt[cxyxy - a^2 db^2 dt^2]/cx= yxy; > > ynew = > > y + dt c C + dt^2 (-a^2 b db (dc dt C + dy))/cxyxy - > > dt (a^2 S cxy + b^2 C xy) Sqrt[cxyxy - a^2 db^2 dt^2]/cx= yxy; > > > Transpose[{xnew, ynew}] > > > ] > > ] > > ]; > > > As you see, fa is a piecewise function, but the module won't compile. > > However, when fa is a continuous function, like Exp[-(x^2 + y^2)], the > > module compiles without problems. Can anyone shed some light on this? > > Why does the compilation work in the latter case, but not in the > > first? > > > King regards, > > Sigmund Vestergaard