Vorige Seite Kein Verweis Übersicht Kein Verweis content index Hilfeseiten  

QR-Zerlegung mit dem Gram-Schmidt-Verfahren

Programmsequenz zur QR-Zerlegung mit dem modifizierten Gram-Schmidt-Verfahren.
module mysubs

contains

  subroutine init(a, r, n, m)
    use kinds
    implicit none
    real(kind=REAL8), dimension(:,:), pointer :: a, r
    integer, intent(out)                      :: n, m

    integer, parameter  :: fileid = 1
    character(len=256)  :: fileName
    integer             :: status, i

    write (*,*) 'Gram-Schmidtsches Orthogonalisierungsverfahren'
    write (*,*)
    write (*,*) 'Welche Datei enthaelt die Matrix?&
                 & (In grams.dat liegt ein Beispiel.)'
    read (*,*) fileName

    open(unit=fileid, file=fileName, action='read', iostat=status)
    if (status /= 0) then
       write (*,*) 'Konnte Datei ', fileName, 'nicht öffnen.'
       stop
    end if

    read (fileid, *, iostat=status) m, n
    if (status /= 0) then
       write (*,*) 'Konnte Dimension nicht lesen.'
       stop
    end if

    allocate(a(n, m))
    allocate(r(n, m))

    read(fileid, *, iostat=status) (a(i,1:m), i=1,n)
    if (status /= 0) then
       write (*,*) 'Konnte Array nicht lesen.'
       stop
    end if

    close(unit=fileid)
    return
  end subroutine init


  subroutine result(a, r)
    use kinds
    implicit none
    real(kind=REAL8), dimension(:,:), pointer :: a, r

    integer   :: n, m, i
    character(len=80) :: format

    n = size(a, 1)
    m = size(a, 2)
    write (format, '(A,I4,A)')   '(', n, '(F12.3, " "))'

    write (*,*) 'Man erhaelt die Matrizen'
    write (*,*)
    write (*, format) (a(i,1:m), i=1,n)
    write (*,*)
    write (*, format) (r(i,1:m), i=1,n)

    return
  end subroutine result

end module mysubs


program GramS
  ! Gram-Schmidtsches Orthogonalisierungsverfahren}

  use kinds
  use mysubs
  implicit none

  real(kind=REAL8), dimension(:,:), pointer :: a, r
  real(kind=REAL8)  :: sum
  integer           :: n, m
  integer           :: i, j, k

  call init(a, r, n, m)

  do k = 1, m
     sum = 0
     do i = 1, n
        sum = sum + a(i, k)*a(i, k)
     end do
     r(k, k) = sqrt(sum)
     do i = 1, n
        a(i, k) = a(i, k) / r(k, k)
     end do
     do j = k + 1, m
        sum = 0
        do i = 1, n
           sum = sum + a(i, k) * a(i, j)
        end do
        r(k, j) = sum
        do i = 1, n
           a(i, j) = a(i, j) - a(i, k) * r(k, j)
        end do
     end do
  end do
  
  call result(a, r)
  stop
end program GramS