数值计算方法实验报告.docx

上传人:jian****018 文档编号:8573023 上传时间:2020-03-30 格式:DOCX 页数:6 大小:35.82KB
返回 下载 相关 举报
数值计算方法实验报告.docx_第1页
第1页 / 共6页
数值计算方法实验报告.docx_第2页
第2页 / 共6页
数值计算方法实验报告.docx_第3页
第3页 / 共6页
点击查看更多>>
资源描述
数值计算方法实验报告 线性方程组的解法 线性方程组的各种解法题目:用三种不同的方法计算线性方程组Ax=b,输入方程组的阶数n,矩阵A的元素和常向量b的元素,输出方程组的解。一 高斯列主元法1方法原理:.高斯消去法包括两过程:先把方程组化为同解的上三角方程组,再按相反顺序求解上三角方程组。前者称消去或消元过程,后者称回代过程。消去过程实际上是对增广矩阵作初等变换。对一般的n阶方程组,消去过程分n-1步:第一步消去a11下方元素,第二部消去a22下方元素,第n-1步消去an-1n-1下方元素。第k步将第k行的适当倍数加于其后各行,也可说是从k+1n行减去第行的适当倍数,使它们的第k列元素变为0,而k+1n+1列元素减去第k行对应列元素的倍数。为了避免出现小主元,可在第k步的第k列的元素akk,ak+1k,ank中选主元,即在其中找出绝对值最大的元素apk,然后交换第k和第p行,继续进行消去过程。交换行相当于改变方程顺序,不会影响原方程组的解。这种方法称为列主元消去法。2. 源代码:void Gaosi(float a1515,int n,float b15,float x15)/*高斯列主元法的函数*/int i,j,k;for(k=1;k=n-1;k+)float max=fabs(akk);int p_max=k;for(int p=k;p=n;p+) /*列主元的选主元*/if(maxfabs(apk)&p!=k)for(int m=1;m=n+1;m+) float temp=0;temp=akm;akm=apm;apm=temp; for(i=k+1;i=n;i+)float c=aik/akk;for(j=k;j=n+1;j+)aij=aij-c*akj;for(int p=1;p=1;k-)float sum=0;for(j=k+1;j=n;j+)sum+=(akj*xj); xk=(bk-sum)/akk;cout=;cout用高斯消去法解方程组:endl;cout经过高斯变换后的增广矩阵:endl;for(int m=1;m=n;m+)for(int q=1;q=n+1;q+)printf(%f ,amq);coutendl;Output(x,n); /*依次输出方程的解*/二 Jacobi迭代法1. 方法原理:由方程组的形式可构成迭代式:xi(k+1)=(-ai1x1(k)-aii-1xi-1(k)-aii+1xi+1(k)-a1xn(k)+bi)/aii, i=1n给定初值x(0)=x(x1(0),x2(0),xn(0)T,令k=0,1,,由此可得向量序列x(k).如果此序列收敛于x,那么每个分量序列xi(k)必收敛于想xi,xi(i=1n)就必然是原方程组的解。此方法称为雅可比(Jacobi)迭代法。2. 源代码:void Jacobi(float a1515,float x15,int n,float b15)/*雅可比迭代法函数*/float y15=0;double D;for(int i=1;in+1;i+)xi=0;while(1)D=0;for(int i=1;in+1;i+)yi=bi;for(int j=1;jD) /*退出循环的条件*/D=fabs(xi-yi);for(int i=1;i=Level)continue;elsebreak;cout=;cout用Jacobi法解方程组:endl;Output(x,n);三 Seidel迭代法1. 方法原理:Seidel迭代法是在Jacobi方法的基础上进行了改进。它在计算想x(k+1)时,将已经算出的分量立即代替x(k)对应分量,又称作逐个迭代法。2. 源代码:void Seidel(float a1515,float x15,int n,float b15)/*Seidel迭代法函数*/float y=0;double D;for(int i=1;in+1;i+)xi=0;while(1)D=0;for(int i=1;in+1;i+)y=bi;for(int j=1;jD)D=fabs(xi-y);xi=y;if(D=Level)continue;else break;cout=;cout用Seidel法解方程组:endl;Output(x,n);四 代码补充说明与运行结果:void Output(float x15,int n)/*将方程的解输出的函数*/cout方程的解为:endl;for(int p=1;p=n;p+)coutxp=xpendl;void Input(float a1515,int &n,float b)/*输入方程参数的函数*/float m_in;cout请输入方程阶数n:n;cout请依次输入方程对应的增广矩阵中的数据:endl; for(int m=1;m=n;m+)for(int q=1;qm_in;amq=m_in;for(int p=1;p=n;p+)bp=apn+1;int _tmain(int argc, _TCHAR* argv)/*主函数*/float a1515=0,x15=0,b15=0;int n=0;while(1)char in;Input(a,n,b);Gaosi(a,n,b,x);Jacobi(a,x,n,b);Seidel(a,x,n,b);/*用三种方法解方程组*/cout再来解一个?y/nin;if(in=y)continue;else break;return 0;运行结果:五 结果分析:上方的方程组用三种方法得出的结果基本相同,但在计算其它的方程组时,会发现高斯列主元法基本不会出大的差错,而两种迭代法会出现一些错误。这是由于高斯列主元法是一种比较通用的方法,而迭代法是要求方程组的解必须是收敛的。如果不收敛的话,算法会无限进行下去,程序也就运行不出结果。所以,在实际操作中,应该先判断方程组的解是否收敛,然后选择合适的算法进行计算。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


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

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


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