24 static constexpr double kRcondThreshold = 1e-10;
27 template<
class Derived>
28 lagrange_basis(
int dimension,
int degree,
const Eigen::MatrixBase<Derived>& points) :
30 RSMESH_ASSERT(points.rows() == basis_size());
32 Eigen::MatrixXd p = mono_basis_.evaluate(points).transpose();
34 if(!is_invertible(p)) {
35 throw std::domain_error(
"The set of points is not unisolvent.");
38 coeffs_ = p.fullPivLu().inverse();
41 template<
class Derived>
42 Eigen::MatrixXd evaluate(
const Eigen::MatrixBase<Derived>& points)
const {
46 template<
class DerivedPo
ints,
class DerivedGradPo
ints>
47 Eigen::MatrixXd evaluate(
const Eigen::MatrixBase<DerivedGradPoints> &points,
48 const Eigen::MatrixBase<DerivedPoints> &grad_points)
const {
49 auto pt = mono_basis_.evaluate(points, grad_points);
51 return coeffs_.transpose() * pt;
55 static bool is_invertible(
const Eigen::MatrixXd& m) {
56 auto svd = m.jacobiSvd();
57 const auto& sigmas = svd.singularValues();
58 if(sigmas(0) == 0.0) {
62 auto rcond = sigmas(sigmas.rows() - 1) / sigmas(0);
63 return rcond >= kRcondThreshold;
67 Eigen::MatrixXd coeffs_;