Mercurial > octave
comparison scripts/general/quadl.m @ 30893:e1788b1a315f
maint: Use "fcn" as preferred abbreviation for "function" in m-files.
* accumarray.m, accumdim.m, quadl.m, quadv.m, randi.m, structfun.m,
__is_function__.m, uigetfile.m, uimenu.m, uiputfile.m, doc_cache_create.m,
colorspace_conversion_input_check.m, imageIO.m, argnames.m, vectorize.m,
vectorize.m, normest1.m, inputname.m, nthargout.m, display_info_file.m,
decic.m, ode15i.m, ode15s.m, ode23.m, ode23s.m, ode45.m, odeset.m,
check_default_input.m, integrate_adaptive.m, ode_event_handler.m,
runge_kutta_23.m, runge_kutta_23s.m, runge_kutta_45_dorpri.m,
runge_kutta_interpolate.m, starting_stepsize.m, __all_opts__.m, fminbnd.m,
fminsearch.m, fminunc.m, fsolve.m, fzero.m, sqp.m, fplot.m, plotyy.m,
__bar__.m, __ezplot__.m, flat_entry.html, profexport.m, movfun.m, bicg.m,
bicgstab.m, cgs.m, eigs.m, gmres.m, pcg.m, __alltohandles__.m, __sprand__.m,
qmr.m, tfqmr.m, dump_demos.m:
Replace "func", "fun", "fn" in documentation and variable names with "fcn".
author | Rik <rik@octave.org> |
---|---|
date | Mon, 04 Apr 2022 18:14:56 -0700 |
parents | 796f54d4ddbf |
children | 597f3ee61a48 |
comparison
equal
deleted
inserted
replaced
30892:1a3cc2811090 | 30893:e1788b1a315f |
---|---|
26 ## -*- texinfo -*- | 26 ## -*- texinfo -*- |
27 ## @deftypefn {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}) | 27 ## @deftypefn {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}) |
28 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}) | 28 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}) |
29 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}, @var{trace}) | 29 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}, @var{trace}) |
30 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}, @var{trace}, @var{p1}, @var{p2}, @dots{}) | 30 ## @deftypefnx {} {@var{q} =} quadl (@var{f}, @var{a}, @var{b}, @var{tol}, @var{trace}, @var{p1}, @var{p2}, @dots{}) |
31 ## @deftypefnx {} {[@var{q}, @var{nfun}] =} quadl (@dots{}) | 31 ## @deftypefnx {} {[@var{q}, @var{nfev}] =} quadl (@dots{}) |
32 ## | 32 ## |
33 ## Numerically evaluate the integral of @var{f} from @var{a} to @var{b} using | 33 ## Numerically evaluate the integral of @var{f} from @var{a} to @var{b} using |
34 ## an adaptive @nospell{Lobatto} rule. | 34 ## an adaptive @nospell{Lobatto} rule. |
35 ## | 35 ## |
36 ## @var{f} is a function handle, inline function, or string containing the name | 36 ## @var{f} is a function handle, inline function, or string containing the name |
53 ## @var{f}. To use default values for @var{tol} and @var{trace}, one may pass | 53 ## @var{f}. To use default values for @var{tol} and @var{trace}, one may pass |
54 ## empty matrices ([]). | 54 ## empty matrices ([]). |
55 ## | 55 ## |
56 ## The result of the integration is returned in @var{q}. | 56 ## The result of the integration is returned in @var{q}. |
57 ## | 57 ## |
58 ## The optional output @var{nfun} indicates the total number of function | 58 ## The optional output @var{nfev} indicates the total number of function |
59 ## evaluations performed. | 59 ## evaluations performed. |
60 ## | 60 ## |
61 ## Reference: @nospell{W. Gander and W. Gautschi}, @cite{Adaptive Quadrature - | 61 ## Reference: @nospell{W. Gander and W. Gautschi}, @cite{Adaptive Quadrature - |
62 ## Revisited}, BIT Vol.@: 40, No.@: 1, March 2000, pp.@: 84--101. | 62 ## Revisited}, BIT Vol.@: 40, No.@: 1, March 2000, pp.@: 84--101. |
63 ## @url{https://www.inf.ethz.ch/personal/gander/} | 63 ## @url{https://www.inf.ethz.ch/personal/gander/} |
70 ## Reference: Gander, Computermathematik, Birkhaeuser, 1992. | 70 ## Reference: Gander, Computermathematik, Birkhaeuser, 1992. |
71 | 71 |
72 ## 2003-08-05 Shai Ayal | 72 ## 2003-08-05 Shai Ayal |
73 ## * permission from author to release as GPL | 73 ## * permission from author to release as GPL |
74 | 74 |
75 function [q, nfun] = quadl (f, a, b, tol = [], trace = false, varargin) | 75 function [q, nfev] = quadl (f, a, b, tol = [], trace = false, varargin) |
76 | 76 |
77 if (nargin < 3) | 77 if (nargin < 3) |
78 print_usage (); | 78 print_usage (); |
79 endif | 79 endif |
80 | 80 |
95 if (isempty (trace)) | 95 if (isempty (trace)) |
96 trace = false; | 96 trace = false; |
97 endif | 97 endif |
98 | 98 |
99 y = feval (f, [a, b], varargin{:}); | 99 y = feval (f, [a, b], varargin{:}); |
100 nfun = 1; | 100 nfev = 1; |
101 | 101 |
102 fa = y(1); | 102 fa = y(1); |
103 fb = y(2); | 103 fb = y(2); |
104 | 104 |
105 h = b - a; | 105 h = b - a; |
106 | 106 |
107 [q, nfun, hmin] = adaptlobstp (f, a, b, fa, fb, Inf, nfun, abs (h), | 107 [q, nfev, hmin] = adaptlobstp (f, a, b, fa, fb, Inf, nfev, abs (h), |
108 tol, trace, varargin{:}); | 108 tol, trace, varargin{:}); |
109 | 109 |
110 if (nfun > 10_000) | 110 if (nfev > 10_000) |
111 warning ("quadl: maximum iteration count reached -- possible singular integral"); | 111 warning ("quadl: maximum iteration count reached -- possible singular integral"); |
112 elseif (any (! isfinite (q(:)))) | 112 elseif (any (! isfinite (q(:)))) |
113 warning ("quadl: infinite or NaN function evaluations were returned"); | 113 warning ("quadl: infinite or NaN function evaluations were returned"); |
114 elseif (hmin < (b - a) * eps) | 114 elseif (hmin < (b - a) * eps) |
115 warning ("quadl: minimum step size reached -- possible singular integral"); | 115 warning ("quadl: minimum step size reached -- possible singular integral"); |
116 endif | 116 endif |
117 | 117 |
118 endfunction | 118 endfunction |
119 | 119 |
120 function [q, nfun, hmin] = adaptlobstp (f, a, b, fa, fb, q0, nfun, hmin, | 120 function [q, nfev, hmin] = adaptlobstp (f, a, b, fa, fb, q0, nfev, hmin, |
121 tol, trace, varargin) | 121 tol, trace, varargin) |
122 | 122 |
123 persistent alpha = sqrt (2/3); | 123 persistent alpha = sqrt (2/3); |
124 persistent beta = 1 / sqrt (5); | 124 persistent beta = 1 / sqrt (5); |
125 | 125 |
126 if (nfun > 10_000) | 126 if (nfev > 10_000) |
127 q = q0; | 127 q = q0; |
128 return; | 128 return; |
129 endif | 129 endif |
130 | 130 |
131 h = (b - a) / 2; | 131 h = (b - a) / 2; |
134 ml = m - beta*h; | 134 ml = m - beta*h; |
135 mr = m + beta*h; | 135 mr = m + beta*h; |
136 mrr = m + alpha*h; | 136 mrr = m + alpha*h; |
137 x = [mll, ml, m, mr, mrr]; | 137 x = [mll, ml, m, mr, mrr]; |
138 y = feval (f, x, varargin{:}); | 138 y = feval (f, x, varargin{:}); |
139 nfun += 1; | 139 nfev += 1; |
140 fmll = y(1); | 140 fmll = y(1); |
141 fml = y(2); | 141 fml = y(2); |
142 fm = y(3); | 142 fm = y(3); |
143 fmr = y(4); | 143 fmr = y(4); |
144 fmrr = y(5); | 144 fmrr = y(5); |
148 if (abs (b - a) < hmin) | 148 if (abs (b - a) < hmin) |
149 hmin = abs (b - a); | 149 hmin = abs (b - a); |
150 endif | 150 endif |
151 | 151 |
152 if (trace) | 152 if (trace) |
153 disp ([nfun, a, b-a, i1]); | 153 disp ([nfev, a, b-a, i1]); |
154 endif | 154 endif |
155 | 155 |
156 ## Force at least one adaptive step (nfun > 2 test). | 156 ## Force at least one adaptive step (nfev > 2 test). |
157 if ((abs (i1-i2) < tol || mll <= a || b <= mrr) && nfun > 2) | 157 if ((abs (i1-i2) < tol || mll <= a || b <= mrr) && nfev > 2) |
158 q = i1; | 158 q = i1; |
159 else | 159 else |
160 q = zeros (6, 1, class (x)); | 160 q = zeros (6, 1, class (x)); |
161 [q(1), nfun, hmin] = adaptlobstp (f, a , mll, fa , fmll, q0/6, nfun, hmin, | 161 [q(1), nfev, hmin] = adaptlobstp (f, a , mll, fa , fmll, q0/6, nfev, hmin, |
162 tol, trace, varargin{:}); | 162 tol, trace, varargin{:}); |
163 [q(2), nfun, hmin] = adaptlobstp (f, mll, ml , fmll, fml , q0/6, nfun, hmin, | 163 [q(2), nfev, hmin] = adaptlobstp (f, mll, ml , fmll, fml , q0/6, nfev, hmin, |
164 tol, trace, varargin{:}); | 164 tol, trace, varargin{:}); |
165 [q(3), nfun, hmin] = adaptlobstp (f, ml , m , fml , fm , q0/6, nfun, hmin, | 165 [q(3), nfev, hmin] = adaptlobstp (f, ml , m , fml , fm , q0/6, nfev, hmin, |
166 tol, trace, varargin{:}); | 166 tol, trace, varargin{:}); |
167 [q(4), nfun, hmin] = adaptlobstp (f, m , mr , fm , fmr , q0/6, nfun, hmin, | 167 [q(4), nfev, hmin] = adaptlobstp (f, m , mr , fm , fmr , q0/6, nfev, hmin, |
168 tol, trace, varargin{:}); | 168 tol, trace, varargin{:}); |
169 [q(5), nfun, hmin] = adaptlobstp (f, mr , mrr, fmr , fmrr, q0/6, nfun, hmin, | 169 [q(5), nfev, hmin] = adaptlobstp (f, mr , mrr, fmr , fmrr, q0/6, nfev, hmin, |
170 tol, trace, varargin{:}); | 170 tol, trace, varargin{:}); |
171 [q(6), nfun, hmin] = adaptlobstp (f, mrr, b , fmrr, fb , q0/6, nfun, hmin, | 171 [q(6), nfev, hmin] = adaptlobstp (f, mrr, b , fmrr, fb , q0/6, nfev, hmin, |
172 tol, trace, varargin{:}); | 172 tol, trace, varargin{:}); |
173 q = sum (q); | 173 q = sum (q); |
174 endif | 174 endif |
175 | 175 |
176 endfunction | 176 endfunction |
187 %!assert (quadl (@(x,a,b) sin (a + b*x), 0, 1, [], [], 2, 3), | 187 %!assert (quadl (@(x,a,b) sin (a + b*x), 0, 1, [], [], 2, 3), |
188 %! cos (2)/3 - cos (5)/3, 1e-6) | 188 %! cos (2)/3 - cos (5)/3, 1e-6) |
189 | 189 |
190 ## test different tolerances. | 190 ## test different tolerances. |
191 %!test | 191 %!test |
192 %! [q, nfun1] = quadl (@(x) sin (2 + 3*x).^2, 0, 10, 0.5, []); | 192 %! [q, nfev1] = quadl (@(x) sin (2 + 3*x).^2, 0, 10, 0.5, []); |
193 %! assert (q, (60 + sin (4) - sin (64))/12, 0.5); | 193 %! assert (q, (60 + sin (4) - sin (64))/12, 0.5); |
194 %! [q, nfun2] = quadl (@(x) sin (2 + 3*x).^2, 0, 10, 0.1, []); | 194 %! [q, nfev2] = quadl (@(x) sin (2 + 3*x).^2, 0, 10, 0.1, []); |
195 %! assert (q, (60 + sin (4) - sin (64))/12, 0.1); | 195 %! assert (q, (60 + sin (4) - sin (64))/12, 0.1); |
196 %! assert (nfun2 > nfun1); | 196 %! assert (nfev2 > nfev1); |
197 | 197 |
198 %!test # test single input/output | 198 %!test # test single input/output |
199 %! assert (class (quadl (@sin, 0, 1)), "double"); | 199 %! assert (class (quadl (@sin, 0, 1)), "double"); |
200 %! assert (class (quadl (@sin, single (0), 1)), "single"); | 200 %! assert (class (quadl (@sin, single (0), 1)), "single"); |
201 %! assert (class (quadl (@sin, 0, single (1))), "single"); | 201 %! assert (class (quadl (@sin, 0, single (1))), "single"); |