Fortran 3x3 矩阵求逆:代码示例和解释
以下是使用 Fortran 编写的求一个 3×3 阶矩阵的逆矩阵的示例代码:
program matrix_inverse
implicit none
integer, parameter :: n = 3 ! 矩阵的阶数
real :: a(n, n) ! 输入矩阵
real :: b(n, n) ! 逆矩阵
real :: det ! 矩阵的行列式值
integer :: i, j, info
! 输入矩阵
write(*,*) '请输入一个 3×3 阶矩阵:'
do i = 1, n
do j = 1, n
write(*,*) 'a(', i, ',', j, ') = '
read(*,*) a(i, j)
end do
end do
! 求逆矩阵
call invert_matrix(a, b, det, info)
! 输出逆矩阵
write(*,*) '逆矩阵为:'
do i = 1, n
do j = 1, n
write(*,*) 'b(', i, ',', j, ') = ', b(i, j)
end do
end do
contains
subroutine invert_matrix(a, b, det, info)
implicit none
real, intent(in) :: a(n, n) ! 输入矩阵
real, intent(out) :: b(n, n) ! 逆矩阵
real, intent(out) :: det ! 矩阵的行列式值
integer, intent(out) :: info ! 返回值,表示计算是否成功
real :: work(3*n) ! 临时工作数组
integer :: ipiv(n) ! 存储主元的行交换信息
integer :: i, j
! 求矩阵的逆矩阵和行列式值
call sgetrf(n, n, a, n, ipiv, info) ! LU分解
if (info /= 0) then
write(*,*) '计算失败:LU分解出错'
return
end if
det = 1.0
do i = 1, n
det = det * a(i, i)
end do
call sgetri(n, a, n, ipiv, work, 3*n, info) ! 求逆矩阵
if (info /= 0) then
write(*,*) '计算失败:求逆矩阵出错'
return
end if
! 将结果复制到输出矩阵
do i = 1, n
do j = 1, n
b(i, j) = a(i, j)
end do
end do
return
end subroutine invert_matrix
end program matrix_inverse
该代码使用了 Fortran 的内置线性代数库中的 sgetrf 和 sgetri 子例程来求解矩阵的 LU 分解和逆矩阵。输入矩阵由用户在控制台上输入,然后计算逆矩阵并输出。
原文地址: https://www.cveoy.top/t/topic/o2aZ 著作权归作者所有。请勿转载和采集!