Français
Source/ Codesnippets

Matrixinversion mittels Gauss-Jordan-Algorithmus

 

p.specht

l'Allemand Mathematiker Jordan Avancé den Gauß'schen Eliminationsalgorithmus à Erzeugung de Nullen pas seulement sous, mais aussi au-dessus de qui Hauptdiagonale. Besonders elegant sera procéder, si zusätzlich ...
1. qui Matrizen vorab sur numerische Stabilität et Invertierbarkeit geprüft volonté ("Explosionsschutz"),
2. im le cas de Nullelementen qui aktuelle Spalte vers celui-là avec dem Pivotelement qui la ligne vertauscht wird (Pivot= Angelpunkt, d.i. cela Element avec dem maximalen Absolutbetrag),
3. statt unnötigem "Division par Null"-Fehlerabbruch qui calculateur-Underflow-Grenzwert errechnet et statt qui zéro eingesetzt wird, si im Ergebnis allenfalls "Rechnerunendlich" auftaucht, quoi immerhin encore qui chance sur cela Ablesen einer analytischen Lösungsgleichung ergibt.
4. cela Ganze sogar "in Place", alors sans weiteren Speicherplatz im RAM, avoir lieu pourrait. Diesbezüglich besteht alors encore Verbesserungspotential.
Titre de la fenêtre "Gauss-Jordan Matrix-Inversion"
' source: https://www.cs.berkeley.edu/~wkahan/MathH110/gji.pdf
' Aus IBM BASIC traduit pour XProfan 11.2a, P. Specht 2012-04
' Ausschließlich pour Demo-Zwecke, aucun Gewähr!
' Verwendung velours et sonders sur Risiko des Anwenders!!!
' Enthält Überprüfungen sur exzessives croissance trotz Spaltenpivotierung.
' et une Anpassung zur Vermeidung de Nullen comme Pivotelemente.
Fenêtre 0,0 - %maxx,%maxy-52
Font 2:Randomiser:Cls Tour(8^8)
set("decimals",6):set("numwidth",16)
Var n&=5' Pour Testmatrix nötige Maximale Zeilen- bzw. Spaltenzahl
Déclarer A![N&,N&],X![N&,N&],P![N&]
A![1,1]=1   :A![1,2]=0   :A![1,3]=0    :A![1,4]=0  :A![1,5]=0
A![2,1]=2   :A![2,2]=1   :A![2,3]=0    :A![2,4]=0  :A![2,5]=0
A![3,1]=3   :A![3,2]=2   :A![3,3]=1    :A![3,4]=0  :A![3,5]=0
A![4,1]=0   :A![4,2]=0   :A![4,3]=0    :A![4,4]=1  :A![4,5]=0
A![5,1]=0   :A![5,2]=0   :A![5,3]=0    :A![5,4]=0  :A![5,5]=1
n&=3' cet Zeilen/Spaltenzahl ici soll réellement verwendet volonté
MatrInvs n&
Show n&
WaitInput
Fin

proc Show

    parameters n&
    declare i&,j&
    Imprimer " X = "

    WhileLoop n&:i&=&Boucle

        WhileLoop n&:j&=&Boucle

            imprimer X![i&,j&],

        Endwhile

        imprimer

    Endwhile

    imprimer

endproc

Proc MatrInvs :parameters n&

    Déclarer UFL!,EPS!,G!,P!,Q!,T!,i&,j&,k&,l&,m&
    ' I jusqu'à N sommes Ganzzahlvariablen, qui anderen Doubleprecision Floats!
    ' Vorab wird qui Rundungsfehler sowie Over- et Underflow-Wert festgelegt.
    UFL! = val("5.9E-39")'...= max{underflow,1/overflow}-Grenzwerte.
    G!=4 : G!=G!/3 : G!=G!-1' ... = 1/3 + Rundungswert sur 4/3
    EPS! = ABS( ((G!+G!) - 1) + G! )' ... = Rundungspegel
    G! = 1'Neue Verwendung de G:
    ' G zeichnet eh bien taux de croissance des Pivotelementes sur!
    ' Kopiere Matrix A sur X et speichere cela betragsgrößte Argument qui Spalte.
    ' ACHTUNG: dans toujours-qui-selben Spalte wird gesucht, dans dem qui Zeilenindex fonctionne!!!

    WhileLoop n&:j&=&Boucle

        P![J&]=0

        WhileLoop n&:i&=&Boucle

            T! = A![I&,J&]
            X![I&,J&] = T!
            T! = ABS(T!)
            Cas T! > P![J&] : P![J&] = T!

        Endwhile

    Endwhile

    ' qui P![Zeilenindex] beinhalten jew. den größten Betrag cette Spalte

    WhileLoop n&:k&=&Boucle' ... Elimination dans la ligne k

        Q!=0
        J&=K&'Annahme: Pivotzeile dans Diagonale, daher juste Spalte
        ' cherche ab & unterhalb k. Spalte cela Pivot (Betragsmaximum)

        WhileLoop k&,n&,1:i&=&Boucle

            T!=ABS(X![I&,K&])

            si T!>Q!

                Q!=T!
                J&=I&' J speichert évident qui la ligne avec dem Pivot
                'ACHTUNG FEHLERQUELLE: IBM-Basic si: cela 'then : : ´' bezieht sich sur alle : : !!!

            endif

        Endwhile

        si Q!=0

            Q!=EPS!*P![K&]+UFL!
            X![K&,K&]=Q!

        endif

        si P![K&]>0

            Q!=Q!/P![K&]

            si Q!>G!

                G!=Q!

            endif

        endif

        Cas G!<=(8*K&):Goto "OK"
        PRINT "Wachstumsfaktor g = ";G!;" allez sur Alarmgrenze ";8*K
        PRINT "Versuchen vous, Spalte ";k&;" de A comme Spalte 1 trop mettons!"
        FIN' ... eventuell hilft une autre Umordnung qui Spalten de A.
        OK:
        P![k&]=j&' ... speichere qui gefundene Pivot-la ligne qui Spalte k.
        ' ...cela P![]-Array ist maintenant libre pour, pourquoi alors pas trotz Float verwenden...
        Cas J&=K& : GOTO "Skip"' là vertauschen avec sich selbst sinnlos.

        WhileLoop n&:L&=&Boucle

            Q!=X![J&,L&]
            X![J&,L&]=X![K&,L&]
            X![K&,L&]=Q!

        Endwhile

        Skip:
        Q! = X![K&,K&]
        X![K&,K&] = 1

        WhileLoop n&:j&=&Boucle

            X![K&,J&] = X![K&,J&]/Q!

        Endwhile

        WhileLoop n&:i&=&Boucle

            Cas I&=K&:Continue
            Q!=X![I&,K&]
            X![I&,K&]=0

            WhileLoop n&:j&=&Boucle

                X![I&,J&] = X![I&,J&] - X![K&,J&] * Q!

            Endwhile

        Endwhile

    Endwhile

    WhileLoop n&-1,1,-1:k&=&Boucle

        ' ... Rücktausch qui Spalten de X
        J&=P![K&]
        Cas J&=K&:Continue

        WhileLoop n&:i&=&Boucle

            Q!=X![I&,K&]
            X![I&,K&]=X![I&,J&]
            X![I&,J&]=Q!

        Endwhile

    Endwhile

ENDPROC

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



Zum Quelltext


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

641 Views

Untitledvor 0 min.
N.Art01.08.2021
Ernst21.07.2021
p.specht18.07.2021
Glubbfan19.06.2021
plus...

Themeninformationen

cet Thema hat 1 participant:

p.specht (1x)


Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie