Re: Integrate vs NIntegrate
- To: mathgroup at smc.vnet.net
- Subject: [mg46882] Re: [mg46868] Integrate vs NIntegrate
- From: Anton Antonov <antonov at wolfram.com>
- Date: Fri, 12 Mar 2004 23:39:32 -0500 (EST)
- References: <200403120702.CAA25536@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Mukhtar Bekkali wrote:
>I am confused why NIntegrate misbehaves on such a simple function as mine.
>
>Here is what I have:
>
>In:
>
>f=D[1/(1+(1+(a-b)^2)),a];
>g=Integrate[f*b*(1-b)^2,{b,0,1},Assumptions->0<a<1];
>FindRoot[g==0,{a,0,1}]
>
>Out:
>
>a->0.397207
>
>However, since Integrate takes long, I tried to use NIntegrate instead and
>this is what I get
>
>In:
>
>f=D[1/(1+(1+(a-b)^2)),a];
>g:=NIntegrate[f*b*(1-b)^2,{b,0,1}];
>FindRoot[g==0,{a,0,1}]
>
>Out:
>
>a->1
>
>or, FindRoot+NIntegrate give me the upper boundary of a. If I abandon the
>secant method and turn to Newton, i.e. use
>FindRoot[g==0,{a,0.5}] instead then I get the message that Jacobian is
>singular at a=0.5 and get no solution. Perturbing the starting value of a
>does not help.
>
>What is going on here?
>
>
Your NIntegrate input evaluates with the messages saying the computation
has failed:
In[1]:= f = D[1/(1 + (1 + (a - b)^2)), a];
In[2]:= g := NIntegrate[f*b*(1 - b)^2, {b, 0, 1}];
In[3]:= FindRoot[g == 0, {a, 0, 1}]
2
NIntegrate::inum: Integrand f b (1 - b) is not numerical at {b} = {0.5}.
FindRoot::cvmit:
Failed to converge to the requested accuracy or precision within 100
iterations.
Out[3]= {a -> 1.}
The Integrate and NIntegrate results coincide if we can rewrite the code
above as
In[4]:= Clear[f, g]
In[5]:=f[(a_)?NumberQ] := Evaluate[D[1/(1 + (1 + (a - b)^2)), a]];
In[6]:=g[(a_)?NumberQ] := NIntegrate[f[a]*b*(1 - b)^2,{b, 0, 1}];
In[7]:=FindRoot[g[a] == 0, {a, 0, 1}]
NIntegrate::ploss:
Numerical integration stopping due to loss of precision. Achieved neither
the requested PrecisionGoal nor AccuracyGoal; suspect one of the
following: highly oscillatory integrand or the true value of the
integral
is 0. If your integrand is oscillatory try using the option
Method->Oscillatory in NIntegrate.
NIntegrate::ploss:
Numerical integration stopping due to loss of precision. Achieved neither
the requested PrecisionGoal nor AccuracyGoal; suspect one of the
following: highly oscillatory integrand or the true value of the
integral
is 0. If your integrand is oscillatory try using the option
Method->Oscillatory in NIntegrate.
Out[7]= {a -> 0.397861}
You can further refer to the technical documentation explaining the
evaluation of the arguments by the numerical functions
http://support.wolfram.com/mathematica/mathematics/numerics/nsumerror.html
--
Anton Antonov
Wolfram Research, Inc.
- References:
- Integrate vs NIntegrate
- From: "Mukhtar Bekkali" <mbekkali@hotmail.com>
- Integrate vs NIntegrate