计算方法实验报告(Lagrange&Rounge)
2010-05-29 11:57
399 查看
计算方法实验报告
一、实验要求
1、编程实现拉格朗日插值
2、将龙格现象展现出来,主要包括:
A:大范围高次插值,两端会出现的现象
B:中点附近的插值效果
3、对于龙格现象,怎么能够使中点附近的插值精度提高,写一些心得体会
二、实验目的
1、进一步了解拉格朗日插值以及龙格现象的相关知识
2、熟悉关于C语言的一些基本编程操作
三、实验内容
实验一、编程实现拉格朗日插值
1、做出相应的程序框图(流程图)如下所示:
2、实现拉格朗日插值的源程序为:
在TC2.0下编译链接该程序后,运行成功,然后输入下表所示数据:
输出结果如下所示:
由所示结果易知程序的运行是正确的。
实验二、展现龙格现象
1、展现龙格现象的源程序为:
在TC2.0下编译链接该程序后,运行成功,所输出的结果如下所示:
其中该程序中使用的示例函数为f(x)=1/(1+x^2),-5<=x<=5.
设将区间[-5,5]n等分,以pn(x)表示取n+1个等分点作为插值节点的插值多项式。上图中所示的结果展示了n取不同值时相应的几个节点的数值。
由这些数据可以发现,对于大范围内的高次插值,会出现龙格现象,即随着插值节点的增多,插值函数与被插值函数虽然在越来越多的点上取相同的函数值,但在插值节点之间,两者却相差甚远。具体来说有以下两点:
1、当插值节点数增多时,在插值区间的两端,插值函数与被插值函数之间的偏差会越来越大;
2、随着节点数的增多,在插值区间的中点附近,插值函数会越来越逼近被插值函数。
实验三、使中点附近的插值精度提高的方法
由实验二中展现出来的龙格现象可以发现,在同样的插值区间下,插值节点数越多,在插值区间的中点附近的近似精度就越高,由此启发我们可以通过增多插值节点数的方法来提高在中点附近的插值精度。
四、实验心得
经过本次实验,我对C语言的编程更加熟练,对拉格朗日插值以及龙格现象的一些特性也有了更多的了解;同时我也发现了自己的一些不足之处,比如说粗心、考虑不全面等。总之,通过这次实验,我认识到了不同的计算方法的魅力,当然也收获了许多,我以后会继续努力,用代码展现自己的精彩人生!
一、实验要求
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语言的编程更加熟练,对拉格朗日插值以及龙格现象的一些特性也有了更多的了解;同时我也发现了自己的一些不足之处,比如说粗心、考虑不全面等。总之,通过这次实验,我认识到了不同的计算方法的魅力,当然也收获了许多,我以后会继续努力,用代码展现自己的精彩人生!
相关文章推荐
- 计算方法实验报告PC版 —王世儒、王金金
- 数值计算与方法 && 实验6||7 && LU分解求行列式的值和矩阵的逆
- 软工12-13-2 实验报告三——住房贷款计算器所涉及到的数据及计算方法
- 计算方法实验二实验报告 非线性方程求根
- 上机实验报告2:4 4000 &2:5
- 计算方法实验七
- 《C++第九周实验报告2-1》---接第8周任务2,定义Time类中的<<和>>运算符重载,实现时间的输入输出
- 词语相似度计算:6、实验报告
- make: Nothing to be done for `all' 解决方法 ---实验2
- 计算方法实验三 高斯消元
- C++程序设计实验报告(十六)----用循环控制语句编写程序,完成表达式的计算
- 最优化方法的实验报告程序代码
- 【服务计算】selpg实验报告(README)
- 【解题报告】 URAL 1333 Genie Bomber 2 -- 利用类似统计的方法计算覆盖效率
- 《C++第九周实验报告3-1》----接第8周任务3,定义分数类中<<和>>运算符重载,实现分数的输入输出
- Java-date的拼接&Calendar的计算&Timestamp时间戳-表示时间的方法
- 实验报告<幻方,数组的排序和向数组中插入某个数>
- 计算方法实验一 矩阵相乘法+输出格式处理
- 大数据处理之道(实验方法篇<一>)
- 实验报告:运用shingling+minhash+lsh方法对文档相似性进行分析