1. 程式人生 > >高斯消元法原理與Matlab實現

高斯消元法原理與Matlab實現

直接法解線性方程組-高斯消元法

1.高斯消元法思想

設有線性方程組如下所示:

a11x1+a12x2++a1nxn=b1,a21x1+a22x2++a2nxn=b2,an1x1+an2x2++annxn=bn,

或者寫成矩陣形式如下所示

a11a21a1na12a22a2na1na2nannx1x2xn=b1b2bn

將此方程簡記為 Ax=b
高斯消元法解線性方程組的基本思想是用逐次消去未知數的方法把原線性方程組 Ax=b 化為與其等價的三角形線性方程組,而求解三角形線性方程組可用回代的方法求解。

2.列主元高斯消元法的原理

由於直接高斯消元法往往因為主元 a(k)kk 過小,會導致乘數 mik=a(k)ik/a(k)kk 損失較多位有效數字,比如用直接高斯消元法求解下面的線性方程組:

0.0011.0002.0002.0003.7121.0723.0004.6235.643
 x1x2x3=1.0002.0003.000
.
該矩陣的的準確解為: x=(0.4904,0.05104,0.3675)T
若用直接高斯消元法求解該方程組,則得到的解為: x¯=(0.400,0.09980,0.4000)T
可見該結果跟實際值相差還是很大的,所以需要改進演算法,下面引入列主元消去法,若我們在進行高斯消元法時,將主元選取為該列的最大元素,即該矩陣為: 2.0001.0000.0011.0723.7122.0005.6434.6233.000x1x2x3=3.0002.0001.000
用這種選取主元的方法可以求得解為: x¯=(0.4900,0.05113,0.3678)Tx
用這種方法求得的結果比較接近於實際值。

3.列主元消去法演算法

1. det1
2.對於 k=1,2,,n1
(1)按列選主元

|aik,k|=maxkin|aik|

4.MATLAB列主元消去法的實現

因為直接高斯消元法容易因為主元過小,而導致誤差很大,所以在一般求解的時候採用列主元消去法改進高斯消元法,具體實現的程式碼如下所示:

function [ x ] = Gauss_solve( A,b )
    n = size(A,1);
    x = zeros(n,1);
    %尋找當前列的絕對值最大的元素
    for k = 1:n-1
        Max = abs(A(k,k));
        MaxIndex = k;
        for u = k+1:n
            if(abs(A(u,k)) > Max)
                MaxIndex = u;
                Max = abs(A(u,k));
            end
        end

        %交換增廣矩陣相應的行和列
        temp = A(MaxIndex,:);
        A(MaxIndex,:) = A(k,:);
        A(k,:) = temp;

        bt = b(MaxIndex);
        b(MaxIndex) = b(k);
        b(k) = bt;

        %判斷順序餘子式是否為0,若是則方程無法用Gauss求解
        Det = A(1:k,1:k);
        if(Det==0)
            error('This matrix can''t be solved by Gauss algorithm');
        end

        %Gauss消元法的消元計算
        for i = k+1:n
            Mik = A(i,k)/A(k,k);
            b(i) = b(i) - Mik*b(k);
            for j