计算方法实验_第1页
计算方法实验_第2页
计算方法实验_第3页
免费预览已结束,剩余1页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、.计算方法实验报告学号 2015216772刘盼班级计算机一班实验项目名称插值与拟合一、实验名称实验一 插值与拟合二、 实验目的:1. 明确插值多项式和分段插值多项式各自的优缺点;2. 编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;3. 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法4. 运用常用的插值和拟合方法解决实际问题。三、 实验内容及要求(1)对于要求选取11个等距插值节点,分别采用拉格朗日插值和分段线性插值,计算x为0.5, 4.5处的函数值并将结果与精确值进行比较。输入:区间长度,n(即n+1个节点),预测点输出:预测点的近似函数值,精

2、确值,及误差(2)已知用牛顿插值公式求的近似值。输入:数据点集,预测点。输出:预测点的近似函数值四、 实验原理及算法描述1. Lagrange插值法的基本原理:当精确函数 y = f(x) 非常复杂或未知,在一系列节点 x0 xn处测得函数值 y0 = f(x0), yn = f(xn), 希望由此构造一个简单易算的近似函数 g(x) » f(x),满足条件g(xi) = f(xi) (i = 0, n)。这里的 g(x) 称为f(x) 的插值函数,由插值函数可以去近似估计f(x)在一些未知点处的函数值。最常用的插值函数是多项式插值。所谓多项式插值即求 n 次多项式使得基于基函数的拉

3、格朗日插值是构造多项式插值最基本方法。也是推导数值微积分和微分方程数值解的公式的理论基础。拉格朗日插值公式为:其中2. Lagrange插值算法描述:(也可以是算法流程图)步骤1: 构造处的插值基函数,其中,插值节点处的插值基函数为;步骤2:以作为的系数,使得通过插值点;步骤3:把所有的线性叠加,得到通过所有插值点的插值函数。Lagrange插值伪代码:给定个插值点的情况下,求插值函数在点处的函数值。/*输入参数*x=(x0,x1,.,xn), 插值节点*y=(y0,y1,yn); 被插函数f(x)在插值节点处的函数值*t 求插值函数Ln (x)在t处的函数值*返回值 插值函数Ln (x)在t

4、处的函数值 */五、 程序代码及实验结果1 主程序int main() double x11 = -5,-4,-3,-2,-1,0,1,2,3,4,5,y11 = 0.038461,0.058823,0.100000,0.200000,0.500000,1.000000,0.500000,0.200000,0.100000,0.058823,0.038461; double u1,u2; double m1,l1,p1,m2,l2,p2;printf("请输入要计算的x的值:");scanf("%lf",&u1); m1=1/(1+u1*u1);

5、printf("x=%lf时的精确值为:%fn",u1,m1);printf("x=%lf时的拉格朗日差值近似值为:%fn",u1,Lagrange(x,y,u1);/拉格郎日插值 printf("x=%lf时的分段线性差值近似值为:%fn",u1,PiecewiseLinear(x,y,u1); /分段线性插值 l1=m1-Lagrange(x,y,u1);p1=m1-PiecewiseLinear(x,y,u1);printf("x=%lf时的拉格朗日误差为:%fn",u1,l1);printf("x

6、=%lf时的分段线性误差为:%fn",u1,p1);printf("请再输入要计算的x的值:");scanf("%lf",&u2); m2=1/(1+u2*u2);printf("x=%lf时的精确值为:%fn",u2,m2);printf("x=%lf时的拉格朗日差值近似值为:%fn",u2,Lagrange(x,y,u2);/拉格郎日插值 printf("x=%lf时的分段线性差值近似值为:%fn",u2,PiecewiseLinear(x,y,u2); /分段线性插值 l

7、2=m2-Lagrange(x,y,u2);p2=m2-PiecewiseLinear(x,y,u2);printf("x=%lf时的拉格朗日误差为:%fn",u2,l2);printf("x=%lf时的分段线性误差为:%fn",u2,p2);newton(); return 0;2 Lagrange插值子程序:double Lagrange(double *x, double *y, double *) /拉格郎日插值 int i,j; double *a,yy=0.000; a=new double11; for(i=0;i<11;i+) ai

8、=yi; for(j=0;j<11;j+) if(j!=i) ai*=(*-xj)/(xi-xj); yy+=ai; delete a; return yy; 3. 分段线性插值子程序double PiecewiseLinear(double *x, double *y, double input) /分段线性插值 double output; int i; for (i=0;i<10;i+) if (xi <= input && xi+1 >= input) output=yi +(yi+1-yi)*(input-xi)/(xi+1-xi); brea

9、k; return output; 4. 牛顿插值子程序void newton() /牛顿插值 float x100,y100,c100100,x1,xp,wx; int n,i,j; cout<<"输入数据组的个数"<<endl; cin>>n; for(i=0;i<n;i+) cout<<"当前输入第"<<i<<"组数据"<<endl; cin>>xi; cin>>yi; for(j=0;j<n;j+) if(j

10、>0) for(i=0;i<n-j;i+) cij=(ci+1j-1-cij-1)/(xi+j-xi); else for(i=0;i<n;i+) ci0=yi; xp=y0; char m='y' while(m='y') cout<<"请输入你要求的点的X值:"<<endl; cin>>x1; for(i=1;i<n;i+) wx=1; for(j=0;j<=i-1;j+) wx=wx*(x1-xj); xp=xp+c0i*wx; cout<<"newton插值的结果为:"<<xp<<endl; cout<<"是否想继续计算(Y/N)"<<endl; cin>>m; 实验结果:.。如图一所示。图12 六、 实验总结1. 拉格朗日插值在高次插值时同原函数偏差大、存在龙格现象,高次插值多项式不收敛。2. 牛顿插值和拉格朗日插值的区别和联系:Ln(x)与NN(x)均是n次多项式,且均满足插值

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论