Re: Piecewise Integration Woes
- To: mathgroup at smc.vnet.net
- Subject: [mg63445] Re: Piecewise Integration Woes
- From: Maxim <m.r at inbox.ru>
- Date: Sat, 31 Dec 2005 06:40:49 -0500 (EST)
- References: <dotn06$su2$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
On Wed, 28 Dec 2005 09:47:50 +0000 (UTC), Bruce Colletti
<vze269bv at verizon.net> wrote:
> Re Mathematica 5.2 under WinXP.
>
> h, g, and (presumably f) are continuous functions.
>
> So, what causes the NIntegrate::slwcon warning? Although continuous,
> g(h(x)) isn't always differentiable. Could this be the cause?
>
> Thankx.
>
> Bruce
>
> ------------
>
>
> T = {{16, 113.32}, {20, 68.11}, {900, 0.15}, {1000, 0.13}};
>
> f = Interpolation@T;
>
> h[r_] := Piecewise[{{T[[1, 2]], r < T[[
> 1, 1]]}, {f@r, T[[1, 1]] <= r < T[[-1, 1]]}}, T[[-1, 2]]];
>
> g[x_] := Piecewise at {{0.99, 29 <= x}, {0.99(x - 14.5)/(29 -
> 14.5), 14.5 <= x < 29}}
>
> NIntegrate[g[h@r], {r, 14, 40}, MaxRecursion -> 30]
>
Yes, the corner points are the cause of the problem. You can either
increase MinRecursion as well, or, preferably, find the points where the
integrand is not smooth. PiecewiseExpand gives us the condition 14.5 <=
InterpolatingFunction[...] < 29. Let's find the edges of that interval:
In[5]:= a = r /. FindRoot[f[r] == 14.5, {r, 16}]
Out[5]= 24.83357
In[6:= b = r /. FindRoot[f[r] == 29, {r, 16}]
Out[6]= 23.516274
In[7]:= NIntegrate[g[h[r]], {r, 14, b, a, 40},
AccuracyGoal -> 10, PrecisionGoal -> Infinity] // Timing
Out[7]= {0.031*Second, 10.072554}
In[8]:= NIntegrate[g[h[r]], {r, 14, 40},
MinRecursion -> 10, MaxRecursion -> 20,
AccuracyGoal -> 10, PrecisionGoal -> Infinity] // Timing
Out[8]= {0.203*Second, 10.072554}
In[9]:= %[[2]] - %%[[2]]
Out[9]= -1.0480505*^-11
We can see that the difference between the results is within 10^-10 as
expected.
Maxim Rytin
m.r at inbox.ru