[数值算法与编程]选主元高斯消去法

   在之前的文章[数值算法与编程]高斯消去法 中,本公众号编写了高斯消去法求解线性方程组的具体代码。其具体算法如下:

(1)消元部分


[数值算法与编程]选主元高斯消去法的图1

(2)回代部分

[数值算法与编程]选主元高斯消去法的图2


 

   很明显,对于某些矩阵,使用上述算法可能会出现a(i,i)0的情况,而一旦出现这种情况,该算法实际上就无法继续进行求解。

   以以下方程组为例:

[数值算法与编程]选主元高斯消去法的图3

上述方程组的系数矩阵为:

[数值算法与编程]选主元高斯消去法的图4

第一次消元后,系数矩阵变为

[数值算法与编程]选主元高斯消去法的图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

【完】




登录后免费查看全文
立即登录
(5条)
默认 最新
👍
评论 点赞
本文来源于公众号:有限元术 欢迎关注。
评论 点赞

查看更多评论 >

点赞 10 评论 5 收藏 5
关注