12 struct quadrature_task
14 quadrature_task(
double value,
double error,
15 double a0,
double b0,
double a1,
double b1,
16 double x00,
double x0c,
double x0n,
17 double xc0,
double xcc,
double xcn,
18 double xn0,
double xnc,
double xnn)
19 : value(value), error(error),
20 a0(a0), b0(b0), a1(a1), b1(b1),
21 x00(x00), x0c(x0c), x0n(x0n),
22 xc0(xc0), xcc(xcc), xcn(xcn),
23 xn0(xn0), xnc(xnc), xnn(xnn)
27 bool operator<(
const quadrature_task& other)
const
29 return std::abs(error) < std::abs(other.error);
53 static const int n = 2*N-1;
54 static const double p[n];
55 static const double w[n];
56 static const double e[n];
63 static const int n = 2*N-1;
64 static const double p[n];
65 static const double w[n];
66 static const double e[n];
77 template<
typename Rule,
typename Function>
78 inline quadrature_result quadrature(Function f,
double a0,
double b0,
double a1,
double b1,
double pg,
double ag)
83 typedef std::vector<quadrature_task> queue_container;
86 typedef queue_container::const_iterator queue_iterator;
89 double values[Rule::n][Rule::n];
92 const int n = Rule::n-1;
93 const int c = (Rule::n-1)/2;
96 for(
int i = 0; i < Rule::n; ++i)
97 for(
int j = 0; j < Rule::n; ++j)
98 values[i][j] = f(0.5*((b0-a0)*Rule::p[i]+a0+b0), 0.5*((b1-a1)*Rule::p[j]+a1+b1));
102 for(
int i = 0; i < Rule::n; ++i)
104 for(
int j = 0; j < Rule::n; ++j)
106 result.value += Rule::w[i]*Rule::w[j]*values[i][j];
107 result.error += Rule::e[i]*Rule::e[j]*values[i][j];
110 result.value = 0.25*(b0-a0)*(b1-a1)*result.value;
111 result.error = 0.25*(b0-a0)*(b1-a1)*std::abs(result.error);
114 queue_container queue;
115 std::make_heap(queue.begin(), queue.end());
118 queue.push_back(quadrature_task(
119 result.value, result.error,
121 values[0][0], values[0][c], values[0][n],
122 values[c][0], values[c][c], values[c][n],
123 values[n][0], values[n][c], values[n][n]
125 std::push_heap(queue.begin(), queue.end());
128 while(result.error > std::abs(result.value)*pg && result.error > ag)
131 quadrature_task task = queue.front();
134 std::pop_heap(queue.begin(), queue.end());
138 for(
int k = 0; k < 4; ++k)
145 b0 = 0.5*(task.a0+task.b0);
147 b1 = 0.5*(task.a1+task.b1);
148 values[0][0] = task.x00;
149 values[0][n] = task.x0c;
150 values[n][0] = task.xc0;
151 values[n][n] = task.xcc;
155 a0 = 0.5*(task.a0+task.b0);
158 b1 = 0.5*(task.a1+task.b1);
159 values[0][0] = task.xc0;
160 values[0][n] = task.xcc;
161 values[n][0] = task.xn0;
162 values[n][n] = task.xnc;
167 b0 = 0.5*(task.a0+task.b0);
168 a1 = 0.5*(task.a1+task.b1);
170 values[0][0] = task.x0c;
171 values[0][n] = task.x0n;
172 values[n][0] = task.xcc;
173 values[n][n] = task.xcn;
177 a0 = 0.5*(task.a0+task.b0);
179 a1 = 0.5*(task.a1+task.b1);
181 values[0][0] = task.xcc;
182 values[0][n] = task.xcn;
183 values[n][0] = task.xnc;
184 values[n][n] = task.xnn;
189 for(
int j = 1; j < n; ++j)
190 values[0][j] = f(0.5*((b0-a0)*Rule::p[0]+a0+b0), 0.5*((b1-a1)*Rule::p[j]+a1+b1));
191 for(
int i = 1; i < n; ++i)
192 for(
int j = 0; j < Rule::n; ++j)
193 values[i][j] = f(0.5*((b0-a0)*Rule::p[i]+a0+b0), 0.5*((b1-a1)*Rule::p[j]+a1+b1));
194 for(
int j = 1; j < n; ++j)
195 values[n][j] = f(0.5*((b0-a0)*Rule::p[n]+a0+b0), 0.5*((b1-a1)*Rule::p[j]+a1+b1));
199 for(
int i = 0; i < Rule::n; ++i)
201 for(
int j = 0; j < Rule::n; ++j)
203 sub.value += Rule::w[i]*Rule::w[j]*values[i][j];
204 sub.error += Rule::e[i]*Rule::e[j]*values[i][j];
207 sub.value = 0.25*(b0-a0)*(b1-a1)*sub.value;
208 sub.error = 0.25*(b0-a0)*(b1-a1)*sub.error;
211 queue.push_back(quadrature_task(
212 sub.value, sub.error,
214 values[0][0], values[0][c], values[0][n],
215 values[c][0], values[c][c], values[c][n],
216 values[n][0], values[n][c], values[n][n]
218 std::push_heap(queue.begin(), queue.end());
224 for(queue_iterator it = queue.begin(); it != queue.end(); ++it)
226 result.value += it->value;
227 result.error += it->error;
229 result.error = std::abs(result.error);
Quadrature rules. Must be of the closed type.
Definition quadrature.h:48
ISOP namespace is for functions related to isoparametric interpolation.
Definition isop.h:7
Clenshaw-Curtis quadrature data.
Definition quadrature.h:52
Lobatto-Kronrod quadrature data.
Definition quadrature.h:62
Subdivided area in quadrature with value and error estimate.
Definition quadrature.h:13
Result of numerical integration.
Definition quadrature.h:72