数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)


插值法

插值法主要解决的问题就是,用一个多项式函数来逼近原函数,或者用多项式函数来拟合离散数据,在计算机图形的处理中,插值法应用广泛

插值法基本的有两种,拉格朗日插值法和牛顿插值法

还有一种要求更为严格的差值方法赫米特(Hiemite)插值法

 

插值法用多项式来逼近原函数,可以证明给定N个插值节点,只能构造唯一的,最高次不高于n的差值多项式

一般我们可以使用待定系数法,列出若干个方程,来求解系数,得到差值多项式。

 

拉格朗日插值法则构造一个差值基函数,保证这一部分在X取X0的时候等于1,在其他的时候等于0,不让其他的点干扰

基本形式为

插值基函数为

牛顿插值法则是引入差商的概念

 

数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)_第1张图片

关于差商的计算,我们可以使用递推的方式

数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)_第2张图片

最后牛顿插值法的基本形式为

 

拉格朗日插值法不具有承袭性,当增加了一个新的插值节点,我们需要全部重新计算

而牛顿插值法,改进了这一点,以上情况出现时,只需要在后面增加多一项即可。

 

拉格朗日插值法

double Lagrange(double *p,int n,double x)
{//P是插值节点数组,n是插值节点格式,x是自变量的取值
    int i,j,k;
    double numerator,denominator,ans;
    ans=0;//numerator分子,denominator分母
    for(k=0;k

牛顿插值法

double Newton(double *p,int n,double x)
{//P是插值节点数组,n是插值节点格式,x是自变量的取值
    int i,j,k;
    double numerator,denominator,ans=0;
    double *np=(double *)malloc(n*sizeof(double));//用以保存差商
    //使用滚动数组保存插值,节约存储空间
    double ny=(x-(*p));//x-x0
    for(i=0;i=k;i--)
        {//从后往前求差商,保存在np数组内
            numerator=( *(np+i-1) ) - ( *(np+i));
            denominator=( *(p+(i-k)*2)) - ( *(p+i*2) );
            *(np+i)=(numerator/denominator);
        }//End for-i
        ans+=(*(np+n-1))*ny;
        ny*=(x-(*(p+k*2) ));//累乘(x-xi)的结果
    }//End for-k
    return ans;
}

 

Hiemite插值法

赫米特插值法在前两种插值法的基础上,不仅要求在插值节点处函数值相同,而且导数值也相同,比较常见的就是二点三次插值,即给定两个插值节点和函数值和一个点的导数值

基本形式为

数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)_第3张图片

数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)_第4张图片

赫米特插值法

double Hiemite(double *p,int n,double x)
{//p表示插值节点,n表示插值节点个数,x是自变量的取值
 //p是一个三维数组,第一维为X,第二维度为y,第三维度为导数值y′
    int i,j,k;
    double ans=0;
    double numerator,denominator;//前者为分子,后者为分母
    double *lx=(double *)malloc(n*sizeof(double));//记录插值基函数的平方
    double *ax=(double *)malloc(n*sizeof(double));//记录系数α
    double *bx=(double *)malloc(n*sizeof(double));//记录系数β
    for(k=0;k

 

最小二乘法

二乘法是为了在一系列离散点中找到一条曲线,最好地拟合这些点

为了达到最好的拟合效果,我们使其曲线的残差平方和最小

数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法)_第5张图片

 

最小二乘法

double Fitting(double *p,int n)
{
    int i,j,k;
    double b,a;
    double ans[4]={0};
    double *m=(double *)malloc(2*3*sizeof(double));

    for(i=0;i

 

你可能感兴趣的:(数值计算(二)之插值法与线性回归(拉格朗日插值法,牛顿插值法,赫米特插值法,最小二乘法))