コード例 #1
0
ファイル: fastsum.c プロジェクト: poulson/nfft
/** regularized kernel for even kernels with K_I even
 *  and K_B mirrored smooth to K(1/2) (used in dD, d>1)
 */
double _Complex regkern3(kernel k, double xx, int p, const double *param, double a, double b)
{
  int r;
  double _Complex sum=0.0;

  xx=fabs(xx);

  if (xx>=0.5) {
    /*return kern(typ,c,0,0.5);*/
    xx=0.5;
  }
  /* else */
  if ((a<=xx) && (xx<=0.5-b)) {
    return k(xx,0,param);
  }
  else if (xx<a) {
    for (r=0; r<p; r++) {
      sum+=pow(-a,(double)r)*k(a,r,param)
          *(BasisPoly(p-1,r,xx/a)+BasisPoly(p-1,r,-xx/a));
    }
    /*sum=kern(typ,c,0,xx); */
    return sum;
  }
  else if ((0.5-b<xx) && (xx<=0.5)) {
    sum=k(0.5,0,param)*BasisPoly(p-1,0,-2.0*xx/b+(1.0-b)/b);
    /* sum=regkern2(typ,c,p,a,b, 0.5)*BasisPoly(p-1,0,-2.0*xx/b+(1.0-b)/b); */
    for (r=0; r<p; r++) {
      sum+=pow(b/2.0,(double)r)
          *k(0.5-b,r,param)
          *BasisPoly(p-1,r,2.0*xx/b-(1.0-b)/b);
    }
    return sum;
  }
  return 0.0;
}
コード例 #2
0
ファイル: taylor2p.c プロジェクト: fweik/scafacos
/** Use Lagrange basis polynomials for evaluating the interpolation polynomial P(x) that satisfies
 *  the non-symmetric Hermite interpolation conditions in two nodes up to the p-th derivative, i.e.,
 *      P^k(x0) = kernel^k(x0), for all k=0,...,p,
 *      P(x1)   = c,
 *      P^k(x1) = 0,            for all k=1,...,p
 */
static fcs_float interpolate_lagrange_ec(
    const fcs_float *kernel, fcs_int p,
    fcs_float x0, fcs_float x1, fcs_float x
    )
{
  fcs_float sum=0.0;

  /* canonicalize x to y \in [-1,1] */
  fcs_float r = 0.5*(x1-x0);
  fcs_float m = 0.5*(x1+x0);
  fcs_float y = (x-m)/r;

  for (fcs_int i=0; i<p+1; i++)
    sum += BasisPoly(p,i,y) * fcs_pow(r,(fcs_float)i) * kernel[i];

  return sum + kernel[p+1] * BasisPoly(p,0,-y);
}
コード例 #3
0
ファイル: fastsum.c プロジェクト: poulson/nfft
/** regularized kernel for even kernels with K_I even and K_B mirrored */
double _Complex regkern2(kernel k, double xx, int p, const double *param, double a, double b)
{
  int r;
  double _Complex sum=0.0;

  xx=fabs(xx);

  if (xx>0.5) {
    for (r=0; r<p; r++) {
      sum+=pow(b,(double)r)*k(0.5-b,r,param)
          *(BasisPoly(p-1,r,0)+BasisPoly(p-1,r,0));
    }
    return sum;
  }
  else if ((a<=xx) && (xx<=0.5-b)) {
    return k(xx,0,param);
  }
  else if (xx<a) {
    for (r=0; r<p; r++) {
      sum+=pow(-a,(double)r)*k(a,r,param)
          *(BasisPoly(p-1,r,xx/a)+BasisPoly(p-1,r,-xx/a));
    }
    return sum;
  }
  else if ((0.5-b<xx) && (xx<=0.5)) {
    for (r=0; r<p; r++) {
      sum+=pow(b,(double)r)*k(0.5-b,r,param)
          *(BasisPoly(p-1,r,(xx-0.5)/b)+BasisPoly(p-1,r,-(xx-0.5)/b));
    }
    return sum;
  }
  return 0.0;
}
コード例 #4
0
ファイル: fastsum.c プロジェクト: poulson/nfft
/** regularized kernel with K_I arbitrary and K_B smooth to zero */
double _Complex regkern(kernel k, double xx, int p, const double *param, double a, double b)
{
  int r;
  double _Complex sum=0.0;

  if (xx<-0.5)
    xx=-0.5;
  if (xx>0.5)
    xx=0.5;
  if ((xx>=-0.5+b && xx<=-a) || (xx>=a && xx<=0.5-b)) {
    return k(xx,0,param);
  }
  else if (xx<-0.5+b) {
    sum=(k(-0.5,0,param)+k(0.5,0,param))/2.0
        *BasisPoly(p-1,0,2.0*xx/b+(1.0-b)/b);
    for (r=0; r<p; r++) {
      sum+=pow(-b/2.0,(double)r)
          *k(-0.5+b,r,param)
          *BasisPoly(p-1,r,-2.0*xx/b+(b-1.0)/b);
    }
    return sum;
  }
  else if ((xx>-a) && (xx<a)) {
    for (r=0; r<p; r++) {
      sum+=pow(a,(double)r)
          *( k(-a,r,param)*BasisPoly(p-1,r,xx/a)
              +k( a,r,param)*BasisPoly(p-1,r,-xx/a)*(r & 1 ? -1 : 1));
    }
    return sum;
  }
  else if (xx>0.5-b) {
    sum=(k(-0.5,0,param)+k(0.5,0,param))/2.0
        *BasisPoly(p-1,0,-2.0*xx/b+(1.0-b)/b);
    for (r=0; r<p; r++) {
      sum+=pow(b/2.0,(double)r)
          *k(0.5-b,r,param)
          *BasisPoly(p-1,r,2.0*xx/b-(1.0-b)/b);
    }
    return sum;
  }
  return k(xx,0,param);
}
コード例 #5
0
ファイル: fastsum.c プロジェクト: poulson/nfft
/** regularized kernel with K_I arbitrary and K_B periodized
 *  (used in 1D)
 */
double _Complex regkern1(kernel k, double xx, int p, const double *param, double a, double b)
{
  int r;
  double _Complex sum=0.0;

  if (xx<-0.5)
    xx=-0.5;
  if (xx>0.5)
    xx=0.5;
  if ((xx>=-0.5+b && xx<=-a) || (xx>=a && xx<=0.5-b))
  {
    return k(xx,0,param);
  }
  else if ((xx>-a) && (xx<a))
  {
    for (r=0; r<p; r++) {
      sum+=pow(a,(double)r)
          *( k(-a,r,param)*BasisPoly(p-1,r,xx/a)
              +k( a,r,param)*BasisPoly(p-1,r,-xx/a)*(r & 1 ? -1 : 1));
    }
    return sum;
  }
  else if (xx<-0.5+b)
  {
    for (r=0; r<p; r++) {
      sum+=pow(b,(double)r)
          *( k(0.5-b,r,param)*BasisPoly(p-1,r,(xx+0.5)/b)
              +k(-0.5+b,r,param)*BasisPoly(p-1,r,-(xx+0.5)/b)*(r & 1 ? -1 : 1));
    }
    return sum;
  }
  else if (xx>0.5-b)
  {
    for (r=0; r<p; r++) {
      sum+=pow(b,(double)r)
          *( k(0.5-b,r,param)*BasisPoly(p-1,r,(xx-0.5)/b)
              +k(-0.5+b,r,param)*BasisPoly(p-1,r,-(xx-0.5)/b)*(r & 1 ? -1 : 1));
    }
    return sum;
  }
  return k(xx,0,param);
}