您的位置:首页 > 其它

计算方法实验报告(Lagrange&Rounge)

2010-05-29 11:57 399 查看
计算方法实验报告

一、实验要求
1、编程实现拉格朗日插值
2、将龙格现象展现出来,主要包括:
A:大范围高次插值,两端会出现的现象
B:中点附近的插值效果
3、对于龙格现象,怎么能够使中点附近的插值精度提高,写一些心得体会

二、实验目的
1、进一步了解拉格朗日插值以及龙格现象的相关知识
2、熟悉关于C语言的一些基本编程操作

三、实验内容

实验一、编程实现拉格朗日插值
1、做出相应的程序框图(流程图)如下所示:



2、实现拉格朗日插值的源程序为:
#include<stdio.h>

double Li(double x[],int n,int i);

int main()

{

int i,n;

double xi[100];

double yi[100];

double sub=0;

printf("                          Welcome to use this program/n");

printf("                               Happy every day!/n/n/n");

printf("Please input the number of the nodes:");

scanf("%d",&n);

printf("Please input the %d nodes:/n",n);

for(i=0;i<n;i++){

printf("xi[%d]:",i);

scanf("%lf",&xi[i]);

printf("yi[%d]:",i);

scanf("%lf",&yi[i]);

}

printf("Please input the %dth node:/nxi[%d]:",n+1,n);

scanf("%lf",&xi
);

for(i=0;i<n;i++)

sub=sub+(yi[i]*Li(xi,n,i));

yi
=sub;

printf("/nThe final result:/nyi[%d] = %f./n/n",n,yi
);

printf("                          Press any key to continue.../n");

getch();

}

double Li(double x[],int n,int i)

{

int m=0;

double sum=1;

A:

for(;m<n&&m!=i;m++)

sum=sum*(x
-x[m])/(x[i]-x[m]);

if(m<n)

{

m++;

goto A;

}

return sum;

}

在TC2.0下编译链接该程序后,运行成功,然后输入下表所示数据:

xi
0.56160
0.56280
0.56401
0.56521
yi
0.82741
0.82659
0.82577
0.82495
输出结果如下所示:



由所示结果易知程序的运行是正确的。

实验二、展现龙格现象
1、展现龙格现象的源程序为:
#include<stdio.h>

double fx(double x);

double runge(int n,float xi);

int main()

{

printf("                          Welcome to use this program/n");

printf("                               Happy every day!/n/n/n");

printf("The function used in this program is:/nf(x)=1/(1+x^2),(-5<=x<=5)./n/n");

printf("   x      0.5        1.5        2.5        3.5        4          4.5/n/n");

printf("  f(x)    %f   %f   %f   %f   %f   %f/n/n",fx(0.5),fx(1.5),fx(2.5),fx(3.5),fx(4),fx(4.5));

printf(" p2(x)    %f   %f   %f   %f   %f   %f/n/n",runge(2,0.5),runge(2,1.5),runge(2,2.5),runge(2,3.5),runge(2,4),runge(2,4.5));

printf(" p4(x)    %f   %f   %f  %f  %f  %f/n/n",runge(4,0.5),runge(4,1.5),runge(4,2.5),runge(4,3.5),runge(4,4),runge(4,4.5));

printf(" p6(x)    %f   %f  %f   %f   %f   %f/n/n",runge(6,0.5),runge(6,1.5),runge(6,2.5),runge(6,3.5),runge(6,4),runge(6,4.5));

printf(" p8(x)    %f   %f   %f   %f  %f  %f/n/n",runge(8,0.5),runge(8,1.5),runge(8,2.5),runge(8,3.5),runge(8,4),runge(8,4.5));

printf("p10(x)    %f   %f   %f  %f   %f   %f/n/n/n",runge(10,0.5),runge(10,1.5),runge(10,2.5),runge(10,3.5),runge(10,4),runge(10,4.5));

printf("                          Press any key to continue.../n");

getch();

}

double fx(double x)

{

double sub;

sub=(double)1/(1+x*x);

return sub;

}

double runge(int n,float x)

{

int i,j;

double sum,sub=0;

double xi[50];

double yi[50];

for(i=0;i<n+1;i++)

{

xi[i]=-5+(double)10/n*i;

yi[i]=1/(1+(xi[i]*xi[i]));

}

for(i=0;i<n+1;i++)

{

sum=1;

j=0;

A:

for(;j<n+1&&j!=i;j++)

sum=sum*(x-xi[j])/(xi[i]-xi[j]);

if(j<n+1)

{

j++;

goto A;

}

sub=sub+yi[i]*sum;

}

return sub;

}


在TC2.0下编译链接该程序后,运行成功,所输出的结果如下所示:





其中该程序中使用的示例函数为f(x)=1/(1+x^2),-5<=x<=5.
设将区间[-5,5]n等分,以pn(x)表示取n+1个等分点作为插值节点的插值多项式。上图中所示的结果展示了n取不同值时相应的几个节点的数值。
由这些数据可以发现,对于大范围内的高次插值,会出现龙格现象,即随着插值节点的增多,插值函数与被插值函数虽然在越来越多的点上取相同的函数值,但在插值节点之间,两者却相差甚远。具体来说有以下两点:
1、当插值节点数增多时,在插值区间的两端,插值函数与被插值函数之间的偏差会越来越大;
2、随着节点数的增多,在插值区间的中点附近,插值函数会越来越逼近被插值函数。

实验三、使中点附近的插值精度提高的方法
由实验二中展现出来的龙格现象可以发现,在同样的插值区间下,插值节点数越多,在插值区间的中点附近的近似精度就越高,由此启发我们可以通过增多插值节点数的方法来提高在中点附近的插值精度。

四、实验心得
经过本次实验,我对C语言的编程更加熟练,对拉格朗日插值以及龙格现象的一些特性也有了更多的了解;同时我也发现了自己的一些不足之处,比如说粗心、考虑不全面等。总之,通过这次实验,我认识到了不同的计算方法的魅力,当然也收获了许多,我以后会继续努力,用代码展现自己的精彩人生!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: