/** 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; }
/** 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); }
/** 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; }
/** 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); }
/** 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); }