Fortran Coder

查看: 39|回复: 3

[通用算法] 这是我自己编写的LU分解,但是运行时说exe触发了一个断点...

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
19 点
发表于 2018-11-6 13:00:22 | 显示全部楼层 |阅读模式
[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
回复

使用道具 举报

1308

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂伙计

F 币
132 元
贡献
204 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2018-11-6 13:41:35 | 显示全部楼层
错误太多了,不好一一列举,

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

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

6

帖子

2

主题

0

精华

入门

F 币
40 元
贡献
19 点
 楼主| 发表于 7 天前 | 显示全部楼层
fcode 发表于 2018-11-6 13:41
错误太多了,不好一一列举,

建议:

因为是通过已知A来求L,U,所以没给L,U赋值,视频里好像没有说如何调用gdb调试,只是有一个对话框,但是对话框怎么来的,我在其他地方好像也没有找到

1308

帖子

12

主题

5

精华

论坛跑堂

Fcode跑堂伙计

F 币
132 元
贡献
204 点

新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 6 天前 | 显示全部楼层
既然没有给 L U 赋值,就不能直接使用 L U
L(i,1)=A(i,1)/U(1,1)

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

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

gdb 调试是有提到的,你没看仔细。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2018-11-14 07:05

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表