数值分析计算方法.doc

上传人:xin****828 文档编号:6654080 上传时间:2020-03-01 格式:DOC 页数:11 大小:95.50KB
返回 下载 相关 举报
数值分析计算方法.doc_第1页
第1页 / 共11页
数值分析计算方法.doc_第2页
第2页 / 共11页
数值分析计算方法.doc_第3页
第3页 / 共11页
点击查看更多>>
资源描述
计算方法实验内容一实验一:用两种不同的顺序计算,分析其误差的变化。1. 实验目的:通过正序反序两种不同的顺序求和,比较不同算法的误差;了解在计算机中大数吃小数的现象,以后尽量避免;体会单精度和双精度数据的差别。2. 算法描述:累加和s=0; 正序求和: 对于n=1,2,3,.,10000 s+=1.0/(n*n); 反序求和: 对于n=10000,9999,9998,.,1 s+=1.0/(n*n);3. 源程序:#双精度型#includecvoid main()double s=0;int n;for(n=1;n=1;n-)s+=1.0/(n*n);printf(反序求和结果是:%lfn,s);#单精度型#includevoid main()float s=0;int n;for(n=1;n=1;n-)s+=1.0/(n*n);printf(反序求和结果是:%fn,s);4. 运行结果:双精度型运行结果:单精度型运行结果:5. 对算法的理解与分析:舍入误差在计算机中会引起熟知的不稳定,算法不同,肯结果也会不同,因此选取稳定的算法很重要。选取双精度型数据正反序求和时结果一致,但选用单精度型数据时,求和结果不一致,明显正序求和结果有误差,所以第一个算法较为稳定可靠。二实验二:1、拉格朗日插值按下列数据x-3.0-1.01.02.03.0y1.01.52.02.01.0作二次插值,并求x=-2,x=0,x=2.75时的函数近似值2牛顿插值按下列数据x0.300.420.500.580.660.72y1.044031.084621.118031.156031.198171.23223作五次插值,并求x=0.46,x=0.55,x=0.60时的函数近似值.1.实验目的:通过拉格朗日插值和牛顿插值的实例,了解两种求解方法,并分析各自的优缺点。2.算法描述:3.源程序:拉格朗日插值:#include#define k 2void main() double L,Y,a;double x3;double y3;for(int p=0;p=2;p+)scanf(%lf%lf,&xp,&yp);for(int q=0;q=2;q+)Y=0;scanf(%lf,&a);for(int j=0;j=k;j+)L=1;for(int i=0;i=k;i+)if(i!=j)L*=(a-xi)/(xj-xi);Y+=L*yj;printf(x=%lf的函数值是:%lfn,a,Y);牛顿插值:#includevoid main()int i,j;double a66,y,s,x;for(j=0;j=1;j+)for(i=0;i6;i+)scanf(%lf,&aij);for(j=2;j=5;j+)for(i=j-1;i=5;i+)aij=(aij-1-ai-1j-1)/(ai0-ai-j+10); for(int k=0;k3;k+)scanf(%lf,&x);y=0;for(i=0;i=0;j-)s*=x-aj0;y+=s;printf(结果是:%lfn,y);4. 运行结果:拉格朗日运行结果:牛顿插值运行结果:5. 对算法的理解与分析:(1)拉格朗日插值:该公式是对一系列点加权求和。内插通常优于外推。选择的区间包括x,插值效果越好,高次插值通常优于低次插值,但并不是意味着插值次数越高越好。优点:编程容易实现。缺点:如果发现当前的插值方法 不够精确,就要增加插值节点的个数。拉格朗日基函数每一个都要重新计算,效率低。 (2) 牛顿插值:优点:如果当前插值方法不稳定,需要增加插值节点个数,只需要计算新家节点所增加的差商即可,之前的计算结果可以被复用,比拉格朗日插值节省计算量,效率高,精度高,更为稳定。三实验三:分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。1.实验目的:通过实例体会各种算法的精度。熟练掌握复化梯形,复化辛普森,复化柯特斯求积方法的程序。2.算法描述:复化梯形:fc(x)=sinx/x,N等分,a,b是积分区间;令s=fc(a)+fc(b),对于i=a+1.0/N,a+2.0/N,.(ib) s+=2*fc(i);s*=double(b-a)/(2*N);输出s;复化辛普森:fc(x)=sinx/x,N等分,a,b是积分区间;令s=fc(a)+fc(b),对于i=a+1.0/N,a+2.0/N,.(ib) s+=2*fc(i);对于i=a+0.5/N,a+1.5/N,.(ib) s+=4*fc(i);s*=double(b-a)/(6*N);输出s;复化柯特斯:fc(x)=sinx/x,N等分,a,b是积分区间;令s=fc(a)+fc(b),对于i=a+1.0/(4*N),a+2.0/(4*N),.(ib) s+=32*fc(i);对于i=a+2.0/(4*N),a+6.0/(4*N),.(ib) s+=12*fc(i);对于i=a+1.0/N,a+2.0/N,.(ib) s+=14*fc(i);s*=double(b-a)/(90*N);输出s;3. 源程序:#include#include#define N 8#define a 0#define b 1double fc(double x)double y;y=sin(x)/x;return y;void tx() double s,i;s=fc(a)+fc(b);for(i=a+1.0/N;ib;i+=1.0/N)s+=2*fc(i);s*=double(b-a)/(2*N);printf(复合梯形8等分求积结果是:%lfn,s);void xps() double s,i;s=fc(a)+fc(b);for(i=a+1.0/N;ib;i+=1.0/N)s+=2*fc(i);for(i=a+0.5/N;ib;i+=1.0/N)s+=4*fc(i);s*=double(b-a)/(6*N);printf(复合辛普森8等分求积结果是:%lfn,s);void kts() double s,i;s=fc(a)+fc(b);for(i=a+1.0/(4*N);ib;i+=2.0/(4*N)s+=32*fc(i);for(i=a+2.0/(4*N);ib;i+=1.0/N)s+=12*fc(i);for(i=a+1.0/N;ib;i+=1.0/N)s+=14*fc(i);s*=double(b-a)/(90*N);printf(复合柯特思斯8等分求积结果是:%lfn,s); void main()char d;scanf(%c,&d);if(d=t)tx();if(d=x)xps();if(d=k)kts();4.运行结果:5.对算法的理解与分析:他们都适用于求数值积分,而且都能提高计算的精度,他们都是在每个小区间上在使用梯形,辛普森,柯特斯求积公式,其中复化辛普森和复化柯特斯的收敛速度较快。四实验四:用改进欧拉方法解初值问题y=x+y; y(0)=1。0x1,取步长h=0.1计算,并与准确值 y=-x-1-2ex相比较。(p141习题第二题2)1.实验目的:熟悉常微分方程初值问题的求解方法;熟悉其算法;2.算法描述:3.源程序:4.运行结果:5.对算法的理解与分析:5 实验五:分别用下列方法求f(x)=x3-3x-1=0在x0=2附近的根。根的准确值为x*=1.87938524,要求准确到四位有效数字,并对比各种算法的计算量。(1)二分法;(2)简单迭代法;(3)牛顿迭代法1.实验目的:通过对二分法,简单迭代法和牛顿迭代法的编程和上机实验,进一步体会他们在方程求根中的不同特点;比较三者的计算速度和计算精度。2.算法描述:二分法:给定区间a,b,e=pow(10,-4)*0.5(1)令c=(a+b)/2,保持b-ae;(2)如果f(c)*f(a)=0,输出c;如果f(c)*f(a)0,b=c,执行(1)否则a=c,执行(1)简单迭代法:3. 源程序:二分法:#include#includedouble fc(double x)double y;y=x*x*x-3*x-1;return y;void main(void) double fa=fc(1),fb=fc(3),a=1,b=3,f,x0;int k=0;for(;ba&b-a=pow(10,-4)*0.5;)f=fc(a+b)/2);if(f=0)x0=(a+b)/2;break;elseif(fa*f0)b=(a+b)/2;elsea=(a+b)/2;k+;x0=(a+b)/2;printf(近似根是:%lf 准确根是:1.87938524n,x0);printf(迭代次数是:%dn,k); 简单迭代法:#include#includedouble Iterate1(double x)double y;y=pow(3*x+1),1.0/3);return y;double Derivative1(double x)double y;y=pow(3*x+1),-2.0/3);return y;double Iterate2(double x)double y;y=(1-x*x*x)/3.0;return y;double Derivative2(double x)double y;y=-x*x;return y;double Iterate3(double x)double y;y=(3*x+1)/(x*x);return y;double Derivative3(double x)double y;y=(-3*x-2)/(x*x*x);return y;void main(void)double x2=2.0,x1;int k=0;double a1=Derivative1(x2);if(fabs(a1)=pow(10,-4)*0.5); printf(近似根是:%lf 准确根是:1.87938524n,x1); printf(迭代次数是:%dn,k);double a2=Derivative2(x2);if(fabs(a2)=pow(10,-4)*0.5); printf(近似根是:%lf 准确根是:1.87938524n,x1); printf(迭代次数是:%dn,k);double a3=Derivative3(x2);if(fabs(a3)=pow(10,-4)*0.5); printf(近似根是:%lf 准确根是:1.87938524n,x1); printf(迭代次数是:%dn,k);牛顿迭代法:#include#includedouble Iterate(double x)double y;y=x*x*x-3*x-1;return y;double Derivative(double x)double y;y=3*x*x-3;return y;void main()double x0=2.0,x1;double f0,f01,f1,f11;f0=Iterate(x0);f01=Derivative(x0);int k=0;x1=x0-f0/f01;for(;fabs(x0-x1)=pow(10,-4)*0.5;f0=f1,f01=f11)x0=x1;x1=x0-f0/f01; f1=Iterate(x1);f11=Derivative(x1);k+;if(f11=0)printf(牛顿迭代法失效n);break;printf(近似根是:%lf 准确根是:1.87938524n,x1);printf(迭代次数是:%dn,k);4. 运行结果:二分法运行结果:简单迭代法运行结果:牛顿迭代法运行结果:
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 临时分类 > 人文社科


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!