CMP++: Uncertainty Quantification & Bayesian Calibration
Loading...
Searching...
No Matches
integrator.h
Go to the documentation of this file.
1#ifndef INTEGRATOR_H
2#define INTEGRATOR_H
3
4#include <cmp_defines.h>
5
10namespace cmp {
11
46template <typename BasisType>
48 public:
49 Eigen::VectorXd nodes;
50 Eigen::VectorXd weights;
51
52 Quadrature1D(int numPoints) {
53 if(numPoints < 1) throw std::invalid_argument("Points must be >= 1");
54
55 nodes.resize(numPoints);
56 weights.resize(numPoints);
57
58 if(numPoints == 1) {
59 nodes(0) = 0.0;
60 weights(0) = 1.0;
61 return;
62 }
63
64 Eigen::MatrixXd J = BasisType::getJacobiMatrix(numPoints);
65 Eigen::SelfAdjointEigenSolver<Eigen::MatrixXd> solver(J);
66 nodes = solver.eigenvalues();
67 Eigen::MatrixXd evecs = solver.eigenvectors();
68
69 for(int i = 0; i < numPoints; ++i) {
70 weights(i) = evecs(0, i) * evecs(0, i);
71 }
72 }
73
74 double integrate(std::function<double(double)> f) const {
75 double result = 0.0;
76 for(int i = 0; i < nodes.size(); ++i) {
77 result += weights(i) * f(nodes(i));
78 }
79 return result;
80 }
81};
82
107template <typename BasisType>
109 public:
110 Eigen::MatrixXd gridNodes;
111 Eigen::VectorXd gridWeights;
112
113 TensorIntegrator(int dim, int pointsPerDim) {
114 Quadrature1D<BasisType> gq1D(pointsPerDim);
115
116 int totalPoints = std::pow(pointsPerDim, dim);
117 gridNodes.resize(totalPoints, dim);
118 gridWeights.resize(totalPoints);
119
120 for(int i = 0; i < totalPoints; ++i) {
121 int temp = i;
122 double jointWeight = 1.0;
123
124 for(int d = 0; d < dim; ++d) {
125 int idx = temp % pointsPerDim;
126 gridNodes(i, d) = gq1D.nodes(idx);
127 jointWeight *= gq1D.weights(idx);
128 temp /= pointsPerDim;
129 }
130 gridWeights(i) = jointWeight;
131 }
132 }
133
139 double integrate(const std::function<double(const Eigen::VectorXd&)> &f) const {
140 double result = 0.0;
141 for(int i = 0; i < gridNodes.rows(); ++i) {
142 result += gridWeights(i) * f(gridNodes.row(i));
143 }
144 return result;
145 }
146
154 double integrate(const std::function<double(const Eigen::VectorXd&)> &f,
155 const Eigen::VectorXd& p1,
156 const Eigen::VectorXd& p2) const {
157
158 int dim = gridNodes.cols();
159 if(p1.size() != dim || p2.size() != dim) {
160 throw std::invalid_argument("Parameter dimensions must match grid dimensions.");
161 }
162
163 double result = 0.0;
164 Eigen::VectorXd physicalPoint(dim);
165
166 for(int i = 0; i < gridNodes.rows(); ++i) {
167 for(int d = 0; d < dim; ++d) {
168 // Map from Canonical to Physical automatically
169 physicalPoint(d) = BasisType::mapToPhysical(gridNodes(i, d), p1(d), p2(d));
170 }
171 result += gridWeights(i) * f(physicalPoint);
172 }
173 return result;
174 }
175};
176}
177
180#endif // INTEGRATOR_H
One-dimensional quadrature rule generator and integrator.
Definition integrator.h:47
Quadrature1D(int numPoints)
Definition integrator.h:52
double integrate(std::function< double(double)> f) const
Definition integrator.h:74
Eigen::VectorXd nodes
Vector containing the quadrature node points.
Definition integrator.h:49
Eigen::VectorXd weights
Vector containing the corresponding quadrature weights.
Definition integrator.h:50
Multi-dimensional tensor product quadrature integrator.
Definition integrator.h:108
double integrate(const std::function< double(const Eigen::VectorXd &)> &f, const Eigen::VectorXd &p1, const Eigen::VectorXd &p2) const
Definition integrator.h:154
Eigen::MatrixXd gridNodes
Matrix of joint tensor product quadrature nodes (totalPoints x dim).
Definition integrator.h:110
TensorIntegrator(int dim, int pointsPerDim)
Definition integrator.h:113
double integrate(const std::function< double(const Eigen::VectorXd &)> &f) const
Definition integrator.h:139
Eigen::VectorXd gridWeights
Vector of joint tensor product weights (totalPoints).
Definition integrator.h:111
Definition classifier.h:17