[數值算法與編程]選主元高斯消去法

   在之前的文章[數值算法與編程]高斯消去法 中,本公眾號編寫了高斯消去法求解線性方程組的具體代碼。其具體算法如下:

(1)消元部分


[數值算法與編程]選主元高斯消去法的圖1

(2)回代部分

[數值算法與編程]選主元高斯消去法的圖2


 

   很明顯,對于某些矩陣,使用上述算法可能會出現a(i,i)0的情況,而一旦出現這種情況,該算法實際上就無法繼續(xù)進行求解。

   以以下方程組為例:

[數值算法與編程]選主元高斯消去法的圖3

上述方程組的系數矩陣為:

[數值算法與編程]選主元高斯消去法的圖4

第一次消元后,系數矩陣變?yōu)?/span>

[數值算法與編程]選主元高斯消去法的圖5

   顯然,由于A1(2,2)=0,下一次消元已經無法進行,因此直接采用高斯消去法對該方程組是無法進行求解的。

 

   針對該問題,改進的算法叫選主元高斯消去法。

具體步驟如下:

1.設置增廣矩陣AB=[A,B]

2.對增廣矩陣的第ii=1~N-1)列進行以下處理:

2.1 amax=ABS(AB(i,i))IDmax=i

2.2對第i列的對角線以下的元素進行遍歷,如果有元素的絕對值大于對角線元素的絕對值(amax),則獲得該元素所在行并將其行數賦值給IDMAX,并將AB矩陣中該行(即IDMAX行)與第K行進行元素交換。

對變換后的矩陣按照普通的高斯消去法進行求解。


具體代碼:

 program Console1_xuanzhuyuangaosi

 

    implicit none

    integer,parameter::n=5

    real::a(n,n)

    real::b(n)

    integer::i

    real::x(n)

 

 

 

 

    open(10,file='A.txt')

    read(10,*)(a(i,:),i=1,n)

 

    open(12,file='B.txt')

    read(12,*)(b(i),i=1,n)

 

    write(*,*)(a(i,:),i=1,n)

    write(*,*)(b(i),i=1,n)

    ! Variables

 

    call select_gauss(a,b,x,n)

end program Console1_xuanzhuyuangaosi

 

其中A.txt中的內容:

1     2     3     4     5

2     4     5     3     6

1     1     1     1     1

2     3     6     4     2

3     3     2     4     2

 

  B.txt中的內容:

8

8

8

8

8

  

 

 

 

 

    subroutine select_gauss(A,B,X,N)

    implicit none

    real::A(n,n)

    real::B(n)

    real::X(n)

    real::Ap(n,n+1)

    integer::k,IDmax,i,j

    real::amax

    real::temp1(n+1),temp2(n+1)

    real::colmax

    real::xishu,sum

    integer::n

    Ap(:,1:n)=A(:,:)

    Ap(:,n+1)=B(:)

   

 

  

    write(*,"(7f20.6)")(ap(i,:),i=1,n)

 

    do k=1,n-1

        amax=abs(Ap(k,k))

        IDmax=k

        do i=k+1,n

            if(abs(Ap(i,k))>amax) then

                IDmax=i

                amax=ap(i,k)

            endif

        enddo 

        temp1(:)=Ap(k,:)

        temp2(:)=ap(idmax,:)

        Ap(k,:)=temp2(:)

        Ap(IDmax,:)=temp1(:) 

        do i=k+1,n

            xishu=ap(i,k)/ap(k,k)

            ap(i,:)=ap(i,:)-ap(k,:)*xishu

        end do

    end do

    

     write(*,*)"交換后"

        write(*,"(7f12.4)")(ap(i,:),i=1,n)

 

    x(n)=ap(n,n+1)/ap(n,n)

    

    do i=n-1,1,-1    

        sum=0.0

        do j=i+1,n

            sum=sum+ap(i,j)*x(j)

        end do

        x(i)=(ap(i,n+1)-sum)/(ap(i,i))

    end do

 

    write(*,*)"最終的解是:",(x(i),i=1,n)

end subroutine select_gauss

 

求解結果:

[數值算法與編程]選主元高斯消去法的圖6

【完】




登錄后免費查看全文
立即登錄
App下載
技術鄰APP
工程師必備
  • 項目客服
  • 培訓客服
  • 平臺客服

TOP

10
5
5