Zurück Vor +Ebene Home Inhalt Index Hilfe

Thomas-Algorithmus

Programm zur Lösung des Gleichungssystems A x = c mit einer Tridiagonalmatrix A. Es müssen nur die Haupt- und die beiden Nebendiagonalen gespeichert werden. Dies sind die Vektoren e, f und g.
program Thomas(input, output);

    {Loesung von Ax = c mit tridiagonaler Matrix}
    
    uses
        stdfile;
    
    const
        MaxArray = 32;
        
    var
        n:             integer;
        a:             array [1..MaxArray, 1..MaxArray] of double;
        c, e, f, g, x: array [1..MaxArray] of double;
        i, j, k:       integer;
                        
    procedure init;
        var
            fName: string;
            f:     text;
            t:     double;
            i:     integer;
        begin {init}
            writeln('Tridiagonaler Thomasalgorithmus');
            writeln;
            writeln('In welcher Datei steht die Matrix mit Loesungsvektor?');
            writeln('(In thomas.dat liegt ein Beispiel.)');
            readln(fName);
            if StdOpen(f, fName) then begin
                if not StdRead(f, t) then begin
                    writeln('Kann Dimension nicht lesen.');
                    halt
                end; {if}
                if t > MaxArray then begin
                    writeln('Dimension zu gross (groesser als ', MaxArray,
                        ').');
                    halt
                end; {if}
                n := round(t);
                for i := 1 to n do begin
                    if not StdReadn(f, n, @a[i, 1]) then begin
                        writeln('Fehler beim Lesen der ', i, '-ten Zeile.');
                        halt
                    end {if}
                end; {for}
                if not StdReadn(f, n, @c[1]) then begin
                    writeln('Kann Loesungsvektor nicht lesen.');
                    halt
                end; {if}
                writeln;
                close(f)
            end else begin {if}
                writeln('Kann Datei "', fName, '" nicht oeffnen.');
                halt
            end {if}
        end; {init}

    procedure result;
        var
            i: integer;
        begin {result}
            writeln('Das Ergebnis lautet');
            writeln;
            for i := 1 to n do begin
                writeln(x[i]:7:3)
            end {for}
        end; {result}

    begin {Thomas}
        init;
        for i := 2 to n do begin
            e[i] := a[i, i - 1]
        end; {for}
        for i := 1 to n do begin
            f[i] := a[i, i]
        end; {for}
        for i := 1 to n - 1 do begin
            g[i] := a[i, i + 1]
        end; {for}
        {Dekomposition}
        for k := 2 to n do begin
            e[k] := e[k] / f[k - 1];
            f[k] := f[k] - e[k] * g[k - 1]
        end; {for}
        {Vorwaertselimination}
        for k := 2 to n do begin
            c[k] := c[k] - e[k] * c[k - 1]
        end; {for}
        {Ruecksubstitution}
        x[n] := c[n] / f[n];
        for k := n - 1 downto 1 do begin
            x[k] := (c[k] - g[k] * x[k + 1]) / f[k]
        end; {for}
        result     
    end. {Thomas}
Zurück Vor +Ebene Home Inhalt Index Hilfe

Copyright Verlag Harri Deutsch AG  Stöcker DeskTop Mathematik