高斯―若当消元法

文章转载自:[url]http://www.tyut.edu.cn/kecheng/jisff/dzja/ch3/ch3-3.htm[/url]
    [url]http://blog.excelhome.net/user1/northwolves/archives/2006/710.html[/url]

高斯消元法始终是消去对角线下方的元素,如果在每次消元过程中,首先将主元素化为1, 并消去对角线上方与下方的元素,这种方法称为高斯 若当(Gauss-Jordan)消元法.它不需要回代过程即可求得线性方程组的解.
例1 用高斯 若当消元法求解线性方程组
 
方程组的增广矩阵经高斯 若当消元法,得
 
故原方程的解为
设用高斯 若当消元法已完成 步,于是线性方程组 化为等价方程组 ,其中
满足
 
* 次消元后,得原方程组的解为
与高斯消元法相同,高斯 若当消元法也可进行全主元素消元法及列主元素消元法.��
初看起来,似乎高斯 若当消元法比高斯消元法好,然而只要我们稍作分析就会发现它的运算量比高斯消元法要大.
使用公式(1) (5),对每一个 需要 次除法, 次乘法,及 次减法,故乘除法总运算量是
加减法总运算量是
在第二节中我们曾指出 高斯消元法的运算量 乘除法次数为 , 加减法的次数为 从而 高斯 若当消元法比高斯消元法的运算量乘除法多 加减法多 次。当 值较大时,高斯消元法比高斯 若当消元法节省 次乘除法和加减法,这个运算量是十分可观的.
二 逆矩阵
高斯 若当消元法对求 一个矩阵的逆矩阵,或对求解仅常数项不同的很多方程组及矩阵方程是非常有用的.
�デ缶卣� 的逆矩阵 ,即求 阶矩阵 ,使 ,其中 阶单位矩阵.�Ы�矩阵分块
于是,求解 等价于求解 个方程组
由线性代数理论,我们有下面结论.
定理   为非奇异矩阵,方程组 的增广矩阵为 ,如果对 应用高斯-若当方法化为 ,则
例2      用高斯 若当消元法求
的逆矩阵 .
                
所以
 
为 了节省存储单元,可不必将单位矩阵存放起来.作为第一步结果的式(9)中第1列已无用处,而第4列又相当于逆矩阵所求第1列的中间结果,把它移到第1列不 影响简化过程的实质.而且第5、6两列的常数项可取消,它们对简化也无实质影响,所以,最终按原位记法(9)式的结果可存放为
同理,式(10)中的 阶矩阵将第4列移到第1列,第5列移到第2列,取消第6列,则按原位记法为
 
 
式(11)的原位结果为
即为我们所要求的逆矩阵 ,所以在计算中求逆矩阵的过程可简记为
        
  =
一般地,逆矩阵的计算公式为
式(12) (15)就是求逆矩阵的基本计算公式,对应于每一个 值就是完成了一个消元过程,在消元过程进行中 变量在规定的范围内进行循环.
我们知道,只要矩阵 的行列式 ,则 总 是可逆的,然而,当主元素为零或绝对值太小时,按上述方法计算机可能要溢出,因此,在约化的过程中也应采用选主元素的方法,如果互换矩阵的两行,对方程组 的解来说,这样的对换对结果没有影响;而对求逆矩阵来说,这样的对换改变了所要求的逆矩阵.事实上,是逆矩阵也作了相应两列的互换,所以,计算逆矩阵也可 以

通过列主元素消元法,只要记住行的交换,然后在结果中施行相应的列交换即可.

高斯消元法进行多元一次方程组的求解

 1
1
1
6
2
-1
3
5
4
2
-3
3
 
假设SHEET1中,A1:D3(上面的示例数据) 的数据代表一个 三元一次方程组:
   x1+x2+x3=6
   2x1-x2+3x3=5
   4x1+2x2-3x3=3
 
求x1,x2,x3
 
 
 Function Determinant(ByRef factor) As Single
            Dim i     As Long, j       As Long, k       As Long, row       As Long, order       As Long
            Dim r     As Long, c       As Long, Pivot       As Single, Pivot2       As Single, temp()       As Single
            Determinant = 1
            Dim m
             
            m = factor
            row = UBound(m, 1)
            If Not UBound(m, 2) = row + 1 Then MsgBox "无解或不定解!":                       Exit Function
            ReDim temp(1 To row)
             
            For i = 1 To row
             
                      Pivot = 0
                      For j = i To row
                                For k = i To row
                                          If Abs(m(k, j)) > Pivot Then
                                                    Pivot = Abs(m(k, j))
                                                    r = k:       c = j
                                          End If
                                Next k
                      Next j
                       
                      If Pivot = 0 Then Determinant = 0:                 Exit Function
                       
                      If r <> i Then
                                order = order + 1
                                For j = 1 To row
                                          temp(j) = m(i, j)
                                          m(i, j) = m(r, j)
                                          m(r, j) = temp(j)
                                Next j
                      End If
                       
                      If c <> i Then
                                order = order + 1
                                For j = 1 To row
                                          temp(j) = m(j, i)
                                          m(j, i) = m(j, c)
                                          m(j, c) = temp(j)
                                Next j
                      End If
                       
                      Pivot = m(i, i)
                      Determinant = Determinant * Pivot
                       
                      For j = i + 1 To row
                                Pivot2 = m(j, i)
                                If Pivot2 <> 0 Then
                                          For k = 1 To row
                                                    m(j, k) = m(j, k) - m(i, k) * Pivot2 / Pivot
                                          Next
                                End If
                      Next
                       
            Next
             
            Determinant = Determinant * (-1) ^ order
  End Function
   
  Sub getresult(ByVal r As Range, Optional ByRef answer As String)
  Dim row     As Integer, i       As Integer, D0       As Single
  Dim m
  Dim factor
  Dim result()     As String
  factor = r
  row = UBound(factor, 1)
  ReDim result(1 To row)
  D0 = Determinant(factor)
  If D0 = 0 Then MsgBox "无解!":               Exit Sub
  For i = 1 To row
    m = factor
  For j = 1 To row
  m(j, i) = factor(j, row + 1)
  Next
  result(i) = "X" & i & "=   " & Format(Determinant(m) / D0, "0.00")                         '   Di/D0
  Next
  answer = Join(result, vbCrLf)
  End Sub
   
  Sub solver()
  Dim answer     As String
  getresult [a1:d3], answer
  MsgBox answer, 0, "答案"
  End Sub

你可能感兴趣的:(编程,C语言,休闲,高斯,消元法)