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

来源:互联网 发布:淘宝童装促销文案 编辑:程序博客网 时间:2024/06/01 16:29

拉格朗日插值多项式的算法就比前面的简单些,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:1441353519@qq.com     > Created Time: 2017年04月19日 星期三 8时06分35秒 ************************************************************************/#include <stdio.h>#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;}

   运行结果如图:
   这里写图片描述 
   程序运行的结果:当x的值是0.5635时的插值函数值是:0.826116,不知道是对是错,有心人可以手算帮忙验证一下..结果不对的话可以给我留言,方便及时改正.

2 0
原创粉丝点击