GNU Octave  4.4.1
A high-level interpreted language, primarily intended for numerical computations, mostly compatible with Matlab
Quad.h
Go to the documentation of this file.
1 /*
2 
3 Copyright (C) 1993-2018 John W. Eaton
4 
5 This file is part of Octave.
6 
7 Octave is free software: you can redistribute it and/or modify it
8 under the terms of the GNU General Public License as published by
9 the Free Software Foundation, either version 3 of the License, or
10 (at your option) any later version.
11 
12 Octave is distributed in the hope that it will be useful, but
13 WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
16 
17 You should have received a copy of the GNU General Public License
18 along with Octave; see the file COPYING. If not, see
19 <https://www.gnu.org/licenses/>.
20 
21 */
22 
23 #if ! defined (octave_Quad_h)
24 #define octave_Quad_h 1
25 
26 #include "octave-config.h"
27 
28 #include "dColVector.h"
29 #include "fColVector.h"
30 
31 typedef double (*integrand_fcn) (double x);
32 typedef float (*float_integrand_fcn) (float x);
33 
34 // FIXME: would be nice to not have to have this global variable.
35 // Nonzero means an error occurred in the calculation of the integrand
36 // function, and the user wants us to quit.
37 extern OCTAVE_API int quad_integration_error;
38 
39 #include "Quad-opts.h"
40 
41 class
42 OCTAVE_API
43 Quad : public Quad_options
44 {
45 public:
46 
48  : Quad_options (), f (fcn), ff () { }
49 
51  : Quad_options (), f (), ff (fcn) { }
52 
53  virtual ~Quad (void) = default;
54 
55  virtual double integrate (void)
56  {
57  octave_idx_type ier, neval;
58  double abserr;
59  return do_integrate (ier, neval, abserr);
60  }
61 
62  virtual float float_integrate (void)
63  {
64  octave_idx_type ier, neval;
65  float abserr;
66  return do_integrate (ier, neval, abserr);
67  }
68 
69  virtual double integrate (octave_idx_type& ier)
70  {
71  octave_idx_type neval;
72  double abserr;
73  return do_integrate (ier, neval, abserr);
74  }
75 
76  virtual float float_integrate (octave_idx_type& ier)
77  {
78  octave_idx_type neval;
79  float abserr;
80  return do_integrate (ier, neval, abserr);
81  }
82 
83  virtual double integrate (octave_idx_type& ier, octave_idx_type& neval)
84  {
85  double abserr;
86  return do_integrate (ier, neval, abserr);
87  }
88 
89  virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval)
90  {
91  float abserr;
92  return do_integrate (ier, neval, abserr);
93  }
94 
95  virtual double integrate (octave_idx_type& ier, octave_idx_type& neval,
96  double& abserr)
97  {
98  return do_integrate (ier, neval, abserr);
99  }
100 
101  virtual float float_integrate (octave_idx_type& ier, octave_idx_type& neval,
102  float& abserr)
103  {
104  return do_integrate (ier, neval, abserr);
105  }
106 
107  virtual double do_integrate (octave_idx_type& ier, octave_idx_type& neval,
108  double& abserr) = 0;
109 
110  virtual float do_integrate (octave_idx_type& ier, octave_idx_type& neval,
111  float& abserr) = 0;
112 
113 protected:
114 
117 };
118 
119 class
120 OCTAVE_API
121 DefQuad : public Quad
122 {
123 public:
124 
126  : Quad (fcn), lower_limit (0.0), upper_limit (1.0), singularities () { }
127 
128  DefQuad (integrand_fcn fcn, double ll, double ul)
129  : Quad (fcn), lower_limit (ll), upper_limit (ul), singularities () { }
130 
131  DefQuad (integrand_fcn fcn, double ll, double ul,
132  const ColumnVector& sing)
133  : Quad (fcn), lower_limit (ll), upper_limit (ul),
134  singularities (sing) { }
135 
137  : Quad (fcn), lower_limit (0.0), upper_limit (1.0),
138  singularities (sing) { }
139 
140  ~DefQuad (void) = default;
141 
142  double do_integrate (octave_idx_type& ier, octave_idx_type& neval,
143  double& abserr);
144 
145  OCTAVE_NORETURN float do_integrate (octave_idx_type& ier,
146  octave_idx_type& neval, float& abserr);
147 
148 private:
149 
150  double lower_limit;
151  double upper_limit;
152 
154 };
155 
156 class
157 OCTAVE_API
158 IndefQuad : public Quad
159 {
160 public:
161 
162  enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite };
163 
165  : Quad (fcn), bound (0.0), type (bound_to_inf) { }
166 
168  : Quad (fcn), bound (b), type (t) { }
169 
170  ~IndefQuad (void) = default;
171 
172  double do_integrate (octave_idx_type& ier, octave_idx_type& neval,
173  double& abserr);
174 
175  OCTAVE_NORETURN float do_integrate (octave_idx_type& ier,
176  octave_idx_type& neval, float& abserr);
177 
178 private:
179 
180  double bound;
182 };
183 
184 class
185 OCTAVE_API
186 FloatDefQuad : public Quad
187 {
188 public:
189 
191  : Quad (fcn), lower_limit (0.0), upper_limit (1.0), singularities () { }
192 
193  FloatDefQuad (float_integrand_fcn fcn, float ll, float ul)
194  : Quad (fcn), lower_limit (ll), upper_limit (ul), singularities () { }
195 
196  FloatDefQuad (float_integrand_fcn fcn, float ll, float ul,
197  const FloatColumnVector& sing)
198  : Quad (fcn), lower_limit (ll), upper_limit (ul),
199  singularities (sing) { }
200 
202  : Quad (fcn), lower_limit (0.0), upper_limit (1.0),
203  singularities (sing) { }
204 
205  ~FloatDefQuad (void) = default;
206 
207  OCTAVE_NORETURN double do_integrate (octave_idx_type& ier,
208  octave_idx_type& neval, double& abserr);
209 
210  float do_integrate (octave_idx_type& ier, octave_idx_type& neval,
211  float& abserr);
212 
213 private:
214 
215  float lower_limit;
216  float upper_limit;
217 
219 };
220 
221 class
222 OCTAVE_API
223 FloatIndefQuad : public Quad
224 {
225 public:
226 
227  enum IntegralType { bound_to_inf, neg_inf_to_bound, doubly_infinite };
228 
230  : Quad (fcn), bound (0.0), type (bound_to_inf) { }
231 
233  : Quad (fcn), bound (b), type (t) { }
234 
235  ~FloatIndefQuad (void) = default;
236 
237  OCTAVE_NORETURN double do_integrate (octave_idx_type& ier,
238  octave_idx_type& neval, double& abserr);
239 
240  float do_integrate (octave_idx_type& ier, octave_idx_type& neval,
241  float& abserr);
242 
243 private:
244 
245  float bound;
247 };
248 
249 #endif
DefQuad(integrand_fcn fcn, double ll, double ul, const ColumnVector &sing)
Definition: Quad.h:131
FloatIndefQuad(float_integrand_fcn fcn)
Definition: Quad.h:229
IndefQuad(integrand_fcn fcn, double b, IntegralType t)
Definition: Quad.h:167
virtual double integrate(void)
Definition: Quad.h:55
float_integrand_fcn ff
Definition: Quad.h:116
double(* integrand_fcn)(double x)
Definition: Quad.h:31
ColumnVector singularities
Definition: Quad.h:153
virtual float float_integrate(void)
Definition: Quad.h:62
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE * f
double upper_limit
Definition: Quad.h:151
FloatDefQuad(float_integrand_fcn fcn, const FloatColumnVector &sing)
Definition: Quad.h:201
DefQuad(integrand_fcn fcn, const ColumnVector &sing)
Definition: Quad.h:136
IntegralType
Definition: Quad.h:162
OCTAVE_EXPORT octave_value_list return the number of command line arguments passed to Octave If called with the optional argument the function t
Definition: ov-usr-fcn.cc:997
octave_function * fcn
Definition: ov-class.cc:1754
virtual double integrate(octave_idx_type &ier, octave_idx_type &neval, double &abserr)
Definition: Quad.h:95
FloatIndefQuad(float_integrand_fcn fcn, double b, IntegralType t)
Definition: Quad.h:232
DefQuad(integrand_fcn fcn)
Definition: Quad.h:125
FloatColumnVector singularities
Definition: Quad.h:218
FloatDefQuad(float_integrand_fcn fcn, float ll, float ul, const FloatColumnVector &sing)
Definition: Quad.h:196
float upper_limit
Definition: Quad.h:216
Quad(float_integrand_fcn fcn)
Definition: Quad.h:50
double bound
Definition: Quad.h:180
DefQuad(integrand_fcn fcn, double ll, double ul)
Definition: Quad.h:128
Definition: Quad.h:41
virtual float float_integrate(octave_idx_type &ier, octave_idx_type &neval, float &abserr)
Definition: Quad.h:101
Quad(integrand_fcn fcn)
Definition: Quad.h:47
virtual float float_integrate(octave_idx_type &ier, octave_idx_type &neval)
Definition: Quad.h:89
idx type
Definition: ov.cc:3114
float lower_limit
Definition: Quad.h:215
FloatDefQuad(float_integrand_fcn fcn, float ll, float ul)
Definition: Quad.h:193
OCTAVE_API int quad_integration_error
Definition: Quad.cc:41
Definition: Quad.h:119
virtual double integrate(octave_idx_type &ier)
Definition: Quad.h:69
contains a list of points where the integrand has known singularities
Definition: quadcc.cc:1567
virtual double integrate(octave_idx_type &ier, octave_idx_type &neval)
Definition: Quad.h:83
IndefQuad(integrand_fcn fcn)
Definition: Quad.h:164
float bound
Definition: Quad.h:245
double lower_limit
Definition: Quad.h:150
float(* float_integrand_fcn)(float x)
Definition: Quad.h:32
IntegralType type
Definition: Quad.h:181
IntegralType type
Definition: Quad.h:246
b
Definition: cellfun.cc:400
virtual float float_integrate(octave_idx_type &ier)
Definition: Quad.h:76
integrand_fcn f
Definition: Quad.h:115
FloatDefQuad(float_integrand_fcn fcn)
Definition: Quad.h:190
F77_RET_T const F77_REAL const F77_REAL F77_REAL &F77_RET_T const F77_DBLE const F77_DBLE F77_DBLE &F77_RET_T const F77_DBLE F77_DBLE &F77_RET_T const F77_REAL F77_REAL &F77_RET_T const F77_DBLE * x