Ok, jetzt hab ichs hin bekommen... Danke an euch!
Ich poste mal meine Lösung, ihr könnt ja evtl. Fehler und Kritik schreiben!
Also:
1. Determinante berechnen
Ich hab die Determinante(Det.) über den Laplace'schen Entwicklungssatz ermittelt.
|
Quellcode
|
1
2
3
4
5
6
7
8
|
| _11 _12 _13 _14|
| _21 _22 _23 _24|
| _31 _32 _33 _34| -> determinieren
| _41 _42 _43 _44|
|_22 _23 _24| |_21 _23 _24| |_21 _22 _24| |_21 _22 _23|
Det.= _11*|_32 _33 _34| - _12*|_31 _33 _34| + _13*|_31 _32 _34| - _14*|_31 _32 _33|
|_42 _42 _44| |_41 _42 _44| |_41 _42 _44| |_41 _42 _43|
|
Man multipliziert nich einfach mit den vier 3x3 Matrizen, sondern rechnet wiederum ihre Det. aus:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
|_22 _23 _24|
|_32 _33 _34| -> _22*( _33*_44 - _43*_34 ) - _23*( _32*_44 - _42*_34 ) + _24*( _32*_43 - _42*_33 )
|_42 _43 _44|
|_21 _23 _24|
|_31 _33 _34| -> _21*( _33*_44 - _43*_34 ) - _23*( _31*_44 - _41*_34 ) + _24*( _31*_43 - _41*_33 )
|_41 _43 _44|
|_21 _22 _24|
|_31 _32 _34| -> _21*( _32*_44 - _42*_34 ) - _22*( _31*_44 - _41*_34 ) + _24*( _31*_42 - _41*_32 )
|_41 _42 _44|
|_21 _22 _23|
|_31 _32 _33| -> _21*( _32*_43 - _42*_33 ) - _22*( _31*_43 - _41*_33 ) + _23*( _31*_42 - _41*_32 )
|_41 _42 _43|
|
Diese vier "Teil-Det." werden nun oben eingesetzt:
|
Quellcode
|
1
2
3
4
|
Det.= _11*( _22*( _33*_44 - _43*_34 ) - _23*( _32*_44 - _42*_34 ) + _24*( _32*_43 - _42*_33 ) )
- _12*( _21*( _33*_44 - _43*_34 ) - _23*( _31*_44 - _41*_34 ) + _24*( _31*_43 - _41*_33 ) )
+ _13*( _21*( _32*_44 - _42*_34 ) - _22*( _31*_44 - _41*_34 ) + _24*( _31*_42 - _41*_32 ) )
- _14*( _21*( _32*_43 - _42*_33 ) - _22*( _31*_43 - _41*_33 ) + _23*( _31*_42 - _41*_32 ) )
|
2. Adjunkte berechnen
Eine Möglichkeit eine inverse Matrix zu erzeugen ist: die invertierte Det. multipliziert mit der Adjunkte(Adj). Die Adj. ist eine Matrix, die aus der Ausgangsmatrix ermittelt wird. Die einzelnen Elemente der Matrix werden wie folgt berechnet:
Das Element i, j der Adj. ist gleich (-1)^(i+j) * Det.( Mat.^(j, i) )
Diese Det. wird wieder nach dem Laplace'schen Entwicklungssatz berechnet, allerdings werden diesmal nicht die i'te Zeile und j'te Spalte gestrichen, sondern genau umgekehrt:
|
Quellcode
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
( |_22 _23 _24| ) ( |_12 _13 _14| )
Adj.(_11)= Det.( |_32 _33 _34| ) Adj.(_12)=-Det.( |_32 _33 _34| )
( |_42 _43 _44| ) ( |_42 _43 _44| )
( |_12 _13 _14| ) ( |_12 _13 _14| )
Adj.(_13)= Det.( |_22 _23 _24| ) Adj.(_14)=-Det.( |_22 _23 _24| )
( |_42 _43 _44| ) ( |_32 _33 _34| )
( |_21 _23 _24| ) ( |_11 _13 _14| )
Adj.(_21)=-Det.( |_31 _33 _34| ) Adj.(_22)= Det.( |_31 _33 _34| )
( |_41 _43 _44| ) ( |_41 _43 _44| )
( |_11 _13 _14| ) ( |_11 _13 _14| )
Adj.(_23)=-Det.( |_21 _23 _24| ) Adj.(_24)= Det.( |_21 _23 _24| )
( |_41 _43 _44| ) ( |_31 _33 _34| )
( |_21 _22 _24| ) ( |_11 _12 _14| )
Adj.(_31)= Det.( |_31 _32 _34| ) Adj.(_32)=-Det.( |_31 _32 _34| )
( |_41 _42 _44| ) ( |_41 _42 _44| )
( |_11 _12 _14| ) ( |_11 _12 _14| )
Adj.(_33)= Det.( |_21 _22 _24| ) Adj.(_34)=-Det.( |_21 _22 _24| )
( |_41 _42 _44| ) ( |_31 _32 _34| )
( |_21 _22 _23| ) ( |_11 _12 _13| )
Adj.(_41)=-Det.( |_31 _32 _33| ) Adj.(_42)= Det.( |_31 _32 _33| )
( |_41 _42 _43| ) ( |_41 _42 _43| )
( |_11 _12 _13| ) ( |_11 _12 _13| )
Adj.(_43)=-Det.( |_21 _22 _23| ) Adj.(_44)= Det.( |_21 _22 _23| )
( |_41 _42 _43| ) ( |_31 _32 _33| )
|
3. Multiplikation von invertierter Det. und Adj.
Naja die Überschrift sagt eigentlich schon alles! Einfach jedes Element der Adj. mit der invertierten Det. multiplizieren. Ich hab das auch gleich mal in C++ geschrieben:
|
C-/C++-Quelltext
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
|
inline T MatrixDet( void )
{
return _11*( _22*( _33*_44 - _43*_34 ) + _23*( _42*_34 - _32*_44 ) + _24*( _32*_43 - _42*_33 ) ) +
_12*( _21*( _43*_34 - _33*_44 ) + _23*( _31*_44 - _41*_34 ) + _24*( _41*_33 - _31*_43 ) ) +
_13*( _21*( _32*_44 - _42*_34 ) + _22*( _41*_34 - _31*_44 ) + _24*( _31*_42 - _41*_32 ) ) +
_14*( _21*( _42*_33 - _32*_43 ) + _22*( _31*_43 - _41*_33 ) + _23*( _41*_32 - _31*_42 ) );
}
inline Matrix<T> MatrixInvert( void )
{
T tdet = MatrixDet();
if( tdet == 0 )
return MatrixIdentity();//noch nicht fertig
tdet = 1/tdet;
return Matrix<T>( tdet * ( _22*( _33*_44 - _43*_34) + _23*( _42*_34 - _32*_44 ) + _24*( _32*_43 - _42*_33 ) ),
tdet *-( _12*( _33*_44 - _43*_34) + _13*( _42*_34 - _32*_44 ) + _14*( _32*_43 - _42*_33 ) ),
tdet * ( _12*( _23*_44 - _43*_24) + _13*( _42*_24 - _22*_44 ) + _14*( _22*_43 - _42*_23 ) ),
tdet *-( _12*( _23*_34 - _33*_24) + _13*( _32*_24 - _22*_34 ) + _14*( _22*_33 - _32*_23 ) ),
tdet *-( _21*( _33*_44 - _43*_34) + _23*( _41*_34 - _31*_44 ) + _24*( _31*_43 - _41*_33 ) ),
tdet * ( _11*( _33*_44 - _43*_34) + _13*( _41*_34 - _31*_44 ) + _14*( _31*_43 - _41*_33 ) ),
tdet *-( _11*( _23*_44 - _43*_24) + _13*( _41*_24 - _21*_44 ) + _14*( _21*_43 - _41*_23 ) ),
tdet * ( _11*( _23*_34 - _33*_24) + _13*( _31*_24 - _21*_34 ) + _14*( _21*_33 - _31*_23 ) ),
tdet * ( _21*( _32*_44 - _42*_34) + _22*( _41*_34 - _31*_44 ) + _24*( _31*_42 - _41*_32 ) ),
tdet *-( _11*( _32*_44 - _42*_34) + _12*( _41*_34 - _31*_44 ) + _14*( _31*_42 - _41*_32 ) ),
tdet * ( _11*( _22*_44 - _42*_24) + _12*( _41*_24 - _21*_44 ) + _14*( _21*_42 - _41*_22 ) ),
tdet *-( _11*( _22*_34 - _32*_24) + _12*( _31*_24 - _21*_34 ) + _14*( _21*_32 - _31*_22 ) ),
tdet *-( _21*( _32*_43 - _42*_33) + _22*( _41*_33 - _31*_43 ) + _23*( _31*_42 - _41*_32 ) ),
tdet * ( _11*( _32*_43 - _42*_33) + _12*( _41*_33 - _31*_43 ) + _13*( _31*_42 - _41*_32 ) ),
tdet *-( _11*( _22*_43 - _42*_23) + _12*( _41*_23 - _21*_43 ) + _13*( _21*_42 - _41*_22 ) ),
tdet * ( _11*( _22*_33 - _32*_23) + _12*( _31*_23 - _21*_33 ) + _13*( _21*_32 - _31*_22 ) ) );
}
|
Zur Erkärung vieleicht noch: "Matrix" ist eine Template-Klasse und die beiden Funktionen sind in der Klasse definiert.
Diese Funktionen stimmen auch, da ich diese mit z.B.
mat*mat.MatrixInvert();
geprüft habe und als Ergebnis die Einheitsmatrix herausbekommen habe!
So jetzt nur noch eine "Kleinigkeit", David Scherfgen schrieb das nicht jede Matrix invertierbar sei. Wenn ich mir die Rechnung so anschaue, kann ich als einzigtest daraus schließen, dass wenn die Det. gleich null wird, eine Division nicht möglich ist.
Ist dies das Einzigste oder muss man noch mehr beachten?
Und: Danke, ohne das Forum wäre ich nicht so weit gekommen!