Italia
Fonte/ Codesnippets

Polynome bis ca. 12. Grades lösen - Das Bairstow-Verfahren

 

p.specht

Im Juli 2011 von VisualBasic nach Profan11.2a übertragen. Demo ohne jede Gewähr!
'Var Koeff$="1,10"
'Var Koeff$="10,0,-1000"
'Var Koeff$="1,-10,0,100,0,10,0,1,0,-1000"
Var Koeff$="10,0,-20.2,1.8,-40,300,-1,0"
WindowTitle "Nullstellen von Polynomen - Bairstow-Verfahren"
' Quelle: https://www.rhirte.de/vb/home2.htm
' Umsetzung des VB-Programms von Prof.em. Dr.Rolf Hirte, Technische Fachhochschule Wildau
' nach XProfan 11.2a; Nur zur Demonstration gedacht; Keine Garantie! Demoware only!
' Begleittext: Die Lösung von Polynomausdrücken (Nullstellensuche) wird unbequem, wenn das
' Polynom etwa vom Grade 5 oder z,B. 25 ist. Bairstow verfährt dabei folgendermaßen:
' Er spaltet in einer Iteration laufend die quadratischen Faktoren ab, die dann in bekannter Weise
' (Satz von Vieta) gelöst werden - das so lange, bis das Restpolynom vom Grade 0 oder 1 ist.
' Der Anwender muß LEDIGLICH die einzelnen Koeffizienten des auf Normalform "Polynom = 0" gebrachten Polynoms
' in fallender Potenz bereitstellen (Text in starker Anlehnung an die genannte Quelle).
'
' WIR HIER packen die Koeffizienten sowie das Absolutglied nach fallendem Exponenten in einen
' Komma-separierten String, z.B. Var Koeff$="10,20,-2.2,1.8,-40,300,1.1111111,0", siehe 1. Zeile.
' Danach gehts los:
Cls
Font 2
AppendMenuBar 253,"Run Bairstow"
AppendMenuBar 252,"Finish"
print
Declare Grad&,A$[],A![],W!
A$[]=Explode(Koeff$,","):Grad&=SizeOf(A$[])-1
SetSize A![],Grad&

WhileLoop 0,Grad&

    A![&Loop]=val(A$[Grad&-&Loop])

EndWhile

WhileLoop Grad&,0,-1

    Set("NumWidth",1) :set("Decimals",0)

    if &Loop<Grad&:print " +";:else:print "  ";:endif

        Print "X^";&Loop,
        Set("NumWidth",26):set("Decimals",15):Print " mal ";A![&Loop]

    EndWhile

    Print:Print " Für Berechnungsstart bitte Taste drücken!"
    WaitInput
    CLS
    Set("NumWidth",1) :set("Decimals",0)
    Print "Das gegebene Polynom vom Grad ";Grad&;" hat folgende Nullstellen:":Print
    Bairstow(A![])
    WaitInput
    End'Main

    Proc Bairstow

        Parameters A![]
        Var Grad& = SizeOf(A![])-1
        Declare i&,R!,P!,P1!,Q!,Q1!,Ce!,s!,t!
        Declare B![Grad&],C![Grad&]
        set("NumWidth",20):set("Decimals",15)

        While Grad& > 2

            R! = 0
            P1! = 1
            Q1! = -1
            B![Grad&] = A![Grad&]
            C![Grad&] = A![Grad&]

            Repeat

                P! = P1!
                Q! = Q1!
                B![Grad&-1] = B![Grad&] * P! + A![Grad& - 1]
                C![Grad&-1] = B![Grad&-1] + B![Grad&] * P!

                Whileloop Grad& - 2 , 0 , -1 : i& = &Loop'For

                    B![i&] = B![i& + 2] * Q! + B![i& + 1] * P! + A![i&]
                    C![i&] = C![i& + 2] * Q! + C![i& + 1] * P! + B![i&]

                EndWhile' Next

                Ce! = C![2] * C![2] - C![1] * C![3]
                case Ce! = 0 : Print " Andere Startwerte nötig!"
                P1! = P! - (B![1] * C![2] - B![0] * C![3]) / Ce!
                Q1! = Q! - (B![0] * C![2] - B![1] * C![1]) / Ce!
                R! = R! + 1

                If R! > 4000

                    Print:Print:Print "   Sorry, nach 4000 Runden keine (weitere) Konvergenz!"
                    WaitInput
                    End

                EndIf

            Until Abs(B![0]) + Abs(B![1]) < 10^-12' Innere loop

            ' Nullstelle des quad. Faktors
            s! = P1! / 2
            t! = P1!*P1! + 4 * Q1!

            If t! < 0

                Print s!;"   + ";0.5 * Sqrt(-t!);"*i "; : comment
                Print s!;"   - ";0.5 * Sqrt(-t!);"*i "; : comment

            Else

                Print s! + 0.5 * Sqrt(t!)
                Print s! - 0.5 * Sqrt(t!)

            EndIf

            whileloop 2,Grad&

                i& = &Loop
                A![i& - 2] = B![i&]

            endwhile

            Grad& = Grad& - 2

        EndWhile' Outer Loop

        If Grad& = 1

            Print -A![0]/A![1]

        Else

            s! = -0.5 * A![1] / A![2]
            t! = A![1] * A![1] - 4 * A![2] * A![0]

            If t! < 0

                Print s!;"   + ";0.5 * Sqrt(-t!) / A![2];"*i "; : comment
                Print s!;"   - ";0.5 * Sqrt(-t!) / A![2];"*i "; : comment

            Else

                Print s! + 0.5 * Sqrt(t!) / A![2]
                Print s! - 0.5 * Sqrt(t!) / A![2]

            EndIf

        EndIf

    EndProc

    Proc comment

        if nearly(s!,0,9)

            print "(Imaginär)"

        else

            print "(Komplex)"

        endif

    endproc

 
Computer: Gerät, daß es in Mikrosekunden erlaubt, 50.000 Fehler zu machen, zB 'daß' statt 'das'...
18.04.2021  
 



Zum Quelltext


Topictitle, max. 100 characters.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Topic-Options

724 Views

Untitledvor 0 min.
N.Art01.08.2021
Ernst21.07.2021
Glubbfan19.06.2021
Uwe ''Pascal'' Niemeier13.06.2021
Di più...

Themeninformationen

Dieses Thema hat 1 subscriber:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Autori  |  Chat  |  Informativa sulla privacy  |  Download  |  Entrance  |  Aiuto  |  Merchantportal  |  Impronta  |  Mart  |  Interfaces  |  SDK  |  Services  |  Giochi  |  Cerca  |  Support

Ein Projekt aller XProfaner, die es gibt!


Il mio XProfan
Private Notizie
Eigenes Ablageforum
Argomenti-Merkliste
Eigene Beiträge
Eigene Argomenti
Zwischenablage
Annullare
 Deutsch English Français Español Italia
Traduzioni

Informativa sulla privacy


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie