Inverse Matrix[Admin/Mod pls Move!]

Übersicht BlitzBasic Allgemein

Neue Antwort erstellen

 

Marek

Betreff: Inverse Matrix[Admin/Mod pls Move!]

BeitragDi, Feb 19, 2008 18:23
Antworten mit Zitat
Benutzer-Profile anzeigen
Das Problem hat sich gelöst und ich habe einen Code, der eine Matrix beliebiger Größe invertieren kann:

Code: [AUSKLAPPEN]
Dim A#(0,0)
Dim I#(0,0)

Function InverseMatrix(size)
   Local x,y,x2,y2,x3,y3
   Local temp#,var#
   Local st$
   Dim I#(size-1,size-1)
   For x=0 To size-1
      For y=0 To size-1
         If x=y Then
            I#(x,y)=1.0
         Else
            I#(x,y)=0.0
         EndIf
      Next
   Next
   For x=0 To size-1
      y=x
      .back
      If Not A#(x,y)=1.0 Then
         If A#(x,y)=0.0 Then
            If y=size-1 Then
               Return 0
            Else
               y2=y+1
               Repeat
                  If A#(x,y2)=0.0 Then
                     If y2=size-1 Then
                        Return 0
                     EndIf
                     y2=y2+1
                  Else
                     For x2=0 To size-1
                        
                        temp#=A#(x2,y)
                        A#(x2,y)=A#(x2,y2)
                        A#(x2,y2)=temp#
                        temp#=I#(x2,y)
                        I#(x2,y)=I#(x2,y2)
                        I#(x2,y2)=temp#
                        
                     Next
                     Goto back
                  EndIf
               Forever
            EndIf
         Else
            var#=A#(x,y)
            For x2=0 To size-1
               A#(x2,y)=A#(x2,y)/var#
               I#(x2,y)=I#(x2,y)/var#
            Next
         EndIf
      EndIf
      For y2=0 To size-1
         If Not y2=y
            If Not A#(x,y2)=0.0
               var#=A#(x,y2)
               For x2=0 To size-1
                  A#(x2,y2)=A#(x2,y2)-A#(x2,y)*var#
                  I#(x2,y2)=I#(x2,y2)-I#(x2,y)*var#
               Next
            EndIf
         EndIf
      Next
   Next
   Return 1
End Function


A#(x,y) ist die Eingabematrix, I#(x,y) ist die Inverse Matrix von A#!
Als Parameter muss die Höhe(=Breite!) der Matrix angegeben werden... z.B:

man hat die Matrix A=
|1, 0|
|-1, 2|
um sie zu inversieren muss der Code demnach wie folgt aussehen:
Code: [AUSKLAPPEN]
Dim A#(1,1)
A#(0,0)=1.0
A#(1,0)=0.0
A#(0,1)=-1.0
A#(1,1)=2.0
Dim I#(0,0)

Value=InverseMatrix(2)
If Value=0 Then
   Print "Matrix ist nicht inversierbar!"
Else
   Print "Die inverse Matrix I von A ="
   Print "|"+I#(0,0)+", "+I#(1,0)+"|"
   Print "|"+I#(0,1)+", "+I#(1,1)+"|"
EndIf
WaitKey
End


MfG Marek

@Mod/Admin das gehört jetzt wohl eher ins Codearchiv^^ Daher -> Pls move
Wer lesen kann ist klar im Vorteil...
 

Tpro

BeitragMi, Feb 20, 2008 0:30
Antworten mit Zitat
Benutzer-Profile anzeigen
Das einfachsate ist wahrscheinlich wenn du die Berrechnug in eine Vorschleife steckst und dan dein Pivotelement von links oben nach rechts unten durchwandern läst! Dann hast du auch gleich deine Einheitsmatrix und kanst es ohne Probleme ausgeben. Vorhewr musst du aber noch prüfen ob es überhaubt eine Inverse Matrix gibt ansonsten bekommst du da ein "Divison by Zero"
Lass es den Rechner einfach ganz genauso machen wie du den Allgoritmus durchgest. Am besten du schreibst dir vorher in Worten auf was du tust.

z.B.:
-wählen des ersten Pivotelements
->übertragen der Pivot Zeile
-> teilen durch Pivotelement.
usw

wenn du das so machst ist es am Ende leichter einen so komplizierten Algoritmuss auch für den Rechener zu übersetzen!
Der Optimist: "Das Glas ist halb voll"
Der Pessimist: "Das Glas ist halb leer"
Der Ingenieur: "Das Glas ist doppelt so groß wie es sein müsste"
 

Marek

BeitragMi, Feb 20, 2008 0:33
Antworten mit Zitat
Benutzer-Profile anzeigen
Danke für die Antwort, leider etwas spät Laughing
Das ist jetzt übrigens doch der Gauss-Jordan Algorythmus...

MfG Marek
Wer lesen kann ist klar im Vorteil...

Neue Antwort erstellen


Übersicht BlitzBasic Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group