实验二:Lagrange拉格朗日插值法之C语言代码

拉格朗日插值多项式的算法就比前面的简单些,30行代码左右可以搞定,不过为了通俗易懂,这里我写了比较多的注释.题目:已知下列函数表:


x | 0.56160 | 0.56280 | 0.56401 | 0.56521 |
y | 0.82741 | 0.82659 | 0.82577 | 0.82495 |


具体思路:依据书上的解题步骤,首先我们输入插值点的个数n,然后我们输入插值点的信息,x值是多少,y值是多少,我们用一个结构体定义,最后依据拉格朗日插值公式转化成相应的代码即可.
下面上代码:                   

/*************************************************************************
    > File Name: Lagrange.c
    > Author:chendiyang
    > School:WUST_CST_1501班
    > Myblog:www.chendsir.com
    > Mail:[email protected] 
    > Created Time: 2017年04月19日 星期三 8时06分35秒
 ************************************************************************/
#include 
#define MAX 20
//输入点的结构
typedef struct stPoint
{
    double x;
    double y;
} Point;

int main()
{
    int n;
    int i,j;
    Point points[MAX];
    double x,tmp,lagrange=0;//这个x是你将要计算的f(x)插值点,tmp是拉格朗日基函数,larange是根据拉格朗日函数得出f(x)的值
    printf("请输入被插值点的个数:(它是从0开始的,所以输入3代表4个点)");
    scanf("%d",&n);
    if(n>MAX)
    {
        printf("您输入的个数过多.");
        return 1;
    }
    if(n<=0)
    {
        printf("您输入的点数太少.");
        return 1;
    }
   //输入插值点的x值和y值
  printf("请输入插值点的x值和y值:\n");
   for(i=0;i<=n;i++)
      scanf("%lf%lf",&points[i].x,&points[i].y);
    //输入计算拉格朗日插值多项式的x值
    printf("\n请输入计算拉格朗日插值多项式的x值:");
    scanf("%lf",&x);
    //利用拉格朗日插值公式计算函数x值的对应f(x)
    for(i=0;i<=n;i++)
    {
        for(j=0,tmp=1;j<=n;j++)
        {
            if(j==i)   //去掉xi与xj相等的情况
            continue;  //范德蒙行列式下标就是j!=k,相等分母为0就没意义了
            tmp=tmp*(x-points[j].x)/(points[i].x-points[j].x);//这个就是套公式,没什么难度
            //tmp是拉格朗日基函数
        }
        lagrange=lagrange+tmp*points[i].y; //最后计算基函数*y,全部加起来,就是该x项的拉格朗日函数了
    }  
    //拉格朗日函数计算完毕,代入所求函数x的值,求解就ok了
    printf("\n拉格朗日函数f(%lf)=%lf\n",x,lagrange);
    return 0;
}

   运行结果如图:
   实验二:Lagrange拉格朗日插值法之C语言代码_第1张图片 
   程序运行的结果:当x的值是0.5635时的插值函数值是:0.826116,不知道是对是错,有心人可以手算帮忙验证一下..结果不对的话可以给我留言,方便及时改正.

你可能感兴趣的:(数值分析)