Fortran Coder

查看: 6609|回复: 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
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

1962

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1353 元
贡献
572 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

沙发
发表于 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 点
板凳
 楼主| 发表于 2018-11-7 21:59:20 | 只看该作者
fcode 发表于 2018-11-6 13:41
错误太多了,不好一一列举,

建议:

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

1962

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1353 元
贡献
572 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

地板
发表于 2018-11-8 08:31:42 | 只看该作者
既然没有给 L U 赋值,就不能直接使用 L U
L(i,1)=A(i,1)/U(1,1)

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

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

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

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-26 05:45

Powered by Tencent X3.4

© 2013-2024 Tencent

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