《计算方法》实验报告(共9页).docx
精选优质文档-倾情为你奉上计算方法实验报告学号 姓名班级实验项目名称计算方法实验一、实验名称实验一 插值与拟合二、 实验目的:(1)明确插值多项式和分段插值多项式各自的优缺点;(2)编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;(3)运用牛顿插值方法解决数学问题。三、 实验内容及要求(1) 对于要求选取11个等距插值节点,分别采用拉格朗日插值和分段线性插值,计算x为0.5, 4.5处的函数值并将结果与精确值进行比较。输入:区间长度,n(即n+1个节点),预测点输出:预测点的近似函数值,精确值,及误差(2)已知用牛顿插值公式求的近似值。输入:数据点集,预测点。输出:预测点的近似函数值四、 实验原理及算法描述算法基本原理:(1)拉格朗日插值法(2) 牛顿插值法算法流程五、 程序代码及实验结果(1) 输出:A拉格朗日插值法 B.分段线性插值X y(精确) y(拉格朗日) y(分段线性) 误差(拉) 误差(分)0.0.0.0. -0. 0.4.0.1. 0. -32. -0.(2) 输出:X y(精确) y(牛顿插值) 误差(牛顿插值) 5.000002.2. -0. 源码:(1)A.拉格朗日插值法#include<iostream> #include<string> #include<vector> using namespace std; double Lagrange(int N,vector<double>&X,vector<double>&Y,double x); int main() double p,b,c;char a='n' do cout<<"请输入差值次数n的值:"<<endl; int N; cin>>N; vector<double>X(N,0); vector<double>Y(N,0); cout<<"请输入区间长度(a,b):"<<endl;cin>>p;cin>>b;c=b-p;c=c/(N-1); for(int i=0;i<N;i+)Xi=p; Yi=1/(1+p*p);p=p+c; cout<<"请输入要求值x的值:"<<endl; double x; cin>>x; double result=Lagrange(N,X,Y,x); cout<<"由拉格朗日插值法得出结果: "<<result<<endl; cout<<"是否要继续?(y/n):" cin>>a; while(a='y'); return 0; double Lagrange(int N,vector<double>&X,vector<double>&Y,double x) double result=0; for(int i=0;i<N;i+) double temp=Yi; for(int j=0;j<N;j+) if(i!=j) temp = temp*(x-Xj); temp = temp/(Xi-Xj); result += temp; return result; ; B:分段线性插值#include<iostream> #include<string> #include<vector> using namespace std; double fenduan(int N,vector<double>&X,vector<double>&Y,double x,double c ); int main() double p,b,c;char a='n' do cout<<"请输入差值次数n的值:"<<endl; int N; cin>>N; vector<double>X(N,0); vector<double>Y(N,0); cout<<"请输入区间长度(a,b):"<<endl;cin>>p;cin>>b;c=b-p;c=c/(N-1); for(int i=0;i<N;i+)Xi=p; Yi=1/(1+p*p);p=p+c; cout<<"请输入要求值x的值:"<<endl; double x; cin>>x; double result=fenduan(N,X,Y,x,c); cout<<"由分段线性插值法得出结果: "<<result<<endl; cout<<"是否要继续?(y/n):" cin>>a; while(a='y'); return 0; double fenduan(int N,vector<double>&X,vector<double>&Y,double x,double c) double result=0; int b; b=0; while(x-Xb>c) b=b+1; result=Yb*(1-(x-Xb)/c)+Yb+1*(x-Xb)/c); return result; ;(3) 牛顿插值法#include<iostream> #include<string> #include<vector> using namespace std; double ChaShang(int n,vector<double>&X,vector<double>&Y); double Newton(double x,vector<double>&X,vector<double>&Y); int main() char a='n' do int n; cout<<"请输入插值点个数:"<<endl; cin>>n; vector<double>X(n,0); vector<double>Y(n,0); cout<<"请输入插值点对应的值及函数值(Xi,Yi):"<<endl; for(int i=0;i<n;i+) cin>>Xi>>Yi; cout<<"请输入要求值x的值:"<<endl; double x; cin>>x; cout<<"由牛顿插值法得出结果: "<<Newton(x,X,Y)<<endl; cout<<"是否要继续?(y/n):" cin>>a; while(a='y'); return 0; double ChaShang(int n,vector<double>&X,vector<double>&Y) double f=0; double temp=0; for(int i=0;i<n+1;i+) temp=Yi; for(int j=0;j<n+1;j+) if(i!=j) temp /= (Xi-Xj); f += temp; return f; double Newton(double x,vector<double>&X,vector<double> &Y) double result=0; for(int i=0;i<X.size();i+) double temp=1; double f=ChaShang(i,X,Y); for(int j=0;j<i;j+) temp = temp*(x-Xj); result += f*temp; return result; 六、 实验总结1. 通过实验一数据发现,拉格朗日插值在低次插值时,同源函数偏差并不大,但在高次插值时同原函数偏差大、存在明显的龙格现象,而分段线性插值可以避免出现的龙格现象,与原函数比较吻合,但是分段线性插值由于其分段属性,使得插值函数失去光滑性,可以考虑采用Hermite插值优化。2. 通过实验二计算过程发现,拉格朗日插值法的线性插值的计算过程没有继承性,即增加一个节点时整个计算工作必须重新开始。而牛顿插值则避免了这一问题,这样大量的节省了乘、除法运算次数,减少了计算的时间。因此,对于一些结构相当复杂的函数,牛顿插值法比拉格朗日插值法要占优势。五、教师评语(或成绩) 教师签字 : 专心-专注-专业