Algorithm FORTRAN 90中Cholesky分解的错误编程

Algorithm FORTRAN 90中Cholesky分解的错误编程,algorithm,fortran90,gfortran,Algorithm,Fortran90,Gfortran,我正在努力写关于波能装置的论文。由于我是FORTRAN 90的新手,我想提高我的编程技能。因此,我只是从中挑选了一个例子 并尝试实现主页上的解释。基本上,它即将对3x3矩阵a的Cholesky分解进行编程。我知道已经有一些软件包为Fortran进行分解,但我想亲身体验一下如何编程 编译中没有错误,但结果不匹配。我基本上找出了所有的元素,除了元素L(3,3)。附件中,您可以找到我在Fortran 90中从头开始创建的代码: Program Cholesky_decomp implicit no

我正在努力写关于波能装置的论文。由于我是FORTRAN 90的新手,我想提高我的编程技能。因此,我只是从中挑选了一个例子

并尝试实现主页上的解释。基本上,它即将对3x3矩阵a的Cholesky分解进行编程。我知道已经有一些软件包为Fortran进行分解,但我想亲身体验一下如何编程

编译中没有错误,但结果不匹配。我基本上找出了所有的元素,除了元素L(3,3)。附件中,您可以找到我在Fortran 90中从头开始创建的代码:

Program Cholesky_decomp

implicit none
!size of the matrix
INTEGER, PARAMETER :: m=3 !rows
INTEGER, PARAMETER :: n=3 !cols
REAL, DIMENSION(m,n) :: A, L

REAL :: sum1, sum2
INTEGER i,j,k

! Assign values to the matrix
A(1,:)=(/ 25,  15,  -5 /)   
A(2,:)=(/ 15,  18,   0 /)  
A(3,:)=(/ -5,   0,  11 /)

! Initialize values
L(1,1)=sqrt(A(1,1))
L(2,1)=A(2,1)/L(1,1)
L(2,2)=sqrt(A(2,2)-L(2,1)*L(2,1))
L(3,1)=A(3,1)/L(1,1)

sum1=0
sum2=0
do i=1,n
    do k=1,i
        do j=1,k-1
        if (i==k) then
            sum1=sum1+(L(k,j)*L(k,j))
            L(k,k)=sqrt(A(k,k)-sum1)    
        elseif (i > k) then
            sum2=sum2+(L(i,j)*L(k,j))
            L(i,k)=(1/L(k,k))*(A(i,k)-sum2)
        else
            L(i,k)=0
        end if
        end do
    end do
end do

!write output
do i=1,m
    print "(3(1X,F6.1))",L(i,:)
end do

End program Cholesky_decomp
你能告诉我代码中的错误是什么吗?当它应该是L(3,3)=3时,我得到L(3,3)=0。我完全迷路了,只是为了记录在案:在Rosetta代码主页上没有fortran的解决方案,所以任何提示都非常感谢


非常感谢。

对于
i
k
循环的每次迭代,您希望将
sum1
sum2
设置为零。

我终于找到了如何解决更高阶、4x4矩阵等问题的方法,如我上面所附的链接所示。以下是最终代码:

Program Cholesky_decomp
!*************************************************!
!LBH @ ULPGC 06/03/2014
!Compute the Cholesky decomposition for a matrix A
!after the attached 
!http://rosettacode.org/wiki/Cholesky_decomposition
!note that the matrix A is complex since there might
!be values, where the sqrt has complex solutions.
!Here, only the real values are taken into account
!*************************************************! 
implicit none

INTEGER, PARAMETER :: m=3 !rows
INTEGER, PARAMETER :: n=3 !cols
COMPLEX, DIMENSION(m,n) :: A 
REAL, DIMENSION(m,n) :: L
REAL :: sum1, sum2
INTEGER i,j,k

! Assign values to the matrix
A(1,:)=(/ 25,  15,  -5 /)   
A(2,:)=(/ 15,  18,   0 /)  
A(3,:)=(/ -5,   0,  11 /)
!!!!!!!!!!!!another example!!!!!!!
!A(1,:) = (/ 18,  22,   54,   42 /) 
!A(2,:) = (/ 22,  70,   86,   62 /) 
!A(3,:) = (/ 54,  86,  174,  134 /) 
!A(4,:) = (/ 42,  62,  134,  106 /)





! Initialize values
L(1,1)=real(sqrt(A(1,1)))
L(2,1)=A(2,1)/L(1,1)
L(2,2)=real(sqrt(A(2,2)-L(2,1)*L(2,1)))
L(3,1)=A(3,1)/L(1,1)
!for greater order than m,n=3 add initial row value
!for instance if m,n=4 then add the following line
!L(4,1)=A(4,1)/L(1,1)





do i=1,n
    do k=1,i
        sum1=0
        sum2=0
        do j=1,k-1
        if (i==k) then
            sum1=sum1+(L(k,j)*L(k,j))
            L(k,k)=real(sqrt(A(k,k)-sum1))  
        elseif (i > k) then
            sum2=sum2+(L(i,j)*L(k,j))
            L(i,k)=(1/L(k,k))*(A(i,k)-sum2)
        else
            L(i,k)=0
        end if
        end do
    end do
end do

!write output
do i=1,m
    print "(3(1X,F6.1))",L(i,:)
end do

End program Cholesky_decomp
期待听到评论、更好的编程方式、更正和任何反馈。谢谢2弗朗西斯卡勒斯这么快回答


关于,lbh

我到底应该在哪里声明sum1和sum2值?在
do k=…
do j=…
之间将它们归零。非常感谢!我希望ResRest是可以的:-)lorenzoOk,关于这个和任何其他3x3位置的定矩阵,它确实有效,但是如果我输入例如中定义的第二个矩阵,它就无效了