annotate scripts/general/integral.m @ 29359:7854d5752dd2

maint: merge stable to default.
author John W. Eaton <jwe@octave.org>
date Wed, 10 Feb 2021 10:10:40 -0500
parents a948253f9976 0a5b15007766
children 796f54d4ddbf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
1 ########################################################################
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
2 ##
29358
0a5b15007766 update Octave Project Developers copyright for the new year
John W. Eaton <jwe@octave.org>
parents: 27961
diff changeset
3 ## Copyright (C) 2017-2021 The Octave Project Developers
27918
b442ec6dda5c use centralized file for copyright info for individual contributors
John W. Eaton <jwe@octave.org>
parents: 26376
diff changeset
4 ##
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
5 ## See the file COPYRIGHT.md in the top-level directory of this
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
6 ## distribution or <https://octave.org/copyright/>.
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
7 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
8 ## This file is part of Octave.
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
9 ##
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24159
diff changeset
10 ## Octave is free software: you can redistribute it and/or modify it
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
11 ## under the terms of the GNU General Public License as published by
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24159
diff changeset
12 ## the Free Software Foundation, either version 3 of the License, or
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
13 ## (at your option) any later version.
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
14 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
15 ## Octave is distributed in the hope that it will be useful, but
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
16 ## WITHOUT ANY WARRANTY; without even the implied warranty of
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
17 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
18 ## GNU General Public License for more details.
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
19 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
20 ## You should have received a copy of the GNU General Public License
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
21 ## along with Octave; see the file COPYING. If not, see
24534
194eb4bd202b maint: Update punctuation for GPL v3 license text.
Rik <rik@octave.org>
parents: 24159
diff changeset
22 ## <https://www.gnu.org/licenses/>.
27923
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
23 ##
bd51beb6205e update formatting of copyright notices
John W. Eaton <jwe@octave.org>
parents: 27919
diff changeset
24 ########################################################################
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
25
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
26 ## -*- texinfo -*-
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
27 ## @deftypefn {} {@var{q} =} integral (@var{f}, @var{a}, @var{b})
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
28 ## @deftypefnx {} {@var{q} =} integral (@var{f}, @var{a}, @var{b}, @var{prop}, @var{val}, @dots{})
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
29 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
30 ## Numerically evaluate the integral of @var{f} from @var{a} to @var{b} using
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
31 ## adaptive quadrature.
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
32 ##
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
33 ## @code{integral} is a wrapper for @code{quadcc} (general real-valued, scalar
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
34 ## integrands and limits), @code{quadgk} (integrals with specified integration
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
35 ## paths), and @code{quadv} (array-valued integrands) that is intended to
28753
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28731
diff changeset
36 ## provide @sc{matlab} compatibility. More control of the numerical
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28731
diff changeset
37 ## integration may be achievable by calling the various quadrature functions
e82484e1b2f6 doc: grammarcheck documentation.
Rik <rik@octave.org>
parents: 28731
diff changeset
38 ## directly.
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
39 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
40 ## @var{f} is a function handle, inline function, or string containing the name
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
41 ## of the function to evaluate. The function @var{f} must be vectorized and
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
42 ## return a vector of output values when given a vector of input values.
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
43 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
44 ## @var{a} and @var{b} are the lower and upper limits of integration. Either
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
45 ## or both limits may be infinite or contain weak end singularities. If either
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
46 ## or both limits are complex, @code{integral} will perform a straight line
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
47 ## path integral. Alternatively, a complex domain path can be specified using
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
48 ## the @qcode{"Waypoints"} option (see below).
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
49 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
50 ## Additional optional parameters can be specified using
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
51 ## @qcode{"@var{property}", @var{value}} pairs. Valid properties are:
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
52 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
53 ## @table @code
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
54 ## @item Waypoints
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
55 ## Specifies points to be used in defining subintervals of the quadrature
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
56 ## algorithm, or if @var{a}, @var{b}, or @var{waypoints} are complex then
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
57 ## the quadrature is calculated as a contour integral along a piecewise
28958
6fd6ad758b10 doc: Use @xref, @pxref rather than "see @code{}" in TexInfo.
Rik <rik@octave.org>
parents: 28912
diff changeset
58 ## continuous path. For more detail, @pxref{XREFquadgk,,@code{quadgk}}.
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
59 ##
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
60 ## @item ArrayValued
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
61 ## @code{integral} expects @var{f} to return a scalar value unless
24059
d8e2fffb371c doc: Fix missing braces in quad documentation (bug #52065).
Rik <rik@octave.org>
parents: 24055
diff changeset
62 ## @var{arrayvalued} is specified as true. This option will cause
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
63 ## @code{integral} to perform the integration over the entire array and return
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
64 ## @var{q} with the same dimensions as returned by @var{f}. For more detail
28958
6fd6ad758b10 doc: Use @xref, @pxref rather than "see @code{}" in TexInfo.
Rik <rik@octave.org>
parents: 28912
diff changeset
65 ## @pxref{XREFquadv,,@code{quadv}}.
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
66 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
67 ## @item AbsTol
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
68 ## Define the absolute error tolerance for the quadrature. The default
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
69 ## absolute tolerance is 1e-10 (1e-5 for single).
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
70 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
71 ## @item RelTol
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
72 ## Define the relative error tolerance for the quadrature. The default
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
73 ## relative tolerance is 1e-6 (1e-4 for single).
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
74 ## @end table
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
75 ##
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
76 ## Adaptive quadrature is used to minimize the estimate of error until the
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
77 ## following is satisfied:
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
78 ## @tex
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
79 ## $$error \leq \max \left( AbsTol, RelTol\cdot\vert q\vert \right)$$
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
80 ## @end tex
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
81 ## @ifnottex
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
82 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
83 ## @example
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
84 ## @group
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
85 ## @var{error} <= max (@var{AbsTol}, @var{RelTol}*|@var{q}|).
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
86 ## @end group
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
87 ## @end example
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
88 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
89 ## @end ifnottex
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
90 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
91 ## Known @sc{matlab} incompatibilities:
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
92 ##
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
93 ## @enumerate
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
94 ## @item
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
95 ## If tolerances are left unspecified, and any integration limits or waypoints
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
96 ## are of type @code{single}, then Octave's integral functions automatically
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
97 ## reduce the default absolute and relative error tolerances as specified
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
98 ## above. If tighter tolerances are desired they must be specified.
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
99 ## @sc{matlab} leaves the tighter tolerances appropriate for @code{double}
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
100 ## inputs in place regardless of the class of the integration limits.
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
101 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
102 ## @item
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
103 ## As a consequence of using @code{quadcc}, @code{quadgk}, and @code{quadv},
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
104 ## certain option combinations are not supported. Currently,
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
105 ## @qcode{"ArrayValued"} cannot be combined with @qcode{"RelTol"} or
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
106 ## @qcode{"Waypoints"}.
24102
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
107 ## @end enumerate
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
108 ##
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
109 ## @seealso{integral2, integral3, quad, quadgk, quadv, quadl, quadcc, trapz,
c723faa56ab4 Add missing functions integral2.m and integral3.m (bug #52074).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24062
diff changeset
110 ## dblquad, triplequad}
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
111 ## @end deftypefn
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
112
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
113 function q = integral (f, a, b, varargin)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
114
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
115 if (nargin < 3 || (mod (nargin, 2) == 0))
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
116 print_usage ();
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
117 endif
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
118
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
119 ## quadcc can't handle complex limits or integrands, but quadgk & quadv can.
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
120 ## Check for simple cases of complex limits and integrand.
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
121 f_is_complex = false;
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
122 if (iscomplex (a) || iscomplex (b))
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
123 f_is_complex = true;
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
124 elseif (iscomplex (feval (f, a)) || iscomplex (feval (f, b)))
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
125 f_is_complex = true;
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
126 endif
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
127
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
128 if (nargin == 3)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
129 ## Pass the simplest case directly to general integrator.
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
130 ## Let quadcc function handle input checks on function and limits.
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
131 if (! f_is_complex)
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
132 try
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
133 q = quadcc (f, a, b);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
134 catch quaderror
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
135 if (strcmp (quaderror.message,
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
136 "quadcc: integrand F must return a single, real-valued vector"))
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
137 q = quadgk (f, a, b);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
138 else
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
139 error (quaderror.message);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
140 endif
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
141 end_try_catch
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
142
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
143 else
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
144 ## Complex-valued integral
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
145 q = quadgk (f, a, b);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
146 endif
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
147
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
148 else
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
149 ## Parse options to determine how to call integrator.
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
150 abstol = [];
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
151 reltol = [];
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
152 waypoints = [];
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
153 arrayvalued = false;
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
154
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
155 idx = 1;
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
156 while (idx < nargin - 3)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
157 prop = varargin{idx++};
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
158 if (! ischar (prop))
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
159 error ("integral: property PROP must be a string");
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
160 endif
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
161
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
162 switch (tolower (prop))
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
163 case "reltol"
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
164 reltol = varargin{idx++};
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
165 case "abstol"
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
166 abstol = varargin{idx++};
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
167 case "waypoints"
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
168 waypoints = varargin{idx++}(:);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
169 case "arrayvalued"
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
170 arrayvalued = varargin{idx++};
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
171 otherwise
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
172 error ("integral: unknown property '%s'", prop);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
173 endswitch
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
174 endwhile
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
175
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
176 issingle = (isa (a, "single") || isa (b, "single")
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
177 || isa (waypoints, "single"));
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
178
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
179 if (arrayvalued)
24159
c4dac7a0da7e integral.m: Remove specific code to preserve single type.
Rik <rik@octave.org>
parents: 24155
diff changeset
180 ## Pass vector-valued function to quadv, checking for conflicting params
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
181
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
182 ## FIXME: Replace warning when have array compatible call with waypoints
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
183 if (! isempty (waypoints))
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28753
diff changeset
184 warning (["integral: array-valued quadrature routine currently ", ...
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
185 "unable to handle WayPoints. WayPoints are ignored."]);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
186 endif
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
187
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
188 ## FIXME: Remove warning once we have reltol compatible arrayval'd quadfn
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
189 if (! isempty (reltol))
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28753
diff changeset
190 warning (["integral: array-valued quadrature only accepts AbsTol.", ...
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
191 " RelTol ignored."]);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
192 endif
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
193 if (isempty (abstol))
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
194 abstol = ifelse (issingle, 1e-5, 1e-10);
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
195 endif
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
196
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
197 q = quadv (f, a, b, abstol);
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
198
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
199 else
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
200 if (isempty (abstol))
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
201 abstol = ifelse (issingle, 1e-5, 1e-10);
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
202 endif
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
203 if (isempty (reltol))
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
204 reltol = ifelse (issingle, 1e-4, 1e-6);
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
205 endif
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
206
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
207 if (! isempty (waypoints))
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
208 q = quadgk (f, a, b, "AbsTol", abstol, "RelTol", reltol,
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
209 "WayPoints", waypoints);
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
210 else
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
211 if (! f_is_complex)
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
212 try
29127
a948253f9976 maint: strip trailing spaces from code base.
Rik <rik@octave.org>
parents: 28958
diff changeset
213 q = quadcc (f, a, b, [abstol, reltol]);
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
214 catch quaderror
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
215 if (strcmp (quaderror.message,
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
216 "quadcc: integrand F must return a single, real-valued vector"))
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
217 q = quadgk (f, a, b, "AbsTol", abstol, "RelTol", reltol);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
218 else
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
219 error (quaderror.message);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
220 endif
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
221 end_try_catch
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
222 else
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
223 ## Complex-valued integral
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
224 q = quadgk (f, a, b, "AbsTol", abstol, "RelTol", reltol);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
225 endif
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
226 endif
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
227 endif
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
228 endif
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
229
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
230 endfunction
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
231
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
232
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
233 ## Matlab compatibility tests
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
234 %!test
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
235 %! f = @(x) exp (-x.^2) .* log (x).^2;
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
236 %! emgamma = 0.57721566490153286;
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
237 %! exact = (sqrt (pi)*(8*log (2)^2+8*emgamma*log (2)+pi^2+2*emgamma^2))/16;
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
238 %! assert (integral (f, 0, Inf), exact, -1e-6);
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
239 %! assert (integral (f, 0, Inf, "RelTol", 1e-12), exact, -1e-12);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
240
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
241 %!test # with parameter
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
242 %! f = @(x, c) 1 ./ (x.^3 - 2*x - c);
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
243 %! assert (integral (@(x) f(x,5), 0, 2), -0.4605015338467329, 1e-10);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
244
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
245 %!test # with tolerances
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28753
diff changeset
246 %! f = @(x) log (x);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
247 %! assert (integral (@(x) f(x), 0, 1, "AbsTol", 1e-6), -1, 1e-6);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
248
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
249 %!test # waypoints
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
250 %! f = @(x) 1./(2.*x-1);
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
251 %! assert (integral (f, 0, 0, "Waypoints", [1+1i, 1-1i]), -pi*1i, 1e-10);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
252
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
253 %!test # an array-valued function
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
254 %! f = @(x) sin ((1:5)*x);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
255 %! assert (integral (f, 0, 1, "ArrayValued", true), 1./[1:5]-cos(1:5)./[1:5],
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
256 %! 1e-10);
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
257
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
258 %!test # test single input/output
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28753
diff changeset
259 %! assert (integral (@sin, 0, 1), cos (0)-cos (1), 1e-10);
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
260 %! assert (class (integral (@sin, single (0), 1)), "single");
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
261 %! assert (class (integral (@sin, 0, single (1))), "single");
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
262 %! assert (class (integral (@sin, single (0), single (1))), "single");
28912
0de38a6ef693 maint: Use Octave convention of space after function name in scripts dir.
Rik <rik@octave.org>
parents: 28753
diff changeset
263 %! assert (integral (@sin, 0, 1, "Waypoints", 0.5), cos (0)-cos (1), 1e-10);
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
264 %! assert (class (integral (@sin, 0, 1, "Waypoints", single (0.5))), "single");
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
265 %! assert (class (integral (@sin, single (0), 1, "Waypoints", 0.5)), "single");
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
266 %! assert (class (integral (@sin, 0, single (1), "Waypoints", 0.5)), "single");
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
267
28731
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
268 %!test # test complex argument handling
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
269 %! f = @(x) round (exp (i*x));
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
270 %! assert (integral (f, 0, pi), quadgk (f, 0, pi), eps);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
271 %! assert (integral (f, -1, 1), 2, 5*eps);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
272 %! assert (integral (@sin, -i, i), 0, eps);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
273 %! assert (1.5 * integral (@sqrt, -1, 0), i, eps);
4f1e8a79bd44 integral.m: Fix input validation to handle complex integrands (bug #58636).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 27961
diff changeset
274
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
275 %!test
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
276 %! f = @(x) x.^5 .* exp (-x) .* sin (x);
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
277 %! assert (integral (f, 0, inf, "RelTol", 1e-8, "AbsTol", 1e-12), -15, -1e-8);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
278
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
279 ## tests from quadcc
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
280 %!assert (integral (@sin, -pi, pi), 0, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
281 %!assert (integral (inline ("sin"), -pi, pi), 0, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
282 %!assert (integral ("sin", -pi, pi), 0, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
283 %!assert (integral (@sin, -pi, 0), -2, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
284 %!assert (integral (@sin, 0, pi), 2, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
285 %!assert (integral (@(x) 1./(sqrt (x).*(x+1)), 0, Inf), pi, -1e-6)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
286 %!assert (integral (@(x) 1./(sqrt (x).*(x+1)), 0, Inf,
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
287 %! "AbsTol", 0, "RelTol", 1e-8),
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
288 %! pi, -1e-8)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
289 %!assert (integral (@(x) exp (-x .^ 2), -Inf, Inf), sqrt (pi), 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
290 %!assert (integral (@(x) exp (-x .^ 2), -Inf, 0), sqrt (pi)/2, 1e-10)
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
291
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
292 ## tests from quadgk
24155
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
293 %!assert (integral (@sin,-pi,pi, "WayPoints",0, "AbsTol",1e-6, "RelTol",1e-3),
47dd094a6239 integral.m: Update to use recently changed quadcc and preserve type single (bug #42073).
Nicholas R. Jankowski <jankowskin@asme.org>
parents: 24102
diff changeset
294 %! 0, 1e-6)
27961
27a5cc0614f1 integral.m: Fix failing BIST test after changes to quadgk.
Rik <rik@octave.org>
parents: 27923
diff changeset
295 %!assert (integral (@(x) abs (1 - x.^2), 0, 2, "Waypoints", 1), 2, 1e-10)
27a5cc0614f1 integral.m: Fix failing BIST test after changes to quadgk.
Rik <rik@octave.org>
parents: 27923
diff changeset
296 %!assert (integral (@(z) log (z),1+1i,1+1i, "WayPoints", [1-1i, -1,-1i, -1+1i]),
27a5cc0614f1 integral.m: Fix failing BIST test after changes to quadgk.
Rik <rik@octave.org>
parents: 27923
diff changeset
297 %! complex (0, pi), 1e-10)
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
298
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
299 ## tests from quadv
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
300 ## Test vector-valued functions
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
301 %!assert (integral (@(x) [(sin (x)), (sin (2*x))], 0, pi, "ArrayValued", 1),
27961
27a5cc0614f1 integral.m: Fix failing BIST test after changes to quadgk.
Rik <rik@octave.org>
parents: 27923
diff changeset
302 %! [2, 0], 1e-10)
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
303
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
304 ## Test matrix-valued functions
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
305 %!test
24062
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
306 %! assert (integral (@(x) [x,x,x; x,exp(x),x; x,x,x], 0, 1, "ArrayValued", 1),
6570fdb7d3a0 integral.m: Pass tolerances to underlying integrators, correct precision in BIST tests (bug #42037).
Rik <rik@octave.org>
parents: 24059
diff changeset
307 %! [0.5,0.5,0.5; 0.5,(exp (1) - 1),0.5; 0.5,0.5,0.5], 1e-10);
24055
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
308
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
309 ## Test input validation
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
310 %!error integral (@sin)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
311 %!error integral (@sin, 0)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
312 %!error integral (@sin, 0, 1, 1e-6, true, 4)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
313 %!error integral (@sin, 0, 1, "DummyArg")
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
314 %!error <property PROP must be a string> integral (@sin, 0, 1, 2, 3)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
315 %!error <unknown property 'foo'> integral (@sin, 0, 1, "foo", 3)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
316 %!error integral (@sin, 0, 1, "AbsTol", ones (2,2))
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
317 %!error integral (@sin, 0, 1, "AbsTol", -1)
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
318 %!error integral (@sin, 0, 1, "RelTol", ones (2,2))
2eae2ad53eb9 Add missing function integral.m (bug #42037).
Nicholas R. Jankowski <jankowskin@asme.org>
parents:
diff changeset
319 %!error integral (@sin, 0, 1, "RelTol", -1)