20 gsMatrix<T> gsQuasiInterpolate<T>::localIntpl(
const gsBasis<T> &bb,
21 const gsFunction<T> &fun,
23 const gsMatrix<T> &ab)
25 gsMatrix<T> bev, fev, pts, tmp;
30 bb .eval_into(pts, bev);
31 fun.eval_into(pts, fev);
32 bev.transposeInPlace();
33 fev.transposeInPlace();
34 tmp = bev.partialPivLu().solve(fev);
37 gsMatrix<index_t> act = bb.active(pts.col(0));
38 index_t c = std::lower_bound(act.data(), act.data()+act.size(), i) - act.data();
39 GISMO_ASSERT(c<act.size(),
"Problem with basis function index");
74 gsMatrix<T> gsQuasiInterpolate<T>::localIntpl(
const gsHTensorBasis<d,T> &bb,
75 const gsFunction<T> &fun,
79 index_t j = bb.flatTensorIndexOf(i);
80 return localIntpl(bb.tensorLevel(lvl),fun,j, bb.elementInSupportOf(i));
85 gsMatrix<T> gsQuasiInterpolate<T>::localIntpl(
const gsBasis<T> &bb,
86 const gsFunction<T> &fun,
89 if (
const gsHTensorBasis<1,T>* b =
dynamic_cast<const gsHTensorBasis<1,T>*
>(&bb))
90 return localIntpl(*b,fun,i);
91 if (
const gsHTensorBasis<2,T>* b =
dynamic_cast<const gsHTensorBasis<2,T>*
>(&bb))
92 return localIntpl(*b,fun,i);
93 if (
const gsHTensorBasis<3,T>* b =
dynamic_cast<const gsHTensorBasis<3,T>*
>(&bb))
94 return localIntpl(*b,fun,i);
95 if (
const gsHTensorBasis<4,T>* b =
dynamic_cast<const gsHTensorBasis<4,T>*
>(&bb))
96 return localIntpl(*b,fun,i);
98 return localIntpl(bb,fun,i,bb.elementInSupportOf(i));
116 std::vector<gsMatrix<T> > derivs;
121 std::vector<T> knots;
122 for(
int j=0; j<n; j++)
126 for(
int i=j+1; i<=j+deg; i++)
127 knots.push_back(kv[i]);
129 for(
int k=0; k<=r; k++)
131 const T factor1 = derivProd(knots, deg-k, xj(j));
132 for(
int i=0; i<dim; i++)
134 const T factor2 = derivs[k](i,j);
135 val(i) += std::pow(-1.0,k) * factor1 * factor2;
150 res.transposeInPlace();
162 const int n = b.
size();
168 for(
unsigned int i=0; i<kv.
size(); i++)
178 "quasiInterpolateEvalBased is implemented for special cases of deg 1, 2 or 3!");
186 for(
int i=0; i<n; i++)
187 coefs.row(i) = TmpCoefs.col(i+1).transpose();
194 for(
unsigned int i=0; i<kv.
size()-1; i++)
195 knotsAvg(i) = (kv[i]+kv[i+1]) / (T)(2);
199 coefs.row(0) = TmpCoefs.col(0);
200 for(
int i=1; i<n-1; i++)
203 coefs.row(i).noalias() =
204 ( - TmpCoefs.col(i+1)
205 + 4 * TmpCoefsAvg.col(i+1)
206 - TmpCoefs.col(i+2) ) / (T)(2);
208 coefs.row(n-1) = TmpCoefs.col(n);
215 for(
unsigned int i=0; i<kv.
size()-1; i++)
216 knotsAvg(i) = (kv[i]+kv[i+1]) / (T)(2);
220 coefs.row(0) = TmpCoefs.col(3).transpose();
223 coefs.row(1).noalias() =
224 ( - 5 * TmpCoefs.col(3)
225 + 40 * TmpCoefsAvg.col(3)
226 - 24 * TmpCoefs.col(4)
227 + 8 * TmpCoefsAvg.col(4)
228 - TmpCoefs.col(5) ) / (T)(18);
230 for(
int i=2; i<n-2; i++)
233 coefs.row(i).noalias() =
235 - 8 * TmpCoefsAvg.col(i+1)
236 + 20 * TmpCoefs.col(i+2)
237 - 8 * TmpCoefsAvg.col(i+2)
238 + TmpCoefs.col(i+3) ) / (T)(6);
242 coefs.row(n-2).noalias() =
243 ( - TmpCoefs.col(n-2)
244 + 8 * TmpCoefsAvg.col(n-2)
245 - 24 * TmpCoefs.col(n-1)
246 + 40 * TmpCoefsAvg.col(n-1)
247 - 5 * TmpCoefs.col(n) ) / (T)(18);
249 coefs.row(n-1) = TmpCoefs.col(n);
255 for(
int i=0; i<n; i++)
258 int gsi = greatestSubInterval(kv, i, i+kv.
degree());
265 computeWeights(xik, kv, i+1, weights);
268 coefs.row(i) = computeControlPoints(weights, fun, xik);
281 std::vector<T> tmpZeros;
285 const index_t n1 = zeros.size() - 1;
288 for(
typename std::vector<T>::iterator it = tmpZeros.begin(); it!=tmpZeros.end(); ++it)
290 std::iter_swap(it, tmpZeros.end()-1);
292 std::iter_swap(it, tmpZeros.end()-1);
298 const int n = zeros.size();
300 for(
int i=0; i!=n; i++)
303 tmpZeros.erase(tmpZeros.begin() + i);
304 val += derivProd(tmpZeros, order-1, x);
314 for(
int k=0; k<n; k++)
315 points.
at(k) = a + (T)k/(T)(n-1) * (b-a);
322 const int deg = knots.
degree();
323 weights.resize(1,deg+1);
327 for(
int k=0; k<deg+1; k++)
333 for(
int i=0; i<k; i++)
335 pointsReduced(i) = points(i);
336 constant *= points(k) - points(i);
338 for(
int i=k+1; i<deg+1; i++)
340 pointsReduced(i-1) = points(i);
341 constant *= points(k) - points(i);
345 for(
int i=0; i<deg; i++)
353 for(
int i=0; i<deg; i++)
355 factor *= (knots[pos+indices[i]] - pointsReduced(i));
359 while(std::next_permutation(indices.data(), indices.data()+deg));
361 weights(k) = sum / constant;
371 return (weights.asDiagonal() * funValues.transpose()).colwise().sum();
378 const int diff = posEnd-posStart;
380 int maxInd = posStart;
381 for(
int i=1; i<diff+1; i++)
383 const T dist = knots[posStart+i+1] - knots[posStart+i];
404 result.resize(n,dim);
408 cf = localIntpl(b,fun,i);
422 result.resize(n,dim);
426 cf = Schoenberg(b,fun,i);
index_t size() const
size
Definition: gsBSplineBasis.h:165
static int greatestSubInterval(const gsKnotVector< T > &knots, const int &posStart, const int &posEnd)
This function finds the greatest knot interval in a given range in a knot vector. ...
Definition: gsQuasiInterpolate.hpp:376
static void Taylor(const gsBasis< T > &bb, const gsFunction< T > &fun, const int &r, gsMatrix< T > &result)
A quasi-interpolation scheme based on the tayor expansion of the function to approximate. See Theorem 8.5 of "Spline methods (Lyche Morken)" Theorem: (Lyche, Morken: Thm 8.5, page 178) Let and be the degree and knotvector of the quasi-interpolant, respectively. Futhermore let be an integer with and let be a number in for . Consider the quasi-interpolant and . Then reproduces all polynomials of degree and reproduces all splines in .
Definition: gsQuasiInterpolate.hpp:103
virtual void evalAllDers_into(const gsMatrix< T > &u, int n, std::vector< gsMatrix< T > > &result, bool sameElement=false) const
Evaluate the nonzero functions and their derivatives up to order n at points u into result...
Definition: gsFunctionSet.hpp:81
short_t degree(short_t i) const
Degree with respect to the i-th variable. If the basis is a tensor product of (piecewise) polynomial ...
Definition: gsBSplineBasis.h:322
static void computeWeights(const gsMatrix< T > &points, const gsKnotVector< T > &knots, const int &pos, gsMatrix< T > &weights)
To compute the control points of the quasi-interpolant one uses the function computeControlPoints. The weights can be computed as , for , where for a polynomial , where is the set of all permutations of the intergers .
Definition: gsQuasiInterpolate.hpp:320
static void distributePoints(T a, T b, int n, gsMatrix< T > &points)
Compute a number of equally distributed points in a given interval . You get a list of points ...
Definition: gsQuasiInterpolate.hpp:311
virtual index_t size() const
size
Definition: gsFunctionSet.h:578
static gsMatrix< T > computeControlPoints(const gsMatrix< T > &weights, const gsFunction< T > &fun, const gsMatrix< T > &xik)
The quasi-interpolant is a spline function, in particular a linear combination of some controlpoints ...
Definition: gsQuasiInterpolate.hpp:367
#define index_t
Definition: gsConfig.h:32
A function from a n-dimensional domain to an m-dimensional image.
Definition: gsFunction.h:59
static void EvalBased(const gsBasis< T > &bb, const gsFunction< T > &fun, const bool specialCase, gsMatrix< T > &result)
A quasi-interpolation scheme based on the evaluation of the function at certain points. See sections 8.2.1, 8.2.2, 8.2.3 and Theorem 8.7 or Lemma 9.7 of "Spline methods (Lyche Morken)". The formulas for the special cases (degrees 1, 2 and 3) look like this: where the coefficients for are given as: for degree 1, where .
Definition: gsQuasiInterpolate.hpp:156
#define GISMO_ASSERT(cond, message)
Definition: gsDebug.h:89
virtual short_t targetDim() const
Dimension of the target space.
Definition: gsFunctionSet.h:560
A univariate B-spline basis.
Definition: gsBSplineBasis.h:694
T at(index_t i) const
Returns the i-th element of the vectorization of the matrix.
Definition: gsMatrix.h:211
gsMatrix< T > anchors() const
Returns the anchor points that represent the members of the basis. There is exactly one anchor point ...
Definition: gsBasis.h:437
const KnotVectorType & knots(int i=0) const
Returns the knot vector of the basis.
Definition: gsBSplineBasis.h:369
static void Schoenberg(const gsBasis< T > &b, const gsFunction< T > &fun, gsMatrix< T > &result)
A quasi-interpolation scheme based on Schoenberg Variation Diminishing Spline Approximation. See Exercise 9.1 of "Spline methods (Lyche Morken)".
Definition: gsQuasiInterpolate.hpp:414
Quasi-interpolation operators.
Definition: gsQuasiInterpolate.h:36
Gauss-Legendre quadrature.
Definition: gsQuadrature.h:34
virtual short_t domainDim() const =0
Dimension of the (source) domain.
Creates a mapped object or data pointer to a const matrix without copying data.
Definition: gsLinearAlgebra.h:127
static gsVector< index_t > numNodes(const gsBasis< T > &basis, const Real quA, const index_t quB, short_t fixDir=-1)
Definition: gsQuadrature.h:152
gsVector< unsigned > distributePoints(const gsGeometry< T > &geo, unsigned numPoints)
distributes sampling points according to the length of the patch in each parametric direction ...
Definition: gsGeoUtils.hpp:536
virtual void eval_into(const gsMatrix< T > &u, gsMatrix< T > &result) const =0
Evaluate the function at points u into result.
static T derivProd(const std::vector< T > &zeros, const int &order, const T &x)
Compute the derivative of a certain order of a normalized polynomial (leading coefficient is 1) defin...
Definition: gsQuasiInterpolate.hpp:276
Class for representing a knot vector.
Definition: gsKnotVector.h:79
int degree() const
Returns the degree of the knot vector.
Definition: gsKnotVector.hpp:700
unsigned factorial(unsigned n)
Returns the factorial of n i.e. n! Remember that factorial grow too fast and only n! with n<=13 can b...
Definition: gsCombinatorics.h:29
A basis represents a family of scalar basis functions defined over a common parameter domain...
Definition: gsBasis.h:78