algorithm - 在 FORTRAN 90 中编程 Cholesky 分解时出错

标签 algorithm fortran90 gfortran

我正在为我关于波浪能设备的论文而苦苦挣扎。由于我是 FORTRAN 90 的新手,我想提高我的编程技能。因此,我只是从

http://rosettacode.org/wiki/Cholesky_decomposition

并尝试实现主页中解释的内容。基本上它是关于对 3x3 矩阵 A 的 Cholesky 分解进行编程。我知道已经有一些包可以为 Fortran 进行分解,但我想亲 body 验学习如何编程的努力。

编译没有错误,但是结果不匹配。尽管有元素 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 的解决方案,因此不胜感激。

非常感谢您。

最佳答案

对于 ik 循环,您希望将 sum1sum2 设置为零。

关于algorithm - 在 FORTRAN 90 中编程 Cholesky 分解时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22208876/

相关文章:

c++ - 在 C++ 上使用 Levensthein 算法创建多距离矩阵

python - 从 Fortran/C 调用 Python 函数

c - Fortran 如何返回数组?

fortran - gfortran 不允许具有不同组件长度的字符数组

pointers - 派生类型中的关联指针? gFortran 与英特尔

algorithm - 关于线性分配问题的表述

algorithm - Dijkstra 最短路径算法的一种变体

fortran - 将数组长度传递给函数

python - 查找两个非常大列表之间重叠的最快算法?

fortran - 去除字符串中的空格