Vorige Seite Kein Verweis Übersicht Kein Verweis content index Hilfeseiten  

Ralston Verfahren

Programm zur Integration der Gleichung y'(x)=-y(x) mittels des Runge-Kutta-Verfahren zweiter Ordnung nach Ralston.

module mysubs

contains

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

    fxy = -y
    return
  end function fxy

  subroutine init(x0, y0, xf, h)
    use kinds
    implicit none
    real(kind=REAL8), intent(out) :: x0, y0, xf, h
    
    write (*,*) 'Darstellung der Loesung einer expliziten Differentialgleichung'
    write (*,*) 'mittels des Verfahren von Ralston am Beispiel y`(x)=-y(x)'
    write (*,*)
    write (*,*) 'Geben Sie bitte die Anfangswerte ein'
    read (*,*) x0, y0
    write (*,*) 'Geben Sie nun an, bis zu welchem x-Wert y(x) berechnet &
                &werden soll.'
    read (*,*) xf
    write (*,*) 'Und in welcher Schrittweite sollen die x-Werte liegen?'
    read (*,*) h
    do
       if ( (xf - x0)*h >= 0 ) exit
       write (*, '(A, F6.3, A, F6.3, A, F6.3, A)')  'Von ', x0, &
          &  'aus koennen Sie ', xf,' in Schritten von ', h,' nicht erreichen.'
       write (*,*) 'Geben Sie noch einmal den Endwert und die Schrittweite ein.'
       read (*,*) xf, h
    end do
    write (*,*) 'x       y'
    return
  end subroutine init
  
  subroutine result(x, y)
    use kinds
    implicit none
    real(kind=REAL8), intent(in) :: x, y

    write (*,'(2F10.5)') x, y
    return
  end subroutine result

end module mysubs


program Ralston
  ! Integration der Gleichung y'(x)=-y(x) mittels des Runge-Kutta-
  ! Verfahren 2. Ordnung nach Ralston

  use kinds
  use mysubs
  implicit none

  real(kind=REAL8) :: xf                        ! Endwert
  real(kind=REAL8) :: h                         ! Schrittweite
  real(kind=REAL8) :: x, y, x1, y1, k1, k2

  call init(x, y, xf, h)
  do
     if (x >= xf) exit
     k1 = fxy(x,y)
     x1 = x + h*0.75
     y1 = y + k1*h*0.75
     k2 = fxy(x1,y1)
     y1 = y + k1*h*0.75
     y  = y + (k1/3.0 + 2.0*k2/3.0)*h
     x  = x + h
     call result(x, y)
  end do
  stop
end program Ralston