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}] ]