NIntegrate Confusion
- To: mathgroup at smc.vnet.net
- Subject: [mg90605] NIntegrate Confusion
- From: "Timothy Beatty" <timothy.beatty at gmail.com>
- Date: Tue, 15 Jul 2008 06:49:38 -0400 (EDT)
Hi,
I'm using Mathematica 6.0 on OS X 10.5.4
I have a function that returns a matrix of "True" and "False" values.
Any "False" value indicates a failed test.
For example:
In[7]:= GarpOk[{{1., 2.}, {2., 1.}}, {{1., 2.}, {2., 1.}}]
Out[7]= {{True, False}, {False, True}}
Now I'd like to use NIntegrate to compute the area of these tests, I
wrote two versions of a functions which differ only in the way they
return a value of zero or one, GarpRand2 and GarpRand5. However they
produce different results when used with NIntegrate (and Integrate).
In[8]:= GarpRand2[r1_, r2_] := Module[{x11, x12, x21, x22, xrand},
x11 = r1*m[[1]]/p[[1, 1]];
x12 = (1 - r1)*m[[1]]/p[[1, 2]];
x21 = r2*m[[2]]/p[[2, 1]];
x22 = (1 - r2)*m[[2]]/p[[2, 2]];
xrand = {{x11, x12}, {x21, x22}};
Min[Boole[Union[Flatten[GarpOk[p, xrand]]]]]
]
In[9]:= GarpRand5[r1_, r2_] := Module[{x11, x12, x21, x22, xrand},
x11 = r1*m[[1]]/p[[1, 1]];
x12 = (1 - r1)*m[[1]]/p[[1, 2]];
x21 = r2*m[[2]]/p[[2, 1]];
x22 = (1 - r2)*m[[2]]/p[[2, 2]];
xrand = {{x11, x12}, {x21, x22}};
Boole[FreeQ[Union[GarpOk[p, xrand]], False]]
]
In[10]:= Integrate[GarpRand2[x1, x2], {x1, 0, 1}, {x2, 0, 1}]
Out[10]= 0.888889
In[11]:= NIntegrate[GarpRand2[x1, x2], {x1, 0, 1}, {x2, 0, 1}]
Out[11]= 0.888889
In[12]:= Integrate[GarpRand5[x1, x2], {x1, 0, 1}, {x2, 0, 1}]
Out[12]= 0
In[13]:= NIntegrate[GarpRand5[x1, x2], {x1, 0, 1}, {x2, 0, 1}]
During evaluation of In[13]:= NIntegrate::ncvb: NIntegrate failed to
converge to prescribed \
accuracy after 18 recursive bisections in x1 near {x1,x2} = \
{0.666667,0.844124}. NIntegrate obtained 0.` and 0.` for the integral \
and error estimates. >>
Out[13]= 0.
As a test I tried a brute force approach, which yielded similar results.
In[14]:= N[Plus @@
Table[GarpRand2[RandomReal[{0, 1}], RandomReal[{0, 1}]], {100000}]/
100000]
Out[14]= 0.88731
In[15]:= N[Plus @@
Table[GarpRand5[RandomReal[{0, 1}], RandomReal[{0, 1}]], {100000}]/
100000]
Out[15]= 0.8909
I have no idea why these two functions, which to my very untrained eye
do the same thing, obtain different results with Integrate and
NIntegrate. Any help would be very much appreciated.
Tim
P.S. For completeness I've attached the GarpOk function below
In[1]:= rdMatrix[p_, x_] := Module[{i, j, n},
n = Length[x];
Boole /@
Table[p[[i]].x[[i]] >= p[[i]].x[[j]], {i, 1, n}, {j, 1, n}]
]
In[2]:= tClosure[m_] := Sign[MatrixPower[m, Length[m]]]
In[3]:= GarpOk[p_, x_] := Module[{i, j, n, m},
n = Length[x];
m = tClosure[rdMatrix[p, x]];
Table[If[m[[i, j]] == 1 && ( p[[j]] . x[[j]] > p[[j]] . x[[i]]),
False, True], {j, 1, n}, {i, 1, n}]
]