Fortran Coder

标题: 这是我自己编写的LU分解,但是运行时说exe触发了一个断点... [打印本页]

作者: qqqqq    时间: 2018-11-6 13:00
标题: 这是我自己编写的LU分解,但是运行时说exe触发了一个断点...
[Fortran] 纯文本查看 复制代码
program test
   implicit none
   real(kind=8),dimension(3,3) :: A, L, U
   real(kind=8),dimension(3) ::B, ANS, C
   integer :: n
   n=3

   data A/1,2,3,2,5,1,3,2,5/
   B=(/14,18,20/)
   call LU_method(n,A,B,L,U,C,ANS)
   print*,ANS
end program test

subroutine LU_method(n,A,B,L,U,C,ANS)
    implicit none
    integer ::n,i,j,k,r
    real(kind=8) ::m1,m2,sum
    real(kind=8),dimension(n,n) :: A, L, U
    real(kind=8),dimension(n) :: B, ANS, C

     do i=2,n
       L(i,1)=A(i,1)/U(1,1)
     end do

     do j=1,n
       U(1,j)=A(1,j)
     end do

     do r=2,n
     if(A(r,r)==0)then
            print*,'解不出来'
            stop
        else
        if(r < j)then
          U(r,j)=0
            else
             do k=1,r-1
               m1=0
                do j=r,n
                  m1=m1+L(r,k)*U(k,j)   
                  U(r,j)=A(r,j)-m1
                end do
              end do
         end if
        if(r > i)then
          L(i,r)=0
             else
              do k=1,r-1
               m2=0
                do i=r+1,n
                  m2=m2+L(i,k)*U(k,r)
                  L(i,r)=(A(i,r)-m2)/U(r,r)
                end do
              end do
        end if
      end if

   !求解L*C=B
    C(1)=B(1)
      do i=2,n
        sum=0
         do k=1,i-1
            sum=sum+L(i,k)*C(k)
         end do
        C(i)=B(i)-sum
      end do

   !求解U*ANS=C
    ANS(n)=C(n)/U(n,n)
       do i=n-1,1,-1
        sum=0
        do k=n-1,1,-1
            sum=sum+U(i,k)*ANS(k)
        end do
       ANS(i)=(C(i)-sum)/U(i,i)
       end do
     end do  
end subroutine LU_method

作者: fcode    时间: 2018-11-6 13:41
错误太多了,不好一一列举,

建议:
从黑框看错误提示,第一个错误,应该是数组越界。

http://v.fcode.cn/video-debugger.html
看看这个视频教程,学习一下,如何调试。这样可以自己找错误。

其他逻辑错误包括,L和U数组没有赋值就直接使用。
22行 L(i,1)=A(i,1)/U(1,1)

还有34行,已经不在 j 的循环里了,还判断 if(r < j)then  U(r,j)=0
作者: qqqqq    时间: 2018-11-7 21:59
fcode 发表于 2018-11-6 13:41
错误太多了,不好一一列举,

建议:

因为是通过已知A来求L,U,所以没给L,U赋值,视频里好像没有说如何调用gdb调试,只是有一个对话框,但是对话框怎么来的,我在其他地方好像也没有找到
作者: fcode    时间: 2018-11-8 08:31
既然没有给 L U 赋值,就不能直接使用 L U
L(i,1)=A(i,1)/U(1,1)

未赋值(初始化)的变量,不能直接使用。这是基本的逻辑

视频只是告知概念,具体的平台操作系统调试器环境等分类繁多,也不可能一一展现。

gdb 调试是有提到的,你没看仔细。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2