Fortran 三角矩阵求解
参考:《Fotran95 2003科学计算与工程》
原理
$$
\vec{A}(n,n)\cdot\vec{X}(n)=\vec{B}
$$
上三角形方程迭代求解
$$
\begin{cases}
X_n=\frac{B_n}{A_{nn}} \
\
X_i=\frac{B_i-\sum_{k=i+1}^{n} A_{ik}X_k}{A_{ii}},i=n-1,\cdot\cdot\cdot,1
\end{cases}
$$
下三角形方程迭代求解
$$
\begin{cases}
X_1=\frac{B_1}{A_{11}} \
\
X_i=\frac{B_i-\sum_{k=1}^{n-1} A_{ik}X_k}{A_{ii}},i=2,\cdot\cdot\cdot,n
\end{cases}
$$
Fortran代码实现
module parameter
implicit none
integer, parameter :: dp=8
end module parameter
module matrix_solve
use parameter
contains
!上三角方程
! A(n,n): 左矩阵
! B(n): 右矩阵
! X(n): 待求解矩阵
! N: 输入的矩阵维数
!
subroutine uptri_equation_solve(A,B,X,N)
implicit none
integer,INTENT(IN) :: N
integer :: i ,j
real(kind=dp),INTENT(IN) :: A(N,N),B(N)
real(kind=dp),INTENT(OUT) :: X(N)
X(n)=B(n)/A(n,n)
do i=n-1,1,-1
X(i)=B(i)
do j=i+1,N
X(i)=X(i)-A(i,j)*X(j)
enddo
X(i)=X(i)/A(i,i)
enddo
end subroutine uptri_equation_solve
!下三角矩阵
! A(n,n): 左矩阵
! B(n): 右矩阵
! X(n): 待求解矩阵
! N: 输入的矩阵维数
!
subroutine downtri_equation_solve(A,B,X,N)
implicit none
integer,INTENT(IN) :: N
integer :: i ,j
real(kind=dp),INTENT(IN) :: A(N,N),B(N)
real(kind=dp),INTENT(OUT) :: X(N)
X(1)=B(1)/A(1,1)
do i=2,n
X(i)=B(i)
do j=1,i-1
X(i)=X(i)-A(i,j)*X(j)
enddo
X(i)=X(i)/A(i,i)
enddo
end subroutine downtri_equation_solve
end module