annotate extra/integration/quadg.m @ 0:6b33357c7561 octave-forge

Initial revision
author pkienzle
date Wed, 10 Oct 2001 19:54:49 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
1 function int = quadg(fun,xlow,xhigh,tol,trace,p1,p2,p3,p4,p5,p6,p7,p8,p9)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
2 %
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
3 %usage: int = quadg('Fun',xlow,xhigh)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
4 %or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
5 % int = quadg('Fun',xlow,xhigh,tol)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
6 %or
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
7 % int = quadg('Fun',xlow,xhigh,tol,trace,p1,p2,....)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
8 %
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
9 %This function works just like QUAD or QUAD8 but uses a Gaussian quadrature
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
10 %integration scheme. Use this routine instead of QUAD or QUAD8:
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
11 % if higher accuracy is desired (this works best if the function,
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
12 % 'Fun', can be approximated by a power series)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
13 % or if many similar integrations are going to be done (I think less
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
14 % function evaluations will typically be done, but the
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
15 % integration points and the weights must be calculated.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
16 % These are saved between integrations so when QUADG
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
17 % is called again, the points and weights are all ready
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
18 % known.)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
19 % or if the function evaluations are time consuming.
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
20 %Note that if there are discontinuities the integral should be broken up into separate
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
21 %pieces. And if there are singularities, a more appropriate integration quadrature
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
22 %should be used (such as the Gauss-Chebyshev).
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
23
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
24 global b2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
25 global w2
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
26
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
27 if ( exist('tol') != 1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
28 tol=1e-3;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
29 elseif ( tol==[] )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
30 tol=1e-3;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
31 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
32 if ( exist('trace') != 1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
33 trace=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
34 elseif ( trace==[] )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
35 trace=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
36 else
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
37 trace=1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
38 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
39
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
40 %setup string to call the function
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
41 exec_string=['y=',fun,'(x'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
42 num_parameters=nargin-5;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
43 for i=1:num_parameters
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
44 exec_string=[exec_string,',p',int2str(i)];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
45 endfor
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
46 exec_string=[exec_string,');'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
47
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
48 %setup mapping parameters
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
49 jacob=(xhigh-xlow)/2;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
50
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
51 %generate the first two sets of integration points and weights
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
52 if ( exist('b2') != 1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
53 [b2,w2]=grule(2);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
54 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
55
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
56 x=(b2+1)*jacob+xlow;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
57 eval(exec_string);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
58 int_old=sum(w2.*y)*jacob;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
59 if ( trace==1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
60 x_trace=x(:);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
61 y_trace=y(:);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
62 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
63
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
64 converge=0;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
65 for i=1:7
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
66 gnum=int2str(2^(i+1));
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
67 vname = ['b',gnum];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
68 if ( exist(vname) == 0 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
69 estr = ['[b',gnum,',w',gnum,']=grule(',gnum,');'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
70 eval(estr);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
71 estr = ['global b',gnum,' w',gnum,';'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
72 eval(estr);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
73 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
74 estr = ['x=(b',gnum,'+1)*jacob+xlow;'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
75 eval(estr);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
76 eval(exec_string);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
77 estr = ['int=sum(w',gnum,'.*y)*jacob;'];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
78 eval(estr);
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
79
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
80 if ( trace==1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
81 x_trace=[x_trace;x(:)];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
82 y_trace=[y_trace;y(:)];
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
83 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
84
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
85 if ( abs(int_old-int) < abs(tol*int) )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
86 converge=1;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
87 break;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
88 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
89 int_old=int;
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
90 endfor
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
91
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
92 if ( converge==0 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
93 disp('Integral did not converge--singularity likely')
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
94 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
95
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
96 if ( trace==1 )
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
97 plot(x_trace,y_trace,'+')
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
98 endif
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
99
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
100 %gnum,i,length(x_trace)
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
101
6b33357c7561 Initial revision
pkienzle
parents:
diff changeset
102 endfunction