数值分析实验报告77712.docx
- 文档编号:23545742
- 上传时间:2023-05-18
- 格式:DOCX
- 页数:25
- 大小:250.85KB
数值分析实验报告77712.docx
《数值分析实验报告77712.docx》由会员分享,可在线阅读,更多相关《数值分析实验报告77712.docx(25页珍藏版)》请在冰豆网上搜索。
数值分析实验报告77712
《数值分析》
实验报告
学院:
计算机科学与软件学院
姓名:
XXX
班级:
计算机XX班
学号:
XXXXXX
实验一:
舍入误差与数值稳定性
实验目的:
1、通过上机编程,复习巩固以前所学程序设计语言;
2、通过上机计算,了解舍入误差所引起的数值不稳定性。
3、通过上机计算,了解运算次序对计算结果的影响,从而尽量避免大数吃小数的现象.
实验内容:
用两种不同的顺序计算
分析其误差的变化。
实验流程图:
实验源程序:
#include〈stdio。
h>
#include
voidmain()
{inti;
floats1=0,s2=0,d1,d2;
for(i=1;i〈=10000;i++)
s1=s1+1。
0f/(i*i);
for(i=10000;i〉=1;i—-)
s2=s2+1.0f/(i*i);
d1=(float)(fabs(1。
644834—s1));
d2=(float)(fabs(1.644834-s2));
printf("正向求和结果为%f\n误差为%f\n\n",s1,d1);
printf(”反向求和结果为%f\n误差为%f\n\n”,s2,d2);
if(d1 printf("正向求和误差小于负向求和误差\n"); elseif(d1==d2) printf("正向求和误差等于负向求和误差\n"); else printf("正向求和误差大于负向求和误差\n"); } 实验结果: 实验分析: 第一次做数值实验,又一次使用C语言编程,没有了刚学习C语言的艰难,能够将实验步骤转换成流程图并编写出完整的实验代码,在经过多次调试、改正后得到正确的程序和结果。 这个实验较简单,计算误差时如果输入数据有误差,而在计算过程中舍入误差不增长,则称此算法是稳定的,否则称此算法是数值不稳定的,减少运算次数可以减小舍入误差。 在运算中,如果参加运算的数的数量级相差很大,而计算机位数有限,如不注意运算次序就可能出现大数“吃掉"小数的现象,进而影响计算结果的可靠性,所以计算过程中要注意运算次序,避免出现这种现象. 实验二: 拉格朗日插值法和牛顿插值法 实验目的: 分别用拉格朗日差值和牛顿插值解决数学问题,并比较各方法的优略. 1、拉格朗日插值 实验内容: 按下列数据 x —3。 0 -1.0 1.0 2.0 3.0 y 1.0 1。 5 2。 0 2。 0 1。 0 作二次插值,并求x =—2,x =0,x =2。 75时的函数近似值。 实验流程图: 实验源程序: #include h> floatlagrange(int,float,float[],float[]); voidmain() { floata,x[50],y[50],l; intm,n; printf(”题目: 按下列数据\n”); printf("x: —3。 0—1.01。 02。 03.0\n"); printf(”y: 1.01。 52。 02。 01。 0\n"); printf(”作二次插值,并求x=—2,x=0,x=2。 75时的函数近似值。 \n\n”); printf(”输入插值次数: ”); scanf("%d",&n); printf("输入计算次数: "); scanf(”%d”,&m); for(inti=0;i〈=m;i++) { for(intj=0;j<=n;j++) {printf("输入要计算的第%d个数的第%d个节点及其函数值: ”,i+1,j+1); scanf(”%f,%f”,&x[j],&y[j]); } printf("输入要计算的x的值: "); scanf(”%f”,&a); l=lagrange(n,a,x,y); printf(”%f\n”,l); } } floatlagrange(intn,floata,floatx[],floaty[]) { floatl=0,w; inti,j; for(i=0;i<=n;i++) { w=1; for(j=0;j〈=n;j++) { if(i! =j) w=w*((a-x[j])/(x[i]—x[j])); } l=l+w*y[i]; } returnl; } 实验结果: 2、牛顿插值 实验内容: 按下列数据 x 0。 30 0。 42 0。 50 0.58 0。 66 0。 72 y 1.04403 1.08462 1.11803 1.15603 1。 19817 1。 23223 作五次插值,并求x =0.46,x =0。 55,x =0。 60时的函数近似值。 实验源程序: #include〈stdio.h〉 #defineM6 floatw(floatX,intn,floatx[]); floatquotient(intk,inti,floatf[][M],floatx[],floaty[]); floatnewton(floatX,intn,floatf[][M],floatx[],floaty[]); voidmain() { floatx[M],y[M],f[M][M]; x[0]=0.30f;y[0]=1.04403f; x[1]=0。 42f;y[1]=1.08462f; x[2]=0。 50f;y[2]=1。 11803f; x[3]=0.58f;y[3]=1。 15603f; x[4]=0.66f;y[4]=1.19817f; x[5]=0。 72f;y[5]=1.23223f; printf(”x: 0。 300。 420。 500。 580。 660。 72\n"); printf(”y: 1.044031.084621。 118031.156031。 198171.23223\n"); printf("做五次插值,并求x=0.46,x=0.55,x=0。 60时的函数近似值.\n\n”); for(inti=0;i〈M;i++) f[0][i]=y[i]; floatN[3]; N[0]=newton(0。 46f,5,f,x,y); N[1]=newton(0。 55f,5,f,x,y); N[2]=newton(0.60f,5,f,x,y); printf("x=0.46时函数的近似值为%f\n”,N[0]); printf("x=0。 55时函数的近似值为%f\n”,N[1]); printf(”x=0.60时函数的近似值为%f\n”,N[2]); } floatw(floatX,intn,floatx[]) { floatw=1.0; for(inti=0;i〈n;i++) w=w*(X—x[i]); returnw; } floatquotient(intk,inti,floatf[][M],floatx[],floaty[]) { if(k==0) f[0][i]=y[i]; else f[k][i]=(quotient(k-1,i,f,x,y)-quotient(k-1,i-1,f,x,y))/(x[i]-x[i-k]); returnf[k][i]; } floatnewton(floatX,intn,floatf[][M],floatx[],floaty[]) { floatN; N=f[0][0]; for(inti=1;i<=n;i++) N=N+w(X,i,x)*quotient(i,i,f,x,y); returnN; } 实验结果: 实验分析: 拉格朗日插值法和牛顿插值法用拉格朗日插值多项式计算函数近似值时,如需增加插值节点,那么原来算出的数据均不能利用,必须重新计算.用牛顿差商插值多项式中各阶差商用相应查分代替,就可得到各种形式的等距节点插值公式.牛顿插值法比拉格朗日插值法节省计算量,且便于程序设计,计算增加节点时,计算只需要增加一项,而且牛顿插值更容易计算高次插值. 实验三: 复化积分法 实验目的: 学会用复化积分法提高求积的精度,熟记并掌握复化梯形和复化辛卜生公式。 实验内容: 分别用复化梯形公式和复化辛卜生公式计算f(x)=sin(x)/x的积分,并与准确值比较判断精度。 实验流程图: 实验源程序: #include #include〈math。 h〉 voidmain() { intm,n,k,i; floatTn,Sn,d1,d2,a=0,b=0,c=0; floatx[1000],y[1000],z[1000],w[1000]; { printf("将复化梯形区间划分: ”); scanf("%d”,&n); for(i=1;i { x[i]=float(1.0/n*i); y[i]=(float)(sin(x[i])/x[i]); a=a+y[i]; } Tn=(float)((1。 0+sin(1。 0)/1。 0+2*a)/2。 0/n); printf("复化梯形输出: %f\n",Tn); printf(”将复化辛卜生区间划分为: "); scanf(”%d”,&m); } for(k=1;k〈m;k++) { z[k]=float(1。 0/m*k); z[k+1]=float(1.0/m*(k+1)); z[k+1/2]=float(z[k]+z[k+1])/2; w[k]=(float)(sin(z[k])/z[k]); w[k+1/2]=(float)(sin(z[k+1/2])/((z[k]+z[k+1])/2)); b=b+w[k]; c=c+w[k+1/2]; } Sn=(float)((1.0+2*b+4*c+sin(1。 0)/1。 0)/6.0/m); printf("复化辛卜生输出: %f\n",Sn); { d1=(float)(fabs(0.9460831—Tn)); d2=(float)(fabs(0.9460831—Sn)); printf("复化梯形误差: %f\n",d1); printf(”复化辛卜生误差: %f\n",d2); if(d1〉d2) printf("复化梯形求法精度低于复化辛卜生求法\n”); elseif(d1==d2) printf(”复化梯形求法精度等于复化辛卜生求法\n"); else(d1 ;printf("复化梯形求法精度高于复化辛卜生求法\n"); } } 实验结果: 实验分析: 许多实际问题常常需要计算积分才能求解,梯形公式、牛顿-柯特斯公式和辛卜生公式是常用的求积公式,为避免可选取适当多的节点,即选取相对高阶的牛顿—柯特斯公式,但由稳定性分析可知,高次插值会产生龙格现象,故采用分段低次插值,然后利用积分的区间可加性得积分,即所谓的分段低次合成的复化求积公式。 复化求积法能改善求积精度,复化的梯形法和辛卜生法当步长h->0时,均收敛到所求的积分值。 若将步长h减半(即等分数n加倍),则梯形法、辛卜生法和牛顿—柯特斯法的误差分别减至原有误差的1/4、1/16和1/64. 实验四: 改进欧拉方法解初值问题 实验目的: 学会用改进的欧拉公式求解初值. 实验内容: 用改进欧拉方法解初值问题y’=x+y;y(0)=1.0 实验流程图: 实验源程序: #include〈stdio。 h〉 #include
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数值 分析 实验 报告 77712