我一直在尝试制作自己的LU分解程序,以便将矩阵A分解为LU=A
。 L和U矩阵中的两个组件似乎已经交换了符号,我似乎无法找到错误。
包含签名问题的组件为L(3,2)
和U(3,3)
。
我知道我遇到问题的组件应该是以下形式
L(3,2)=(A(3,2)-L(31)*U(1,2))/U(2,2)
U(3,3)=A(3,3)-L(3,2)U(2,3)-L(3,1)U(1,3)
据我所知,我的代码正确地执行了此操作。
以下是我的计划,非常感谢任何帮助。
program lu
implicit none
real, allocatable ::B(:,:), L(:,:), U(:,:), A(:,:)
integer :: i,j,k, sz
sz=3
allocate(B(sz,sz),L(sz,sz), U(sz,sz), A(sz,sz))
A(1,1)=1
A(1,2)=2
A(1,3)=4
A(2,1)=3
A(2,2)=8
A(2,3)=14
A(3,1)=2
A(3,2)=6
A(3,3)=3
U(:,:)=0
L(:,:)=0
!input the matrix A
! i is row, j is column
U(1,:)=A(1,:)
do i=1,sz
do j=1,sz
if (i==j) L(i,j)=1
if (j.ge.i) then
U(i,j)=A(i,j)
do k=1,i-1
U(i,j)=U(i,j)-L(i,k)*U(k,j)
enddo
endif
if (i.gt.j) then
L(i,j)=A(i,j)
do k=1,j-1
L(i,j)=L(i,j)-L(i,k)*U(k,i)
enddo
L(i,j)=L(i,j)/U(j,j)
endif
enddo
enddo
B=Matmul(L,U)
do i=1,sz
do j=1,sz
write(*,*) i, j,L(i,j), U(i,j) , A(i,j), B(i,j)
enddo
enddo
end program