c++ 线性方程组的数值解法

上传人:n**** 文档编号:88889575 上传时间:2019-05-12 格式:DOC 页数:21 大小:188.50KB
返回 下载 相关 举报
c++ 线性方程组的数值解法_第1页
第1页 / 共21页
c++ 线性方程组的数值解法_第2页
第2页 / 共21页
c++ 线性方程组的数值解法_第3页
第3页 / 共21页
c++ 线性方程组的数值解法_第4页
第4页 / 共21页
c++ 线性方程组的数值解法_第5页
第5页 / 共21页
点击查看更多>>
资源描述

《c++ 线性方程组的数值解法》由会员分享,可在线阅读,更多相关《c++ 线性方程组的数值解法(21页珍藏版)》请在金锄头文库上搜索。

1、线性方程组的数值解法一、下三角方程组的解法对于线性方程组:即:写成通式的形式: C+源程序:#include const int n=4;void LYB(double Lnn+1) for(int i=0;in;i+) for(int j=0;j=i-1;j+) Lin-=Lij*Ljn; void main()double Lnn+1=1,0,0,0,4,1,1,0,0,7,1,-1,1,0,3,1,-1,-1,1,0;LYB(L);for(int i=0;in;i+) coutYi=Linendl;二、上三角方程组的解法对于线性方程组:即:写成通式的形式:#include const i

2、nt n=4;void UXY(double Unn+1) for(int i=n-1;i=0;i-) for(int j=i+1;j=n-1;j+) Uin-=Uij*Ujn; Uin/=Uii; void main()double Unn+1=1,-1,-1,1,0,0,1,-1,1,3,0,0,1,1,3,0,0,0,1,2; UXY(U); for(int i=0;in;i+) coutXi=Uinendl;三、GAUSS消去法解线性方程组1、消去目标2、消去过程(假定在以下消去演算中不会出现分母为0的情况)为直观起见,我们把方程组写成如下形式:第0步,实现第0列目标:消去第(1)、(

3、2)、(n-1)中的项,(0)式保持不变。方法:即:注意:j=0可以不算,如果要算,其结果肯定是0。经第一步计算后,方程组变成了如下形式:第1步:在第0步成果的基础上,实现第1列目标:消去第(2)、(3)、(n-1)中的项,(0)、(1)式保持不变。方法:即:经第二步计算后,方程组变成了如下形式:由第一步、第二步的消去过程,不难归纳出任意一步(第k步)的计算通式:Gauss消去法已经将原方程组变形为上三角方程组,逆序回代容易求出最后结果。在第k步Gauss消去法中,要用到做分母,这就严格要求的绝对值不能太小。对于事先无法估计的值,解决办法是:每步消去之前,先考察待消去的几个方程的绝对值大小,并

4、交换方程次序,以保证绝对值最大。程序设计思路:1、 设计数组,其中前面的0至n-1列存放方程组的系数矩阵,第n列存放常数项。2、 设计求列中最大值函数,为选择主元作准备。3、 设计一个交换数据函数,为交换方程做准备,4、 设计一个消去函数,其中要调用求列中最大值函数确定主元,要调用交换数据函数来交换方程5、 调用上三角方程组的求解函数求出最终解。6、 主函数准备数据、调用有关函数、输出结果课堂练习:编程实现用Gauss消去法解任意大小的方程组。#include #include const int n=4;/*下面是求列中最大值函数,考察范围是:akk、ak+1k、an-1k,返回结果是主元的

5、行号,为选择主元作准备。*/int Max(double ann+1,int k)int t=k;double max=fabs(akk);for(int i=k+1;imax)t=i;max=fabs(aik);return t;/*下面是一个交换第k行和第t行方程的函数,选主元的后续工作*/void change(double ann+1,int k,int t)double x;for(int j=k;j=n;j+)x=akj;akj=atj;atj=x;/*下面是高斯消去法的核心函数,其中调用求主元、交换方程函数*/void gauss(double ann+1)for(int k=0

6、;kn-1;k+)int t=Max(a,k);if(t!=k)change(a,k,t);for(int i=k+1;in;i+)for(int j=k+1;j=0;i-) for(int j=i+1;j=n-1;j+) ain-=aij*ajn; ain/=aii; /*主函数void main()double Ann+1=1,1,-1,1,4,1,-1,-1,1,0,2,1,-1,-1,-3,2,2,1,-1,5;gauss(A);LYB(A);for(int i=0;in;i+)coutxi=Ainendl;coutendl; 四、三角分解法解线性方程组1、对于n元线性方程组,其分解目

7、标是:2、分解过程:分n步进行,每一步又拆分成两小步,即有:0.1,0.2步;1.1,1.2步;2.1,2.2步;n-1.1,n-1.2步。请注意:0.1步:观察矩阵A的第0行元素: 0.2步:观察矩阵A的第0列剩余元素(已运算过的元素不再考虑): 1.1步:观察矩阵A的第1行剩余元素(已运算过的元素不再考虑): 1.2步:观察矩阵A的第1列剩余元素(已运算过的元素不再考虑): k.1步:观察矩阵A的第k行剩余元素(已运算过的元素不再考虑):此时,矩阵A的第k行剩余元素有:注意,矩阵L的第k行元素是: 尾部有n-k个0,0多。矩阵U的第j列元素是: 尾部有n-j个0,0少。所以:所以:k.2步

8、:观察矩阵A的第k列剩余元素(已运算过的元素不再考虑): 此时,矩阵A的第k列剩余元素有:注意,矩阵L的第i行元素是: 尾部有n-i个0,0少。矩阵U的第j列元素是: 尾部有n-k个0,0多。所以:所以:3、小结:方阵A的LU分解过程可总结为: 4、利用矩阵的LU分解法解线性方程组假若UX=Y,则LY=B即假设:则:程序设计思路:1、设计一个数组,其中前面的0至n-1列存放方程组的系数矩阵,第n列存放常数项。2、对数组的系数矩阵部分(0至n-1列)进行LU分解,常数项(数组的第n列)保持不动。LU分解的结果依然存放在数组中,其中下三角存放L阵的结果(对角线元素均为1,不存放),上三角存放U的结

9、果(含对角线)。3、利用下三角方程组的解法求中间结果,结果存放在常数项列阵的位置(数组的第n列)4、利用上三角方程组的解法求最终结果,最终结果也存放在常数项列阵的位置(数组的第n列)5、主函数的作用的准备数据和函数协调调用、结果输出。#include const int n=4;/*下面函数的作用是系数矩阵的分解*/void LU(double ann+1) for(int k=0;k=n-1;k+) for(int j=k;j=n-1;j+) for(int q=0;q=k-1;q+) akj-=akq*aqj; for(int i=k+1;i=n-1;i+) for(int q=0;q=k-1;q+) aik-=aiq*aqk; aik/=akk; /*解下三角方程组*/void LYB(double Lnn+1) for(int i=0;in;i+) for(int j=0;j=0;i-) for(int j=i+1;j=n-1;j+) ain-=aij*ajn; ain/=aii; /*主函数*/void main()double Ann+1=1,1,-1,1,4,1,-1,-1,1,0,2,1,-1,-1,-3,2,2,1,-1,5; LU(A); LYB(A); UXY(A); for(int i=0;in;i+) coutxi=Ainendl; coutendl;

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号