实验二:Newton牛顿插值法之C语言代码

来源:互联网 发布:ceo cfo cmo 知乎 编辑:程序博客网 时间:2024/06/06 00:54

牛顿插值法与拉格朗日插值法类似,只不过是同一个插值多项式的不同表达形式,所以它们误差也是相等的.题目:
x | 0.56160 | 0.56280 | 0.56401 | 0.56521 |
y | 0.82741 | 0.82659 | 0.82577 | 0.82495 |

具体思路:依据书上的解题步骤,首先我们输入插值点的个数n,然后我们输入插值点的信息,x值是多少,y值是多少,我们用一个结构体定义,再构建一个差商表,我们用一个一维数组保存即可,最后依据牛顿插值公式转化成相应的代码即可.
下面上代码:          

/*************************************************************************    > File Name: Newton.c    > Author:chendiyang    > School:WUST_CST_1501班    > Myblog:www.chendsir.com    > Mail:1441353519@qq.com     > Created Time: 2017年04月19日 星期三 10时34分27秒 ************************************************************************/#include <stdio.h>#define MAX 20//输入点的结构typedef struct stPoint{    double x;    double y;} Point;int main(){    int n;    int i,j;    Point points[MAX+1];    double form[MAX+1];   //用来保存差商表    double x,tmp,newton=0;//这个x是你将要计算的f(x)插值点,tmp基函数,newton是根据牛顿插值公式函数得出N(x)的值    printf("请输入被插值点的个数:(它是从0开始的,所以输入3代表4个点)");    scanf("%d",&n);    if(n>MAX)    {        printf("您输入的个数过多.");        return 1;    }    if(n<=0)    {        printf("您输入的点数太少.");        return 1;    }   //输入插值点的x值和y值  printf("\n请输入插值点的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);    //对差商表进行初始化    for(i=0;i<=n;i++)     form[i]=points[i].y;     for(i=0;i<n;i++)     {         for(j=n;j>i;j--)         {             //差商的计算,f(X0,X1,X2,X3...Xn)的值              form[j]=(form[j]-form[j-1])/(points[j].x-points[j-1-i].x);         }     }     tmp=1;     newton=form[0];     for(i=0;i<n;i++)     {      //根据牛顿插值公式,上面差商表都计算完毕了,现在吧差商乘以牛顿插值函数,全部加起来就OK了       tmp=tmp*(x-points[i].x);//tmp是插值函数:例如(x-x0),(x-x1),(x-x2)等      newton=newton+tmp*form[i+1];//完成后newton就是f(x)的值了     }      //输入牛顿插值函数f(x)的值      printf("\n牛顿插值函数N(%lf) = %lf \n",x,newton);      return 0;     //计算完毕}

 a 运行结果如图所示:
 这里写图片描述  
 因为牛顿插值公式和拉格朗日插值公式只是同一个插值多项式的不同表现形式,它们的插值多项式是N(x)是完全相同的,所以它们的误差也是完全相同的,当插值x为0.5635时,利用newton插值公式计算出的结果是完全相同的:0.826116,证实了我之前的拉格朗日插值是对的,当然不排除两个都错了的情况,这个就尴尬了,反正两个结果应该是一模一样的,毕竟误差都是相同的.
实验二到此完毕....(由于图形编程的库函数不熟悉,也不是很会,暂时还是dos窗口吧,到时候看老师怎么说吧,发现自己真是浪费了很多时间,想找个时间好好静下来学些东西,但是生活上一些事情,心真的挺累..)慢慢加油吧

0 0