Vorige Seite Kein Verweis Übersicht Kein Verweis content index Hilfeseiten  

Nullstellensuche durch Intervallschachtelung

Programm zur Bestimmung der Nullstelle einer Funktion f im Intervall durch Intervallschachtelung.

module mysubs

contains

  function f(x)
    use kinds
    implicit none
    real(kind=REAL8) :: f
    real(kind=REAL8), intent(in) :: x

    f = cos(x) - x
    return
  end function f

  subroutine init(xu, xo, eps)
    use kinds
    implicit none
    
    real(kind=REAL8), intent(out) :: xu, xo, eps
    
    write (*,*) "Exemplarische Darstellung einer Nullstellensuche durch "
    write (*,*) "Intervallschachtelung anhand der Funktion f=cosinus(x)-x"
    write (*,*)
    write (*,*) "Geben Sie bitte die Grenzen des Intervalls an, in dem &
                &gesucht werden soll."
    write (*,*) "(Vorsicht, (cos(xunten)-xunten)*(cos(xoben)-xoben) muss &
                &negativ sein!)"
    
    read (*,*) xu, xo
    do
       if (f(xu)*f(xo) <= 0) exit
       write (*,*) "Zwischen diesen Grenzen liegt keine Nullstelle. &
                   &Versuchen Sie es noch einmal."
       read (*,*) xu, xo
    end do
    
    write (*,*) "Wie genau soll die Nullstelle bestimmt werden?"
    read (*,*) eps
    do
       if (eps > 0) exit
       write (*,*) "Nur positive Genauigkeiten machen Sinn. Versuchen Sie es &
                   &noch einmal."
       read (*,*) eps
    end do
    return
  end subroutine init

  subroutine result(x)
    use kinds
    implicit none
    real(kind=REAL8), intent(in) :: x
    
    write (*,'(A, F10.7)') 'Die Nullstelle liegt bei', x
    return
  end subroutine result

end module mysubs


program Intervallschachtelung
  ! Nullstellensuche der Funktion f=cos(x)-x im Intervall [xu, xo] durch
  ! Intervallschachtelung

  use kinds
  use mysubs
  implicit none

  real(kind=REAL8) :: xu, xo      ! Intervallgrenzen
  real(kind=REAL8) :: eps         ! Genauigkeit
  real(kind=REAL8) :: fehler, xneu

  call init(xu, xo, eps)

  fehler = abs(xo - xu)/2.0
  do 
     if (fehler <= eps) exit
     xneu = (xo + xu)/2.0
     if (f(xneu) == 0.0) then
        call result(xneu)
        stop
     end if
     if (f(xneu)*f(xu) < 0) then
        xo = xneu
     else
        xu = xneu
        fehler = 0.5*fehler
     end if
  end do
  xneu = (xo + xu)/2.0
  call result(xneu)
  stop
end program Intervallschachtelung