Vorige Seite Kein Verweis Übersicht Kein Verweis content index Hilfeseiten  

Berechnung von Lagrange-Polynomen

Das Programm berechnet den Funktionswert an einer Stelle x0, wenn die Funktion an (n + 1) Stützstellen bekannt ist.
Zur Interpolation wird ein Lagrange-Polynom n-ten Grades durch die (n + 1) Stützstellen verwendet.
module mysubs

contains

  subroutine init(n, x, fx, x0)
    use kinds
    use fileutil
    implicit none
    real(kind=REAL8), dimension(:), pointer :: x, fx
    integer, intent(out)          :: n
    real(kind=REAL8), intent(out) :: x0

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

    write (*,*) 'Berechnet ein Lagrange-Polynom n-ten Grades'
    write (*,*)
    write (*,*) 'In welcher Datei liegen die Stuetzstellen?&
          & (In lagrange.dat liegt ein Beispiel.)'
    read (*,*) fileName

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

    n = anzahlReals2(fileId) - 1
    allocate(x(0:n))
    allocate(fx(0:n))

    read(fileid, *, iostat=status) (x(i), fx(i), i=0, n)
    if (status /= 0) then
       write (*,*) 'Konnte Array nicht lesen.'
       stop
    end if
    close(unit=fileid)

    write (*,*) 'Insgesamt ', n + 1, ' Stuetzstellen gelesen.'
    write (*,*)
    write (*,*) 'An welcher Stelle soll das Polynom berechnet werden? '
    read (*,*) x0

    return
  end subroutine init

  subroutine result(x, y)
    use kinds
    implicit none
    real(kind=REAL8), intent(in) :: x, y

    write (*,'(A, F10.2, A, F10.2, A)') 'Das Lagrange-Polynom an der Stelle ',&
         &   x, ' hat den Wert ', y, '.'

    return
  end subroutine result
  
end module mysubs


program Lagrange
  ! Berechnet ein Lagrange-Polynom n-ten Grades anhand von n + 1 
  ! vorgegebenen Stuetzstellen.

  use kinds
  use mysubs
  implicit none

  real(kind=REAL8), dimension(:), pointer :: x, fx
  real(kind=REAL8)  :: x0       ! an dieser Stelle wird das Polynom berechnet
  real(kind=REAL8)  :: y        ! enthaelt das Ergebnis
  real(kind=REAL8)  :: produkt  ! Zwischenergebnis: der i-te Produktterm
  integer           :: n, i, j

  call init(n, x, fx, x0)
  y = 0                         ! Ergebnis initialisieren
  do i = 0, n 
     produkt = fx(i)
     do j = 0, n
        if (i /= j) then
           produkt = produkt * (x0 - x(j)) / (x(i) - x(j))
        end if
     end do
     y = y + produkt         
  end do
  call result(x0, y)
  stop
end program Lagrange