切比雪夫逼近
本章描述计算单变量函数切比雪夫逼近的函数。切比雪夫逼近是级数f(x)=cnTn(x)的截断,其中切比雪夫多项式Tn(x)=cos(n arccosx)提供了多项式在区间[−1,1]上的正交基,权函数为1/1-x2。前几个切比雪夫多项式是,T0(x) = 1, T1(x) = x, T2(x) = 2x2−1。更多信息,请参阅第22章Abramowitz和Stegun。
本章描述的函数声明在头文件gsl_chebyshev.h中。
32.1 定义
gsl_cheb_series
切比雪夫级数的存储结构如下:
typedef struct { double * c; /* coefficients c[0] .. c[order] */ int order; /* order of expansion */ double a; /* lower interval point */ double b; /* upper interval point */ ... } gsl_cheb_series |
在[a, b]范围内用order+ 1项进行逼近,包括系数c[0]。级数是用下面的定义计算的,
这是直接访问系数时需要的。
32.2 创建和计算切比雪夫级数
gsl_cheb_series * gsl_cheb_alloc(const size_t n)
本函数为一个n阶的切比雪夫级数分配空间,并返回一个指针,指向新建的gsl_cheb_series结构体。
void gsl_cheb_free(gsl_cheb_series * cs)
本函数释放分配的切比雪夫级数cs的空间。
int gsl_cheb_init(gsl_cheb_series * cs, const gsl_function * f, const double a,
const double b)
本函数计算函数f在范围(a, b)上的切比雪夫逼近cs到先前指定的阶。切比雪夫逼近的计算是一个O(n2)过程,需要n个函数的计算。
32.3 辅助函数
以下函数提供了关于现有的切比雪夫级数的信息。
size_t gsl_cheb_order(const gsl_cheb_series * cs)
本函数返回切比雪夫级数cs的级。
size_t gsl_cheb_size(const gsl_cheb_series * cs)
double * gsl_cheb_coeffs(const gsl_cheb_series * cs)
这些函数返回切比雪夫系数数组c[]的大小和切比雪夫级数cs在内存中的位置的指针。
32.4 切比雪夫级数计算
double gsl_cheb_eval(const gsl_cheb_series * cs, double x)
本函数计算在给定点x处的切比雪夫级数cs的值。
int gsl_cheb_eval_err(const gsl_cheb_series * cs, const double x, double * result,
double * abserr)
本函数计算给定点x处的切比雪夫级数cs,估算级数值在result中,其绝对误差在abserr中。误差估计是根据级数中忽略的第一项进行的。
double gsl_cheb_eval_n(const gsl_cheb_series * cs, size_t order, double x)
本函数计算在给定点x处的切比雪夫级数cs,直到(至多)给定的级order。
int gsl_cheb_eval_n_err(const gsl_cheb_series * cs, const size_t order,
const double x, double * result, double * abserr)
本函数计算给定点x处的切比雪夫级数cs,估算级数值在result中,其绝对误差在abserr中,(至多)达到给定的级order。误差估计是根据级数中忽略的第一项进行的。
32.5 微分和积分
下面的函数允许对切比雪夫级数进行微分或积分,得到一个新的切比雪夫级数。请注意,由于忽略了高次项的贡献,对导数级数的估计误差将被低估。
int gsl_cheb_calc_deriv(gsl_cheb_series * deriv, const gsl_cheb_series * cs)
本函数计算级数cs的导数,将导数系数存储在先前分配的deriv中。两个级数cs和deriv必须按相同的顺序分配内存。
int gsl_cheb_calc_integ(gsl_cheb_series * integ, const gsl_cheb_series * cs)
本函数计算级数cs的积分,将积分系数存储在先前分配的integ中。两个级数cs和integ必须按相同的顺序分配内存。积分的下限为取值范围a的左端。