help-octave
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Using quad() for multidimensional integration


From: Ted Harding
Subject: Re: Using quad() for multidimensional integration
Date: Thu, 17 Aug 1995 10:09:47 +0200 (BST)

( Re Message From: Vinayak Dutt )
> 
> I am trying to use Octave to do multidimensional integration using the
> quadrature method: quad(). I have a triple integral of type:
> 
> 
> (TeX Notation)
> 
> \int_{x=0}^{R} F(x)  \int_{y=0}^{f(x)} G(y) \int_{0}^{g(y)}  H(z) dz dy dx
> 
> I guess, th exact integral does not matter, except that its triple integral.
> 
> So I implement this by having the integral function itself involve another
> integration using quad() which again involves another integration.
> 
> a = quad('func1',x1,x2);
> 
> % and
> 
> function f2 = func1(x)
>   y1=0;
>   y2 = f(x);
>   f2 = F(x)*quad('func2',y1,y2);
> endfunction
> 
> % and
> 
> function f3 = func2(y)
>   z1 = 0;
>   z2 = g(y);
>   f3 = G(y)*quad('H',z1,z2);
> endfunction
> 
> 
> But when I do triple integral this way, I find that first two quadratures are 
> not
> evaulated at all. The functions func1 and func2 were evaluated only once. Only
> func2 was used to completely evaluate func1 for that single func1 evaluation.
> It seems the recursion in quad() is somehow killing the hiher level quad() 
> evaluation.
> 
> Could this be due to usage of some globals in quad() which make it 
> non-recursive?
> 
> Any comments?
> 
> I am using Octave-1.1.1 on SPARC-Solaris2.4 with gcc2.6.3.
> 
****************************************************************************
There do seem to be problems here. I tried a simpler task:

   \int_0^1 \int_0^x y dy dx   [Ans = 1/6].

First the function definitions (note the trace prints):--
-----------------------------------------------------------------
#script file
1;

function v=V(y)
fprintf(stdout,"V(%4.2f)\n",y);               ## printout on entry
v=y;
endfunction

function u = U(x)
fprintf(stdout,"U(%4.2f)\n",x);               ## printout on entry
u = quad('V',0,x);
fprintf(stdout,"U(0,%4.2f) = %4.2f\n",x,u);   ## printout on exit
endfunction
-----------------------------------------------------------------
Next, execute "quad('U',0,1)". Results:--
U(0.50)          <-----  "U" is entered here for first time
V(0.25)          <-----  "V" here for first time
V(0.01)
V(0.49)
....      [all "V"] 21 V's in all
V(0.39)
V(0.18)
V(0.32)
U(0,0.50) = 0.12  <----- first "U" completes here
V(0.01)
V(0.49)
V(0.03)
....      [all "V"] 86 V's in all
V(0.00)
V(0.00)
V(0.00)
V(0.00)
ans = 0           <----- end of computation

Therefore it appears that "U" is entered once only, for the bottom half of
the bisection of (0,1). This is similar to what Vinayak observed.

Secondly, however, I am seriously concerned that it should take so many
iterations of [what I presume is] Simpson's rule in order to get the
quadrature of "y dy" (in "V"). It should come out almost at once.

I am wondering, given the number of calls to V, if octave is running out
of stack space.

As a general comment, it would not be considered efficient practice to
recursively apply a crude quadrature rule for repeated integration, but
that is another story. The above example (unless I have made some subtle
error) should have worked.

Comments?

Ted.                                    (address@hidden)

reply via email to

[Prev in Thread] Current Thread [Next in Thread]