+ -
当前位置:首页 → 问答吧 → 菜鸟求如何编二维线性插值函数,如何调用一维线性插值来得出二维线性插值

菜鸟求如何编二维线性插值函数,如何调用一维线性插值来得出二维线性插值

时间:2011-12-16

来源:互联网

如题

作者: lxxiao2009   发布时间: 2011-12-16

C/C++ code
#include <iostream>
using namespace std;

double Lagrange(double *X,double* Y,int n,double t)//拉格朗日插值法,X表示插值点的横坐标数组,Y表示插值点的纵坐标数组,n是指插值点的个数,t表示将要在哪一点球差值,返回值是求得的差值
{
    double sum=0;
    int i,j;
    for (i=0;i<n;i++)
    {
        double L=1;
        for (j=0;j<n;j++)
        {
            if (j!=i)
            {
                L*=(t-X[j])/(X[i]-X[j]);
            }
        }
        sum+=L*Y[i];
    }

    return sum;
}


double Newton(double *X,double *Y,int n,double t)//牛顿插值法
{
    typedef double * DP;
    double **table=new DP[n];
    int i,j;
    for (i=0;i<n;i++)
    {
        table[i]=new double [n];
    }
    
    for (j=0;j<n;j++)
    {
        for (i=j;i<n;i++)
        {
            if (j==0)
            {
                table[i][j]=Y[i];
            } 
            else
            {
                table[i][j]=(table[i][j-1]-table[i-1][j-1])/(X[i]-X[i-j]);
            }
        }
    }

    double sum=0;
    for (i=0;i<n;i++)
    {
        double temp_sum=1;
        for (j=0;j<i;j++)
        {
            temp_sum*=(t-X[j]);
        }
        sum+=temp_sum*table[i][i];
    }

    for (i=0;i<n;i++)
    {
        delete[] table[i];
    }
    delete []table;

    return sum;

}

double Hermite(double *X,double *Y,double *M,int n,double t)//埃尔米特插值法
{
    double sum=0;
    int i,j;
    for (i=0;i<n;i++)//
    {
        double l_sum=1;
        double temp_sum=1;
        for (j=0;j<n;j++)
        {
            if (j!=i)
            {
                temp_sum/=(X[i]-X[j]);
                l_sum*=(t-X[j])/(X[i]-X[j]);
            }
        }
        sum=sum+(1-2*(t-X[i])*temp_sum)*l_sum*l_sum*Y[i]+(t-X[i])*l_sum*l_sum*M[i];
    }
    return sum;
}

int main()
{
    double X[2]={1,4};
    double Y[2]={1,2};
    double M[2]={0.5,0.25};
    int n=2;

    double t=2;
    double result=Hermite(X,Y,M,n,t);

    return 0;

}

作者: goldbeef   发布时间: 2011-12-16