1

これは Fortran 90 での私のコードです

program final
   implicit none
   real, dimension(421,422) :: a
   real :: temp,factor
   real, dimension (421) :: soln
   integer :: i, rmax, pivot, row,n, O,P,COL,k,a_j,n2,a_i,t

   open(unit=177241,file="input_21.txt",status="old")
   open(unit=20,file="output.txt",status="unknown")

   do i =1,421
      read (177241,*) (a(i,:))
   end do
   do i = 1,421
      print *,a(i,13)
   end do
   do T=1,421
      n=421
      a_i=n

      n2=422
      a_j=n2

     !pivoting
      do pivot = T,n-1
         print *, 'pivot=',pivot
         rmax = pivot
         do row = pivot,a_i
            if (ABS(a(rmax,pivot)) < ABS(a(row,pivot)) ) then
               rmax=row
            end if
         end do
         if (rmax /= pivot) then
            do k=1, a_j
               temp = a(rmax,k)
               a(rmax,k) = a(pivot,k)
               a(pivot,k) = temp
            end do
         end if      
  !elimination      
         do row = pivot+1, n
            if ( a(pivot,pivot) /= 0 ) then
               factor = (a(row,pivot)) / (a(pivot,pivot))
               print *,'factor=',factor
               do col = 1, n2
                  a(row, col) = a(row,col) - a(pivot,col) * factor
                  print *,'a=',a(row,col)
               end do
            end if
         end do     
      end do
   end do
   !back-substitution
   soln(n2) = 0
   do o=n,1,-1
      do p=n2,o+1,-1
         a(o,n2) = a(o,n2) - soln(p)*a(o,p)
      end do
      soln(o) = a(o,n2) / a(o,o)
   end do        
   do i=1,n
      print *,soln(i)
      write (121,*) soln(i)
   end do
end program final

入力ファイルは 441x442 のマトリックス txt ファイルです。これはその入力ファイルを読み取ることができると思いますが、ここで無限ループになります

if ( a(pivot,pivot) /= 0 ) then
   factor = (a(row,pivot)) / (a(pivot,pivot))
   print *,'factor=',factor    
   do col = 1, n2
      a(row, col) = a(row,col) - a(pivot,col) * factor

どうすればこの問題を解決できますか?

4

1 に答える 1

3

これを適切にインデントすると、次のループ構造が表示されます(数学の部分は無視されます)。

    do T=1,421
       do pivot=T,420
          do row=pivot+1,421
             do col=1,422
                print *,a
             enddo
          enddo
       enddo
    enddo

それはあなたが持っている無限ループではありません、あなたはただ522,326,280回a(row,col)画面に印刷しています(そしてあなたがそれをファイルに置くならば、私はお勧めしません、あなたはあなたのフォルダに11GBのファイルを持っているでしょう!)。に関するステートメントをコメントアウトしますが、のステートメントを残すと、約3分で実行されます。すべてのステートメントを無視すると、わずか数秒で実行されます。printafactorpivotprint

言うまでもなく、画面に10行を超えて配置するべきではありません。

于 2012-12-19T02:36:27.207 に答える