下面是一个使用Fortran编写的程序,可以计算一个矩阵的逆矩阵:

program matrix_inverse
    implicit none
    integer, parameter :: n = 3 ! 矩阵的维度
    real :: matrix(n,n), inverse(n,n)
    integer :: ipiv(n), info
    integer :: i, j

    ! 输入矩阵
    print *, "输入矩阵:"
    do i = 1, n
        read *, matrix(i,:)
    end do

    ! 计算逆矩阵
    call sgetrf(n, n, matrix, n, ipiv, info)
    if (info /= 0) then
        print *, "无法计算逆矩阵"
        stop
    end if
    call sgetri(n, matrix, n, ipiv, inverse, n, info)
    if (info /= 0) then
        print *, "无法计算逆矩阵"
        stop
    end if

    ! 输出逆矩阵
    print *, "逆矩阵:"
    do i = 1, n
        print *, inverse(i,:)
    end do

contains

    ! LU分解
    subroutine sgetrf(m, n, a, lda, ipiv, info)
        implicit none
        integer, intent(in) :: m, n, lda
        real, intent(inout) :: a(lda,*)
        integer, intent(out) :: ipiv(n), info
        integer :: i, j, k, imax
        real :: tmp, maxval

        info = 0
        do j = 1, min(m,n)
            maxval = abs(a(j,j))
            imax = j
            do i = j+1, m
                if (abs(a(i,j)) > maxval) then
                    maxval = abs(a(i,j))
                    imax = i
                end if
            end do
            if (imax /= j) then
                do k = 1, n
                    tmp = a(j,k)
                    a(j,k) = a(imax,k)
                    a(imax,k) = tmp
                end do
            end if
            if (a(j,j) == 0.0) then
                info = j
                return
            end if
            ipiv(j) = j
            do i = j+1, m
                a(i,j) = a(i,j) / a(j,j)
                do k = j+1, n
                    a(i,k) = a(i,k) - a(i,j) * a(j,k)
                end do
            end do
        end do
    end subroutine sgetrf

    ! 计算逆矩阵
    subroutine sgetri(n, a, lda, ipiv, work, lwork, info)
        implicit none
        integer, intent(in) :: n, lda, lwork
        real, intent(inout) :: a(lda,*), work(lwork)
        integer, intent(in) :: ipiv(n)
        integer, intent(out) :: info
        integer :: i, j
        real :: wkopt

        call sgetri(n, a, lda, ipiv, & ! 输入参数
                    work, -1, info) ! 输出工作数组大小
        wkopt = work(1)
        lwork = max(1, int(wkopt))
        allocate(work(lwork))

        call sgetri(n, a, lda, ipiv, & ! 输入参数
                    work, lwork, info) ! 输出逆矩阵和信息

        deallocate(work)
    end subroutine sgetri

end program matrix_inverse

以上代码使用LU分解和高斯消元方法计算矩阵的逆矩阵

使用Fortran求一个矩阵的逆矩阵

原文地址: https://www.cveoy.top/t/topic/hzpK 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录