高斯列主元消元法求解线性方程组

一、高斯消去法的基本思想
    例1. 解方程组:
                  

解 方程组矩阵形式为: AX=b ,其中: 
              

第一步,消元过程:对增广矩阵进行消元

     




即得方程组
   
第二步, 回代过程:
             

此方法就是高斯消去法

二、改进版算法

由高斯消去法知道,在消元过程中可能出现=0的情况, 这时消去法将无法进行;即使主元素≠0,但很小时,用其作除数,会导致其他元素数量级的严重增长和舍入误差的扩散, 最后也使得计算解不可靠。 
    引例 求解方程组
              

4位浮点数进行计算。
   解: 方法1 用高斯消去法求解。

             
                                  
其中
         
计算解为:

         

显然计算解 是一个很坏的结果,不能作为方程的近似解。
    方法2 交换行,避免绝对值小的主元做除数。
                


得计算解为:
         x=(-0.4900,-0.05113,0.3678)T ≈x*.
这个例子告诉我们,在采用高斯消去法解方程组时,小主元可能产生麻烦,故应避免采用绝对值小的主元素a  。对一般矩阵来说,最好每一步选取系数矩阵 ( 或消元后的低价矩阵 ) 中绝对值最大的元素作为主元素,以使高斯消去法具有较好的数值稳定性, 这就是 全主元素消去法 , 在选主元时要花费较多机器时间,目前主要使用的是 列主元消去法 。 

本节主要介绍列主元消去法,并假定 (2.1) A∈Rn×n 为非奇异的。
    1 列主元素消去法
设方程组 (2.1) 的增广矩阵为:

                  
 
首先在 A 的第一列中选取绝对值最大的元素作为主元素,例如: 
         |ai1,1|= max |ai1|≠0, 1≤i≤n 
然后交换 B 的第一行与第 i1  行,经第一次消元计算得
         (A|b)→(A(2)|b(2) )  
 重复上述过程,设已完成第 k-1 步的选主元素,交换两行及消元计算, (A|b) 约化为:

              (2.2)

其中 A(k)  的元素仍记为 aij ,b(k)  的元素仍记为 bi  。

k 步选主元素 ( A(k)  右下角方阵的第一列内选 ) ,即确定 ik  ,使
               
交换 (A(k) |b(k) )  第 k 行与 ik  列的元素,再进行消元计算,最后将原方 程组化为 (k=1,2…,n-1):

                    
回代求解

         
    2.  高斯-若当消去法
高斯消去法始终是消去对角线下方的元素,现考察高斯消去法的一种修正,即消去对角线下方和上方的元素,这种方法称为高斯-若当( Gauss—Jordan )消去法。通过选主元,消元等过程最终化为: 

                 
说明:用高斯-若当方法将 A 约化为单位矩阵,计算解就在常数位置得到,因此用不着回代求解,用高斯-若当方法解方程组其计算量要比高斯消去法大,但用高斯—若当方法求一个矩阵的逆矩阵还是比较合适的。
    定理 4 (高斯-若当法求逆矩阵)设 A 为非奇异矩阵, C=(A|In ) , 如果对 C 应用高斯—若当方法化为 (In|T)
A-1=T 。

    例 4  用高斯-若当方法求  的逆矩阵以及 的解。

解:


 
         
         

c++代码实现如下:

/*
 * test.cpp
 *
 *  Created on: 2014-1-5
 *      Author: zhijian
 */

#include 
#include 

#define MAXN 100
#define ZERO 0.000000001	//定义浮点0
//#define DEBUG

//交换两个变量的值
void swap(double *a,double *b){
	double temp = *a;
	*a = *b;
	*b = temp;
}

//B行的每一个元素加上A行的每一个元素的值*k
void lineOper(double A[],double B[],int n,double k){
	for(int i = 0;ifabs(temp[mmaxi][j]))mmaxi = i;
		if(fabs(temp[mmaxi][j])=0;j--){
		double sum = 0;
		for(int i = j+1;i
求逆的实现:
/*
 * test.cpp
 *
 *  Created on: 2014-1-5
 *      Author: zhijian
 */

#include 
#include 

#define MAXN 100
#define ZERO 0.000000001	//定义浮点0
#define DEBUG

//交换两个变量
void swap(double *a,double *b){
	double temp = *a;
	*a = *b;
	*b = temp;
}

//交换两行变量
void swapLine(double A[],double B[],int n){
	for(int i = 0;ifabs(temp[mmaxi][j]))mmaxi = i;
		if(fabs(temp[mmaxi][j])=0;j--){
		for(int i = 0;i

参考链接:http://sxyd.sdut.edu.cn/zhanshi/shuzhifenxi/shuzhifenxi/2.1/szfx021.htm

http://sxyd.sdut.edu.cn/zhanshi/shuzhifenxi/shuzhifenxi/2.2/szfx022.htm


你可能感兴趣的:(algorithm)