《计算方法实验报告(共23页).doc》由会员分享,可在线阅读,更多相关《计算方法实验报告(共23页).doc(23页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上计算方法实验报告班级:信息安全09-1班学号:姓名:王义涛合肥工业大学计算机与信息学院2011/5/28目录实验一 牛顿下山法求解非线性方程的根一、实验目的(1)熟悉非线性方程求根简单迭代法,牛顿迭代及牛顿下山法(2)能编程实现简单迭代法,牛顿迭代及牛顿下山法(3)认识选择迭代格式的重要性(4)对迭代速度建立感性的认识;分析实验结果体会初值对迭代的影响二、实验内容用牛顿下山法解方程 (初值为0.6)输入:初值,误差限,迭代最大次数,下山最大次数输出:近似根各步下山因子三、基本原理牛顿下山公式:下山因子下山条件四、算法设计与实现流程图图3.2牛顿下山算法流程图关键点:w
2、hile(fabs(f(x1)fabs(f(x0)cout=r n)cout迭代失败=eps)if(df(x0)=0)cout*无法迭代*m)cout迭代失败endl;break;/迭代过程五、输入与输出x0=0.6;e=0.;m=100;n=100输出六、源代码#include#includeusing namespace std;double f(double x)return (x*x-1)*x-1;double df(double x)return 3*x*x-1;double newton(double x0,double eps,int n,int m)if(df(x0)=0)co
3、ut*无法迭代*fabs(f(x0)cout=r n)cout迭代失败=eps)if(df(x0)=0)cout*无法迭代*m)cout迭代失败endl;break;/迭代过程return x1;void main()double x0,x1,e;x0=0.6;e=0.;x1=newton(x0,e,100,100);coutx=x1endl;实验二 高斯赛德尔法求线性方程组一、实验目的(1)熟悉求解线性方程组的有关理论和方法;(2)能编程实现雅可比及高斯-塞德尔迭代法;(4)根据不同类型的方程组,选择合适的数值方法。二、实验内容用Gauss - Seidel 迭代法求解方程组 输入:系数矩阵
4、A,最大迭代次数N,初始向量,误差限e输出:解向量三、算法基本原理线性方程组大致分迭代法和直接法。只有收敛条件满足时,才可以进行迭代。高斯-塞德尔是最基本的一类迭代方法,其迭代过程中引用新值进行剩下的计算。高斯-塞德尔迭代: 四、算法设计与实现流程图关键算法:图4.1G-S迭代算法流程图关键算法:Xi解的向量,a方程组的增广矩阵for(k=1;k=max_k;k+)cout第k次迭代;e2=0;for(i=0;in;i+)old_x=xi;sum=0;for(j=0;jm;j+)if(i!=j)sum=sum+aij*xj;xi=(bi-sum)/aii;if(e2fabs(old_x-xi)
5、e2=fabs(old_x-xi);coutxi ;coutendl;if(e2e1)break;五、计算用例的参考输出 六、源代码G_S.h#include#includeusing namespace std;#define MAXSIZE 50void input(double aMAXSIZEMAXSIZE,double b,int n,int m)int i,j;cout请输入原方程的增广矩阵endl;for(i=0;in;i+)for(j=0;jaij;cinbi;coutendl;void output(double x,int n)cout原方程组的解的向量为:endl;for
6、(int i=0;in;i+)coutxi ;Gauss_seder.cpp#includeG_S.hint main()double aMAXSIZEMAXSIZE,bMAXSIZE,xMAXSIZE;double e1,e2,sum,old_x;int n,m,i,j,k,max_k;cout输入原方程的行数nn;cout输入原方程的列数mm;input(a,b,n,m);cout输入迭代初始向量endl;for(i=0;ixi;cout输入做大迭代次数max_k;cout输入误差上限e1;for(k=1;k=max_k;k+)cout第k次迭代;e2=0;for(i=0;in;i+)ol
7、d_x=xi;sum=0;for(j=0;jm;j+)if(i!=j)sum=sum+aij*xj;xi=(bi-sum)/aii;if(e2fabs(old_x-xi)e2=fabs(old_x-xi);coutxi ;coutendl;if(e2e1)break;if(k=max_k)output(x,n);else cout超过最大迭代次数,迭代失败!endl;实验三 高斯消去法一、实验目的(1)熟悉求解线性方程组的有关理论和方法;(2)能编程实现列主元高斯消去法;(4)根据不同类型的方程组,选择合适的数值方法。二、实验内容用选主元高斯消去求方程组三、算法基本原理A. ;B.消元结果直接
8、存储在系数矩阵中;C.当消元过程发生两行对调的情况为偶数次时,行列式值为对角线乘积,否则为对角线乘积的相反数。四、算法设计与实现列主元高斯消去法:列主元消元 回代图4.2列主元的约当消去约当消去 关键点:/选主元素for(k=0;kn-1;k+)max=akk;max_i=k;for(i=k+1;ifabs(max)max=aik;max_i=i;if(max=0)break;if(max_i!=k)/交换两行for(j=k;jn+1;j+)t=akj;akj=amax_ij;amax_ij=t;for(i=k+1;in;i+)aik=aik/-akk;for(j=k+1;j=0;k-)sum
9、=0;for(j=k+1;jn;j+)sum=sum+akj*xj;xk=(akn-sum)/akk;/回代五、计算用例的参考输出六、源代码Gauss.h#include#includeusing namespace std;#define MAX 50void input(double aMAXMAX+1,int n)cout输入原方程组的增广矩阵endl;for(int i=0;in;i+)for(int j=0;jaij;void output(double x,int n)coutGauss消去法得到的原方程组的解为endl;for(int k=0;kn;k+)coutxk ;Gaus
10、sXiaoqu.cpp#includeGauss.hint main()double aMAXMAX+1,xMAX,sum,max,t;int n,i,j,k,max_i;cout输入原方程组的阶n;input(a,n);for(k=0;kn-1;k+)/选主元素max=akk;max_i=k;for(i=k+1;ifabs(max)max=aik;max_i=i;if(max=0)break;if(max_i!=k)/交换两行for(j=k;jn+1;j+)t=akj;akj=amax_ij;amax_ij=t;for(i=k+1;in;i+)aik=aik/-akk;for(j=k+1;j
11、n+1;j+)aij=aij+aik*akj;/消元if(max=0)cout原方程组无解=0;k-)sum=0;for(j=k+1;jn;j+)sum=sum+akj*xj;xk=(akn-sum)/akk;/回代output(x,n);coutendl;return 0;实验四 Romberg算法一、 实验目的(1) 熟悉梯形递推算法、龙贝格算法;(2) 能编程实现梯形递推算法、龙贝格算法;(3) 分析实验结果体会各种方法的精确度,建立计算机求解定积分问题的感性认识二、 实验内容用龙贝格算法计算输入:积分区间,误差限输出:序列Tn,Sn,Cn,Rn及积分结果(参考书本P71的表2-5)三、
12、算法基本原理由梯形递推公式求得梯形序列,相邻序列值作线性组合得Simpson序列, Simpson序列作线性组合得柯特斯序列, 柯特斯序列作线性组合的龙贝格序列。若|R2-R1|e,则输出R2;否则依此类推。梯形递推公式加权平均公式: 四、算法设计与实现kTSCR0R001R10R112R20R21R223R30R31R32R334R40R41R42R43本实验,未采取书本所提供的框图算法,而是直接使用T表,先通过梯形递推公式求解和,紧接着就求解S,通过精度判断,是否继续,将所得到的T,S,C,R都存储在R中,然后通过加权平均公式: 推出ri+1j=ri+1j-1+(ri+1j-1-rij-1
13、)/(m-1);每次循环将m=4*m,m初值为1。关键点:先用梯形递推法求解出T存在r0中,再通过一循环求解S、C、Rh=b-a;n=1;tn=h*(f(a)+f(b)/2;cout.precision(6);dori0=tn;s=0;x=a+h/2;while(xb)s=s+f(x);x=x+h;t2n=(tn/2+h*s/2);h=h/2;tn=t2n;i+;while(iMAXSIZE);加权平均公式for(j=1;jMAXSIZE-1;j+)m=m*4;for(i=0;iMAXSIZE;i+)ri+1j=ri+1j-1+(ri+1j-1-rij-1)/(m-1);五、计算用例的参考输出
14、六、源代码#include#include#includeusing namespace std;#define MAXSIZE 5double f(double x);int main()double x,a,b,h,s,e,tn,t2n,rMAXSIZEMAXSIZE;int n,i=0,j,m=1;cout请输入积分区间边界a和bab;cout输入精度e;h=b-a;n=1;tn=h*(f(a)+f(b)/2;cout.precision(6);dori0=tn;s=0;x=a+h/2;while(xb)s=s+f(x);x=x+h;t2n=(tn/2+h*s/2);h=h/2;tn=t
15、2n;i+;while(iMAXSIZE);for(j=1;jMAXSIZE-1;j+)m=m*4;for(i=0;iMAXSIZE;i+)ri+1j=ri+1j-1+(ri+1j-1-rij-1)/(m-1);coutTn、Sn、Cn、Rn如下表所示endl;for(i=0;i4;i+)for(j=0;ji+1;j+)coutrij;coutendl;for(i=0;i4;i+)coutr4i;coutendl;if(fabs(r43-r33)=e)cout积分=r43endl;else cout超出最大迭代次数!,异常退出!endl;double f(double x)if(x=0)ret
16、urn 1;else return sin(x)/x;实验五 RungeKutta算法一、实验目的(1)熟悉数值微分中Rung-Kutta方法;(2)能编程实现Rung-Kutta方法;(4)明确步长对算法的影响并理解变步长的Rung-Kutta方法二、实验内容(1) 0 x1取h=0.1时用Rung-Kutta方法求其数值解并与精确解进行比较。输入:求解区间,初值,数值解个数输出:数值解三、算法基本原理通过龙格-库塔法我们可以获得更高精度。经典龙格-库塔法即在区间xn,xn+1取四点,并对这四点的斜率进行加权平均作为平均斜率,通过泰勒公式寻找使局部截断误差为O(h5)(即4阶精度)的参数满足
17、条件。改进的欧拉公式: 预测校正四阶(经典)龙格-库塔公式四、算法设计与实现流程图:图5.3经典龙格库塔算法五、计算用例的参考输出六、源代码#include#include#includeusing namespace std;double f(double x, double y)return (y-2*x/y);void R_K(double x0,double y0,double h,int N)cout.precision(7);double x1,y1,K1,K2,K3,K4;int i=1;while(iN+1)x1=x0+h;K1=f(x0,y0);K2=f(x0+0.5*h,y
18、0+0.5*h*K1);K3=f(x0+0.5*h,y0+0.5*h*K2);K4=f(x0+h,y0+h*K3);y1=y0+h*(K1+2*K2+2*K3+K4)/6;coutxi=;coutx1 yi=;couty1endl;i=i+1;x0=x1;y0=y1;int main()double a,b,h;double y0=1;int N;cout请输入微分范围(a,b)ab;cout请输入数据组数NN;h=(b-a)/N;R_K(a,y0,h,N);return 0;感悟与体会学完了计算方法(数值分析),也做完了所有的实验,感受颇深。这些实验,按照指导书基本都能实现,但是龙贝格算法的
19、话,按照流程图比较复杂,在梯形递推公式求解T的时候就循环一次,其自身还有好几个循环,很容易乱。但是按照T表就没那么复杂,先以一个循环求解出T,存储起来,再以一个循环用加权平均公式求解出其他几个,这样便大大减小了时间复杂度。我想在做实验的时候,我们不能抱有侥幸的心理,要扎扎实实的做好每一个细节,如此才能有效率的完成实验,否则,每次都要回头检查代码,浪费大量的时间。当然,做好预习工作也是很重要的,比如说事先就写好了算法或是流程图,在写代码时就不会乱了。做实验,关键还是老师的指导,在汪老师的指导下,注意到了以前写代码时没有注意到的一些细节问题,有的时候细节是注定成败的。我觉得在以后也应该像这样,不清
20、楚的直接问老师,从老师的回答中要比我们自己看要强的多。总的来说,在完成这次试验后,我的编程基本功又增强了一些。就像汪老师在上课所强调的那样,平时多练练这些题,编程能力肯定是会增强的。还有就是,做实验的时候切记不能急躁,往往急躁的时候就很容易出错。一般做实验都是为了做实验而做实验,每次遇到程序调试不出来便会急躁,急躁就容易出错。一颗平静的心对于完成实验也是非常重要的。在计算方法课上,我学到了很多理论知识,而实验课上,我不仅巩固了理论知识,还学会了很多其他课上学不到的东西,我想这些东西将会终生受用。实验:用选主元高斯消去求行列式值#include #include #define MAX 10 u
21、sing namespace std; double AMAXMAX; int NUM; int size; int t; double Max; double tmp; double tmp1; int sign=0; int main(void) int i,j,k; coutNUM; size=NUM; for(i=1;i=size;i+) cout请输入A的第i行元素,各元素间以空格间隔:n; for(j=1;jAi-1j-1; coutn您输入的维度是:NUMendl您输入的矩阵A:n; for(i=0;isize;i+) for(j=0;jsize;j+) coutAijt; co
22、utnn; for(i=0;isize-1;i+) t=i; Max=Aii; for(j=i+1;jsize;j+) if(fabs(Max)fabs(Aji) Max=Aji; t=j; if(fabs(Max)0.) cout行列式的值是: 0 endl; break; if(t!=i) sign+; for(j=i;j=size;j+) tmp=Aij; Aij=Atj; Atj=tmp; for(j=i+1;jsize;j+) tmp1=Aji/Aii; for(k=i;ksize+1;k+) Ajk=Ajk-Aik*tmp1; tmp1=1; for(i=0;isize;i+) tmp1*=Aii; if(sign%2=0) cout行列式的值是:tmp1n; else cout行列式的值是:-tmp1n; return 0; 专心-专注-专业