Re: Compiled function with NIntegrate
- To: mathgroup at smc.vnet.net
- Subject: [mg52596] Re: Compiled function with NIntegrate
- From: Peter Pein <petsie at arcor.de>
- Date: Fri, 3 Dec 2004 03:54:17 -0500 (EST)
- References: <comgvp$9hg$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Alexei Akolzin wrote:
> Hello,
>
> I wonder why NIntegrate gives the following error with compiled functions:
>
> In: f = Sin[x];
> In: fc = Compile[{x},f];
>
> In: fc[1]
> Out: 0.841471
>
> In: NIntegrate[fc[x], {x, 0, 1}]
> Out: CompiledFunction::"cfsa" : Argument x at position 1 should be a
> machine-size real number.
> or
> Out: CompiledFunction::cfsa: Argument NIntegrate`Private`XX7 at position 1
> should be a machine-size real number.
>
> It is true that NIntegrate compiles functions by default. This was one of
> the suggestions found in the archive if not to deal, but to get around the
> problem. However, my particular function f takes around 10 minutes to
> evaluate for a single argument value. I never had patience to wait long
> enough (hours) for a result from NIntegrate to appear, with "Compiled"
> option set or not.
>
> To speed things up I used optimization package "optimize.m":
>
> In: fc = Compile[{x},Optimize[f]].
>
> This helped a lot, with fc[1] ("1", for example) being evaluated in a matter
> of mere seconds. But the problem now is that NIntegrate does not want to
> work with my function.
>
> So, the question is: is there any way to get my compiled function, as it is,
> into NIntegrate?
>
> Thanks,
> Alexei.
>
In[1]:=
f = Sin[x];
In[2]:= (* see _documentation_ *)
Attributes[Compile]
Out[2]=
{HoldAll, Protected}
(* ^^^^^^^ *)
In[3]:=
fc = Compile[{x}, Evaluate[f]]
Out[3]=
CompiledFunction[{x}, Sin[x], "-CompiledCode-"]
In[4]:=
fc[1]
Out[4]=
0.841471
In[5]:=
NIntegrate[fc[x], {x, 0, \[Pi]}]
Out[5]=
2.
--
Peter Pein
10245 Berlin