WindowTitle "3x3-Matrixinversion per Division der Adjungierten durch Determinante"
' (CL) Copyleft 2012-08 by P.Specht@gmx.at
' Genauigkeit bei Verwendung von DoublePrecision: 12 signifikante Stellen. (~ 8*10^-13)
Font 2:Randomize:Cls rnd(8^8):set("decimals",12):set("numwidth",23)
proc Show : parameters M![]
whileloop 0,n&:i&=&Loop:whileLoop 0,n&:j&=&Loop
print M![i&,j&],:endwhile :print:endwhile
endproc
' EINGABETEIL
Var n&=3:dec n&:Declare M![n&,n&], Inv![2,2],Det!,s$,m$[],i&,j&
print "Eingabe: Matrixelemente zeilenweise:\n"
' 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
s$ = " 11.11, 44.44, 99.99, 22.22, 77.77, 66.66, 33.33, 88.88, 0.100000000001"
'Testeingabe: Linear_abhängige_Zeilen:
' 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
' s$ = " 11.11, 44.44, 99.99, 22.22, 77.77, 66.66, 22.22, 77.77, 66.66"
' Allfällige weitere Testeingaben des Anwenders:
' 0,0 0,1 0,2 1,0 1,1 1,2 2,0 2,1 2,2
' s$ = " 0, 44.44, 99.99, 22.22, 77.77, 66.66, 33.33, 88.88, 0"
' Hier wird die zeilenweise Form in die spaltenweise Datenhaltung von XProfan gewandelt:
m$[]=explode(s$,",")
whileloop 0,n&:i&=&Loop:whileloop 0,n&:j&=&Loop
m![j&,i&]=val(m$[3*j&+i&]):endwhile :endwhile :clear m$[]
Show M![]
print "\nDeterminante = ";Det3x3(M![])
print "\nAdjungierte[]:\n"
Show Adjoint3x3(M![]): print
print "\nInvertierte[]: ";
Inv![] = Invt3x3(M![])
if Inv![0,0]<>-1*10^-38
print:print
Show Inv![] : print
print "\nZur Probe: Invertierte rückinvertieren:\n"
Inv![] = Invt3x3(Inv![]) : Show Inv![] : print
else
Print "\nEINE INVERTIERUNG IST BEI DIESEN EINGABEDATEN LEIDER NICHT MÖGLICH! "
endif
WaitInput
End
' ________________________________________
proc Invt3x3
parameters A![]
declare Invt![2,2],Adju![2,2],Det!
Det!=Det3x3(A![])
if Det!<>0
Adju![]=Adjoint3x3(A![])
whileloop 0,2:i&=&Loop:whileloop 0,2:j&=&Loop
invt![i&,j&] = adju![i&,j&] / Det! :endwhile : endwhile
else
sound 2300,300:beep
print " E R R O R: DETERMINANTE = NULL!"
erase invt![]
invt![0,0]=-1*10^-38
endif
return Invt![]
endproc
proc Det3x3 :parameters A![]
return a![0,0]*(a![1,1]*a![2,2]-a![1,2]*a![2,1]) \
- a![0,1]*(a![1,0]*a![2,2]-a![1,2]*a![2,0]) \
+ a![0,2]*(a![1,0]*a![2,1]-a![1,1]*a![2,0])
endproc
proc Adjoint3x3 : parameters A![]
Declare Adju![2,2]' = 3x3-Matrix !
' Beschleunigung durch Variablenfassung der jeweils
' doppelt vorkommenden Produkte wäre noch möglich!
' Zeile 0
adju![0,0]=a![1,1]*a![2,2]-a![1,2]*a![2,1]
adju![0,1]=a![0,2]*a![2,1]-a![0,1]*a![2,2]
adju![0,2]=a![0,1]*a![1,2]-a![0,2]*a![1,1]
' Zeile 1
adju![1,0]=a![1,2]*a![2,0]-a![1,0]*a![2,2]
adju![1,1]=a![0,0]*a![2,2]-a![0,2]*a![2,0]
adju![1,2]=a![0,2]*a![1,0]-a![0,0]*a![1,2]
' Zeile 2
adju![2,0]=a![1,0]*a![2,1]-a![1,1]*a![2,0]
adju![2,1]=a![0,1]*a![2,0]-a![0,0]*a![2,1]
adju![2,2]=a![0,0]*a![1,1]-a![0,1]*a![1,0]
return adju![]
endproc