《数值分析》上机实习报告_数值分析上机实验报告

2020-02-27 实习报告 下载本文

《数值分析》上机实习报告由刀豆文库小编整理,希望给你工作、学习、生活带来方便,猜你可能喜欢“数值分析上机实验报告”。

数值分析上机实验报告

姓 名:班 级:学 号:院 系:机械工程学院指导教师:C语言)

2006级 2006050349

(for(j=0;j

}

void gu(float a[N][N],float b[N])/* 子函数高斯消去法*/ { int i,j;

{

} printf(“Household变换的结果:”);/*输出Household变换的结果*/ for(i=0;i

for(j=0;j

} if(j%N==0)printf(“n”);s=0.0;for(i=j+1;i

} for(i=0;i

} for(k=0,i=0;i

q[i]=y[i]-k*u[i];for(i=0;i

} x[N-1]=y[N-1]/u[N-1];for(i=N-1;i>=0;i--)x[i]=(y[i]-a[i][i+1]*x[i+1])/u[i];printf(“消去法的结果:n”);/*输出消去法的结果*/ for(i=0;i

} printf(“n”);}

void sor(float a[N][N],float b[N])/*子函数超松驰法*/ { float a1[N][N];int i,j,k,m;float x[N],temp[N][N];float w=1.4,h=0,g=0;for(m=0;m

{ for(j=1;j

q[i]=a[i][i-1]/u[i-1];u[i]=a[i][i]-q[i]*a[i-1][i];y[i]=b[i]-q[i]*y[i-1];if(i==5)printf(“n”);printf(“x%d=%9.6f ”,i,x[i]);

} g=(h+b[i-1])*w;x[i-1]=(1-w)*x[i-1]+g;h=0.0;g=0.0;} } printf(“超松弛法的结果:n”);/*输出超松弛法的结果*/ for(i=0;i

{ 2.115237,19.141823,-3.125432,-1.012345,2.189736,1.563849,-0.784165,1.112348,3.123124}, {-1.061074,-3.125432,15.567914,3.123848,2.031454,1.836742,-1.056781,0.336993,-1.010103}, {1.112336,-1.012345,3.123848,27.108437,4.101011,-3.741856,2.101023,-0.71828,-0.037585}, {-0.113584,2.189736,2.031454,4.101011,19.897918,0.431637,-3.111223,2.121314,1.784317}, {0.718719,1.563849,1.836742,-3.741856,0.431637,9.789365,-0.103458,-1.103456,0.238417}, {1.742382,-0.784165,-1.056781,2.101023,-3.111223,-0.103458,14.713846,3.123789,-2.213474}, {3.067813,1.112348,0.336993,-0.71828,2.121314,-1.103456,3.123789,30.719334,4.446782}, {-2.031743,3.123124,-1.010103,-0.037585,1.784317,0.238417,-2.213474,4.446782,40.00001}}, b[N]={2.1874369,33.992318,-25.173417,0.84671695,1.784317,-86.612343,1.1101230,4.719345,-5.6784392};housholder(a);/*调用househloder函数*/ gu(a,b);/*调用消去法求解*/ sor(a,b);/*调用超松驰法求解*/ }

四、运行结果

Household变换的结果: 12.3841-4.8931 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000-4.8931 25.3984 6.4941 0.0000-0.0000 0.0000-0.0000-0.0000-0.0000 0.0000 6.4941 20.6115 8.2439-0.0000-0.0000-0.0000 0.0000 0.0000 0.0000 0.0000 8.2439 23.4229-13.8801-0.0000 0.0000-0.0000 0.0000 0.0000-0.0000-0.0000-13.880129.6983 4.5345 0.0000 0.0000 0.0000 0.0000 0.0000-0.0000-0.0000 4.5345 16.0061 4.8814 0.0000-0.0000 0.0000-0.0000-0.0000 0.0000 0.0000 4.8814 26.0133-4.5036 0.0000 0.0000-0.0000 0.0000-0.0000 0.0000 0.0000-4.5036 21.2540 4.5045 0.0000-0.0000 0.0000 0.0000 0.0000-0.0000 0.0000 4.5045 14.5341 消去法的结果:

x0= 1.075799 x1= 2.275744 x2=-2.855514 x3= 2.293097 x4= 2.112633 x5=-6.423833 x6= 1.357923 x7= 0.634245 x8=-0.587266 超松弛法的结果:

x0= 1.073409 x1= 2.272580 x2=-2.856600 x3= 2.292511 x4= 2.112164 x5=-6.422582 x6= 1.357802 x7= 0.634259 x8=-0.587042

五、问题讨论: 1.算法分析

SOR方法的矩阵形式为: X(m)=(E-ωL)-1((1-ω)E+ωR)x(m-1)+(E-ωL)-1ωg 若记 Lω=(E-ωL)-1((1-ω)E+ωR),SOR收敛的充要条件是S(Lω)

数组作为子函数参数时,实现的是地址传递,会改变原数组中元素的值,因此主函数调用housholder变换子函数后,原数组a[9][9]中的值已经改变为三对角阵。以下的消去法、超松弛法子函数调用的是已经三对角化后的a[9][9]的值。

调用时由于没有定义housholder变换子函数中数组a[][]的大小,运行时出现以下错误提示: error C2087: '' : miing subscript error C2133: 'a' : unknown size 修改大小为a[N][N]时(N为宏定义常数9),运行正常。

Xn1 , Zk mkmax(Xn)sa[0]=a[0][0]-x;if(sa[0]==0)sa[1]=a[0][1]*a[0][1];else sa[1]=a[1][1]-x-a[0][1]*a[0][1]/sa[0];for(i=2;i

}

float duifen(float a[N][N])/*对分法求取方程的解的子函数*/ { float 1=0,2=23,=0,h=0,g=0;float l,ll;h=f(a,2);while(1){

1=;g=f(a,);=0.5*(+23);l=0.5*(1+23);if(g-h==1)break;{ if(sa[i-1]*sa[i-2]!=0)sa[i]=a[i][i]-x-a[i-1][i]*a[i-1][i]/sa[i-1];else if(sa[i-2]==0)sa[i]=a[i][i]-x;if(sa[i-1]==0)sa[i]=-1;} { if(sa[i]>=0)hh+=1;else hh+=0;} for(i=0;i

float fanmi(float a[N][N])/*反幂法求解方程的解的子函数*/ {

float mk=0,t,t1;float z[N],yy[N],a3[N][N];int i,j,k,m,tt;float h=0;float l[N]={0,};t1=duifen(a);/*调用对分法求取方程的解*/ for(i=0;i

for(m=0;m-1;i--){ for(j=i+1;j

}

printf(“反幂法的解的特征向量是:n”);{if(m==5)printf(“n”);printf(“%-10.6f”,z[m]);} /*输出反幂法的解的特征向量*/ return 0;for(m=0;m

printf(“n”);main(){ float a[N][N]={{12.3841,-4.8931},{-4.8931,25.3984,6.4941},{0,6.4941,20.6115,8.2439}, {0,0,8.2439,23.4229,-13.8801},{0,0,0,-13.8801,29.6983,4.5345},{0,0,0,0,4.5345,16.0061,4.8814}, {0,0,0,0,0,4.8814,26.0133,-4.5036},{0,0,0,0,0,0,-4.5036,21.2540,4.5045},{0,0,0,0,0,0,0,4.5045,14.5341}};

printf(“对分法的结果是:n”);printf(“d=%f”,duifen(a));/*调用对分法并输出对分法近似解*/ fanmi(a);/*调用反幂法求解*/ }

四、运行结果 对分法的结果是: d=21.916260 反幂法的结果是: d=21.928129 反幂法的解的特征向量是:

0.157066-0.306359 0.282201 0.285925 0.198640 0.533758 0.462842 1.000000 0.611843

五、问题讨论 1.算法分析

1)对分法简单可靠,数值稳定性较高,对于求少量几个特征值特别适宜.但收敛速度较慢.2)反幂法是结合对分法使用的,近似值较恰当,其收敛速度是很快.只要迭代两次就可得到较满意的结果.但在运用中需把一般矩阵化为Heebberg阵才可计算.2.上机出现情况

当把对分法及反幂法全部写在主函数中,实现题目全部要求时,主函数过于冗长,不利于纠错,也不利于实现共享,通过修改对分法及反幂法为子函数调用,以便于调试,亦有利于共享。

for(j=0;j

}

b[0]=2*h*b[0];a[i][i-1]=1;a[i][i]=4;a[i][i+1]=1;b[N-1]=2*h*b[N-1];for(i=1;i

u[0]=a[0][0];/*消去法求c[i]*/ y[0]=b[0];for(i=1;i

} c[N-1]=y[N-1]/u[N-1];for(i=N-2;i>=0;i--)

for(i=0;i

} s=0.0;for(i=0;i

b[N-1]=b[N-1]+b[N-2];q[i]=a[i][i-1]/u[i-1];u[i]=a[i][i]-q[i]*a[i-1][i];y[i]=b[i]-q[i]*y[i-1];c[i]=(y[i]-a[i][i+1]*c[i+1])/u[i];e=fabs(*x-i);if(e>=2)

w[i]=0;w[i]=0.5*fabs(e*e*e)-e*e+2.0/3.0;w[i]=(-1.0/6.0)*fabs(e*e*e)+e*e-2*fabs(e)+4.0/3.0;else if(e

} *x=s;*x1=(c[(int)(m+1)]-c[(int)(m-1)])/2.0;void main(){

}

四、运行结果

三次样条插值求得的结果是: f(4.563)=1.517932 f'(4.563)=0.249350

五、问题讨论:

样条插值效果比Lagrange插值好,由于样条插值不必经过所有点,所以没有Runge现象.而且插值函数比较光滑。

其基本思想是对均匀分划的插值函数的构造,三次样条函数空间中不取1,x,x,x,(x-xj)+为基函数,而取B样条函数Ω3(x-xj/h)为基函数.由于三次样条函数空间是N+3维的,故我们把分点扩大到N1X-1,XN+1,则任意三次样条函数可用Ω3(x-xj/h)线性组合来表示 S(x)= 不同插值问题,若能确定cj由解的唯一性就能求得解S(x).2

33float b[N]={1,0,0.69314718,1.0986123,1.3862944,1.6094378,1.7917595, 1.9459101,2.079445,2.1972246,2.3025851,0.1};float x,x1;float h;h=1;x=4.563;scyt(&x,&x1,b,h);/*调用三次样条插值子函数*/ printf(“f(4.563)=%.6fn”,x);printf(“f'(4.563)=%.6fn”,x1);printf(“三次样条插值求得的结果是:n”);

cjΩ3(x-xj/h)这样对

j1 7

4float z;z=pow(x,7)-28*pow(x,4)+14;return(z);float z;z=7*pow(x,6)-112*pow(x,3);return(z);x=fabs(f1(a))>fabs(f1(b))?a:b;/*初始值的选择*/ } main(){ float a,b;

/*变量定义及赋初值*/ float min;float result;a=0.1;b=1.9;min=1e-5;result=ndf(a,b,min);/*调用牛顿法子函数*/ printf(“用牛顿法求方程在取初值为(0.1,1.9)区间端点时的近似根为:n”);printf(“x=%.6fn”,result);}

四、运行结果

用牛顿法求方程在取初值为(0.1,1.9)区间端点时的近似根为: x=0.845497

五、问题讨论

1.Newton法收敛速度比较快,是平方收敛,但它是局部收敛。2.采用newton法求方程平方收敛,较为精确。但需求函数导数。

3.初始值取为区间端点xo时,取使f(xo)f´´(xo)>0的一个,本例中取为xo=1.9。

(k)

(0)

(0)

3x1.42float z;z=pow(3,y)*pow(y,1.4)*(5*y+7)*sin(y*y);return(z);s=0;for(i=1;i

} {

} z=t[i+1][0];return(z);for(j=1;j

}

四、运行结果

用Romberg算法求积分的结果(允许误差为0.00001): I=440.536011

五、问题讨论: 1.算法分析

1)Romberge算法的优点是: 把积分化为代数运算,而实际上只需求T1,以后用递推可得.算法简单且收敛速度快,一般4或5次即能达到要求.2)Romberge算法的缺点是: 对函数的光滑性要求较高,计算新分点的值时,这些数值的个数成倍增加。

2.上机出现问题

本程序一开始编写时,是利用函数的递归调用来实现,编译正常通过,但运行时出现异常,经分析可能是多次递归产生误差,改用数组代替递归来存放Tij的值时,运行正常。

(i)float a,b;/*变量定义及初始化*/ float min;float result;float(*p)(float);a=1;b=3;min=1e-5;p=f;result=lbg(a,b,min,p);/*调用龙贝格法求积分子函数*/ printf(“用Romberg算法求积分的结果(允许误差为0.00001):n”);printf(“I=%.6fn”,result);

} } for(i=0;i

} fkt(work1,work2);*t=ttemp+temp[i];for(j=0;j

} }

四、运行结果

定步长四阶Runge-Kutta法求微分方程组解的结果: T Y1 Y2 Y3 0.025000| 0.025000| 0.151579| 8.346120 0.045000| 0.045000| 0.312984| 7.538067 0.085000| 0.085000| 0.560777| 4.944312 0.100000| 0.100001| 0.629078| 4.178828

五、问题讨论: 1.算法分析

1)Runge_Kutta方法的优点: 精度高,不必用别的方法求开始几点的函数值。

可根据f'(t,y)变化的情况与需要的精度自动修改步长。程序简单,存储量少。方法稳定。

rgkt(n,&t,step,&y,work1,work2,work3);/*调用Runge-Kutta算法求解*/ if(i==49||i==89||i==169||i==199)printf(“%9.6f|%9.6f|%9.6f|%9.6fn”,t,y[0],y[1],y[2]);2)Runge_Kutta方法的缺点: 每步要计算函数值f(t,y)四次,在f(t,y)较复杂时,工作量大, 且每一步缺乏可靠的检查。

2.上机出现情况

当用主函数实现题目全部要求时,主函数过于冗长,不利于修改和纠错,也不利于实现共享,通过修改Runge_Kutta法及函数表达式为子函数调用,并把一些条件语句放进子函数中,主函数只控制初始值及结果精度要求,经如此修改后便于阅读和调试。

西南交大数值分析上机实习报告

数值分析上机实习报告要求1.应提交一份完整的实习报告。具体要求如下:(1)要有封面,封面上要标明姓名、学号、专业和联系电话;(2)要有序言,说明所用语言及简要优、特点,说明选用的考量;(3......

数值分析学习报告

数值分析学习心得报告班级:11级软工一班姓名:***学号: 20117610***指导老师:***学习数值分析的心得体会无意中的一次选择,让我接触了数值分析。作为这学期的选修课,我从内心深处......

上机实习报告

刀豆文库小编为你整合推荐4篇上机实习报告,也许这些就是您需要的文章,但愿刀豆文库能带给您一些学习、工作上的帮助。......

CAD上机实习报告

CAD班级:电子质检1101班 姓名:郭利智 学号:200902 指导老师:潘庆杰 上机实习报告CAD上机实习报告1.实习任务用一周的时间对AUTOCAD软件练习的同时,完成机自教研室发的二维图......

上机实习实践报告

时代在进步,社会在发展,而随之而来的竞争也非常严峻的摆在了我们的面前,现代社会所需要的已经不再是单纯的知识型人才。时代赋予人才新的定义:不仅能够驾驭新科技,具有创新意识,更......

《《数值分析》上机实习报告.docx》
将本文的Word文档下载,方便收藏和打印
推荐度:
《数值分析》上机实习报告
点击下载文档
相关专题 数值分析上机实验报告 实习报告 数值 数值分析上机实验报告 实习报告 数值
[实习报告]相关推荐
[实习报告]热门文章
下载全文