# Double Integral

 1 So I have equations: B(x,d,h,G)=(a01+b01*x+c01*x^2+d01*x^3) + (a02+b02*x+c02*x^2+d02*x^3)*h + (a11+b11*x+c11*x^2+d11*x^3)*(G/d) + (a12+b12*x+c12*x^2+d12*x^3)*(G/d)*h + (a21+b21*x+c21*x^2+d21*x^3)*(G/d)^2 + (a22+b22*x+c22*x^2+d22*x^3)*((G/d)^2)*h normal(x,av,sd)=(1/(sd*sqrt(2*pi)))*exp(-(x-av)^2/(2*sd^2)) brk(x,d,h,D,H,Dstd,Hstd,G)=B(x,d,h,G)*normal(d,D,Dstd)*normal(h,H,Hstd)  (a##-d## are all decimals) And I want to double integrate over d and h. So just for example I can integrate over just d: f(x) = break1(x,d,11.16,2.85,11.16,0.61,13.85,.5).integrate(d,0,infinity) f(500).numerical_approx() 1.04299933381999  and it evaluates just fine. Likewise if I put in an value for d and integrate over h, it also produces a value. So I want the numerical approximation of this double integral, but when I try for it using: f(x) = break1(x,d,h,2.85,11.16,0.61,13.85,.5).integrate(d,0,infinity).integrate(h,0,infinity) f(500).numerical_approx() /home/wil/sage/local/lib/python2.6/site-packages/sage/symbolic/integration/integral.pyc in _evalf_(self, f, x, a, b, parent) 199 # The gsl routine returns a tuple, which also contains the error. 200 # We only return the result. --> 201 return numerical_integral(f, a, b)[0] 202 203 def _tderivative_(self, f, x, a, b, diff_param=None): /home/wil/sage/local/lib/python2.6/site-packages/sage/gsl/integration.so in sage.gsl.integration.numerical_integral (sage/gsl/integration.c:1551)() ValueError: Integrand has wrong number of parameters  At any rate, I think what is happening is that it is trying to evaluate the inside integral numerically first perhaps, which it is not able to do as it has a variable? I tried using the lambda in the first answer, and I was able to evaluate, but I had to set it to max_points=10 to get an answer that was even close to correct, plus I could find no way to plot that one. Thanks for any help! Wil asked Aug 25 '10 willmwade 47 ● 3 ● 5 ● 8

 1 You could try with numerical_integral. You didn't provide definition of B(), so here is example with simpler function: sage: var('d h') (d, h) sage: integral(integral(exp(-(h-1)^2-(d-2)^2), d, 0,Infinity), h, 0, Infinity) 1/4*pi + 1/4*(pi + pi*erf(1))*erf(2) + 1/4*pi*erf(1) sage: n(_) 2.88773776713433 sage: numerical_integral(lambda h: numerical_integral(lambda d:exp(-(h-1)^2-(d-2)^2), 0,Infinity)[0], 0, Infinity) (2.8877377671374997, 2.8275945874944256e-06)  BTW: I'd like to know how to do the above without 'lambda'. BTW2: Are you sure your integral converges at d=0? posted Aug 25 '10 kkumer 96 ● 2 ● 4 ● 6 Yes, even running it through numerical_integral I get the response of "Integrand has wrong number of parameters" I broke down the equations to the smallest I could get and still get the error: integral(integral((1/d)*h*e^d*e^(h/2),d,4,5),h,4,5) That will cause the same error. Ideas? willmwade (Aug 26 '10) Hm. I am puzzled. This works for me: sage: version() 'Sage Version 4.4.4, Release Date: 2010-06-23' sage: numerical_integral(lambda h: numerical_integral(lambda d:(1/d)*h*e^d*e^(h/2),4,5)[0],4,5)[0] 894.91270304016609 kkumer (Aug 26 '10) Well that does work for me as well. What is the "[0]" after each integral? I am trying this on my original equation, but it will take a little while. I will post the result when it finally completes. Thanks for your help! willmwade (Aug 26 '10) The full equation takes a really long time. I am guessing that it is just trying to be too precise. I don't need much. Anyway to decrease the precision? willmwade (Aug 26 '10) I figured out what the [0] was! It was limiting the return to only the value and leaving out the error calculation. willmwade (Aug 26 '10)

[hide preview]