Zurück Vor +Ebene Home Inhalt Index Hilfe

Verfahren von Heun

Programm zur numerischen Integration einer Differentialgleichung nach dem Verfahren von Heun.
program Heun(input, output);

        {Integration der Gleichung y'(x)=-y(x) mittels des Verfahren von
        Heun}

    var
        x0, y0: double; {Anfangswerte}
        h:      double; {Schrittweite}
        eps:    double; {Genauigkeit}
        xf:     double; {Endwert}
        s, s1, x1, y1, del, yneu, x, y: double;
        i, imax:                        integer;

    function fxy(x, y: double): double; begin
        fxy := -y
    end; {fxy}

    procedure init; begin
        writeln('Darstellung der Loesung einer expliziten Differentialgleichung');
        writeln('mittels des Verfahren von Heun am Beispiel y`(x)=-y(x)');
        writeln;
        writeln('Geben Sie bitte die Anfangswerte ein');
        readln(x0, y0);
        writeln('Geben Sie nun an, bis zu welchem x-Wert y(x) berechnet werden soll.');
        readln(xf);
        writeln('Und in welcher Schrittweite sollen die x-Werte liegen?');
        readln(h);
        while (xf - x0)*h < 0 do begin
            writeln('Von ', x0:1:3,' aus koennen Sie ', xf:1:3,' in Schritten von ', h:1:3,' nicht erreichen.');
            writeln('Geben Sie noch einmal den Endwert und die Schrittweite ein.');
            readln(xf, h)
        end; {do}
        writeln('Bis zu welcher Genauigkeit soll der Korrektorschritt durchgefuehrt werden?');
        readln(eps);
        while eps <= 0 do begin
           writeln('Nur positive Genauigkeiten machen Sinn. Versuchen Sie es noch einmal.');
           readln(eps)
        end; {do}
        writeln('Wieviele Iterationen sollen im Korrektorschritt maximal ausgefuehrt werden?');
        readln(imax);
        x := x0;
        y := y0;
        writeln('x       y')
    end; {init}

    procedure result; begin
        writeln( x:1:5,' ', y:1:6)
    end; {result}

    begin {Heun}
        init;
        while x < xf do begin
            s   := fxy(x, y);                      {Praediktor}
            x1  := x + h;
            y1  := y + s*h;
            i   := 0;
            del := 2.0*eps;
            while ((del > eps) and (i < imax)) do begin  {Korrektor}
                 i    := i+1;
                 s1   := fxy(x1, y1);
                 yneu := y + h*(s + s1)/2.0;
                 del  := abs((yneu - y)/yneu);
                 y1   := yneu
                 end; {while}
            if (del > eps) then writeln('der Korrektorschritt konvergiert nicht.');
            x := x1;
            y := yneu;
            result
        end; {while}
    end. {Heun}
Zurück Vor +Ebene Home Inhalt Index Hilfe

Copyright Verlag Harri Deutsch AG  Stöcker DeskTop Mathematik