Zurück Vor +Ebene Home Inhalt Index Hilfe

Berechnung der Nullstellen eines reellen Polynoms

Es sollen die Nullstellen von

nach dem Verfahren von Bairstow bestimmt werden.

Gefundene Nullstellen werden abdividiert und das Verfahren fortgesetzt, bis eine lineare oder quadratische Gleichung übrig bleibt.

Gefundene Nullstellen sind durch Rundungs- und Abbruchfehler u.U. stark verfälscht. Deshalb muss jede Nullstelle nachiteriert werden, z.B. mit dem gewöhnlichem Newtonverfahren.

program Bairstow;

        {Berechnung der Nullstellen eines reellen Polynoms}

    const
        MaxArray = 1024; {<=32767}

    var
        n, i, deg, iter, maxit:               integer;
        r, s:                                 double; {x^2-rx-s ist ein Teiler des Polynoms}
        eps, dr, ds, eps1, eps2, x0, x1, det: double;
        abbruch:                              boolean;
        a, b, c:                              array [0..MaxArray] of double;


    procedure init; begin
        writeln('Darstellung der Berechnung der Nullstellen eines reellen');
        writeln('Polynomes mittels des Verfahren von Bairstow');
        writeln;
        writeln('Geben Sie bitte den Grad des Polynoms an');
        readln(n);
        for i:=0 to n do begin
            writeln('Geben Sie nun den Koeffizienten a[',i,'] an');
            readln(a[i]);
        end; {for}
        writeln('Wie genau sollen die Nullstellen berechnet werden?');
        readln(eps);
        while eps <= 0 do begin
            writeln('Nur positive Genauigkeiten machen Sinn. Versuchen Sie es noch einmal.');
            readln(eps);
        end; {while}
        writeln('Wieviele Iterationen sollen maximal durchgefuehrt werden?');
            readln(maxit);
        while maxit <= 0 do begin
            writeln('Nur positive Werte sind hier vernuenftig. Versuchen Sie es noch einmal.');
            readln(maxit);
        end; {while}
        deg := n;
        iter := 0;
    end {init};

    procedure loese; begin
        if sqr(r/2)<-s then begin
            writeln('Das Polynom hat komplexe Wurzeln.');
            halt
        end else begin {if}
            x0 := r/2 - sqrt(sqr(r/2) + s);
            x1 := r/2 + sqrt(sqr(r/2) + s);
            writeln(x0:1:5);
            writeln(x1:1:5)
        end {if}
    end; {loese}

    begin {Bairstow}
        init;
        while (deg > 2) and (iter < maxit) do begin
            iter := 0;
            writeln('Geben Sie geschaetzte Koeffizienten fuer einen quadratischen Teiler des');
            writeln('Polynoms an.');
            readln(r, s);
            repeat
                iter := iter + 1;
                b[deg]   := a[deg];
                b[deg-1] := a[deg-1] + r*b[deg];
                c[deg]   := b[deg];
                c[deg-1] := b[deg-1] + r*c[deg];
                i := deg - 2;
                while i>-1 do begin
                    b[i] := a[i] + r*b[i+1] + s*b[i+2];
                    c[i] := b[i] + r*c[i+1] + s*c[i+2];
                    i := i-1
                end; {while}
                det     := sqr(c[2]) - c[3]*c[1];
                abbruch := (det=0) or (iter>maxit);
                if not abbruch then begin
                    dr   := (-b[1]*c[2] + b[0]*c[3])/det;
                    ds   := (-b[0]*c[2] + b[1]*c[1])/det;
                    eps1 := dr;
                    eps2 := ds;
                    r    := r + dr;
                    s    := s + ds;
                end; {if}
            until (eps1<eps) and (eps2<eps) or abbruch;
            if not abbruch then begin
                loese;
                deg := deg - 2;
                for i:=1 to deg do begin
                    a[i] := b[i+2]
                end; {for}
            end; {if}
        end; {while}
        if (iter < maxit) then begin
            if deg=2 then begin
                r := a[1]/a[2];
                s := a[0]/a[2];
                loese
            end else begin {if}
                writeln(-a[0]/a[1]);
            end; {if}
        end else begin {if}
            writeln('Es werden zu viele Schritte benoetigt.')
        end; {if}
    end. {Bairstow}
Zurück Vor +Ebene Home Inhalt Index Hilfe

Copyright Verlag Harri Deutsch AG  Stöcker DeskTop Mathematik