Vorige Seite Kein Verweis Übersicht Kein Verweis content index Hilfeseiten  

Nullstellensuche mit der Regula falsi

Programm zur Bestimmung der Nullstelle einer Funktion f im Intervall mit der Regula falsi.
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 mittels "
    write (*,*) "Regula Falsi 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 RegulaFalsi
  ! Nullstellensuche der Funktion f=cos(x)-x im Intervall [xu,xo]
  ! mittels Regula Falsi

  use kinds
  use mysubs
  implicit none

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

  call init(xu, xo, eps)
  fehler = abs(xo - xu)
  xneu = xu
  xdum = xo
  do
     if (fehler <= eps) exit
     xneu = xu - f(xu)*(xu - xo)/(f(xu) - f(xo))
     fehler = abs(xneu - xdum)
     if (f(xneu) == 0.0) then
        call result(xneu)
        stop
     end if
     if (f(xneu)*f(xu) < 0) then
        xo = xneu
     else
        xu = xneu
     end if
     xdum = xneu
  end do

  call result(xneu)
  stop
end program RegulaFalsi