DMUG-Archiv 2003

Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

Re: Problemen mit der Invertierung einer 10 mal 10 Matrix

Hallo zusammen,

den beschriebenen Weg von Udo finde ich absolut gangbar, dieser Weg ist sicher schneller, als die Brute Force Inverse von Mma, aber auch hier wird Mma seine Gefahren haben... aus eigener Erfahrung, Mma hat bisher jedes von mir gestellte Gleichungssystem geknackt, aber (!!!) die saloppe Benutzung von Simplify/FullSimplify nach der Solve Anweisung für eine anschließende Vereinfachung ließ Mma ins Nirvana rechnen... erst die Entnahme einzelner Komponenten und anschließender FullSimplify Anweisung hat Mma Stück für Stück zur Lösung laufen lassen... Mein Rat also hier, Gleichungssystem ohne Simplify/FullSimplify lösen lassen, dann Komponentenweise vereinfachen... mal in Zahlen, Abbruch nach 15 Stunden bei Simplify nach Solve OHNE Ergebnis, Berechnung Simplify komponentenweise nach 4 Stunden MIT Ergebnis.

Viel Erfolg

Winfried


On 20.12.2003, at 12:48, Udo und Susanne Krause wrote:

Guten Morgen Ioana,

Sie koennen die beiden unteren Matrizen mit Mma 4.2 und 512 MB Hauptspeicher invertieren. Ihr eigener brute force trial und die Abschaetzungen der Kollegen haben ergeben, dass man nicht den Befehl Inverse[] verwenden sollte. Wie dann? Die Definition der inversen Matrix m . Inverse[m] == IdentityMatrix[Length[m]] ist eine abgekuerzte Schreibweise fuer Length[m] lineare Gleichungssysteme m . v_n = IdentityMatrix[Length[m]][[n]]. Die inverse Matrix ist die Sammlung dieser einzelnen Loesungsvektoren v_1, v_2, ..., v_n, ..., v_Length[m]. Also machen wir doch das etwa fuer quadratische Matrizen:

In[77] := Remove[lucaInverseM];
(* no regularity checks on m done *)
lucaInverseM[m_?MatrixQ] :=
 Module[{resM, rk = Length[m], o, v},
     resM = {};
     For[o = 1, o <= rk, o++,
       v = LinearSolve[m, IdentityMatrix[rk][[o]]];
       resM = Append[resM, v]
       ];
     Transpose[resM]
] /; TensorRank[m] == 2 && Dimensions[m] == Dimensions[Transpose[m]]

Die Probe gibt
In[85] := Inverse[{{x, y,
   z}, {z, x, y}, {y, z, x}}] == lucaInverseM[{{
     x, y, z}, {z, x, y}, {y, z, x}}]
Out[85] = True

Somit ist die Aufgabe von der Berechnung des Inversen auf die Loesung von 7 (heatflux) bzw. 10 (stress) linearen Glgsystemen reduziert. Allerdings muss auch dafuer der Rechner wenigstens die Determinante der zu invertierenden Matrix ausrechnen koennen. Das ist moeglich:

In[20] := LeafCount[Det[stress]]
Out[20] = 815748323
In[21] := LeafCount[Det[heatflux]]
Out[21] = 1816756

Und auch eine der linearen Gleichungen - etwa die dritte - wird geloest: In[82] := LeafCount[LinearSolve[stress, IdentityMatrix[Length[stress]][[3]]]]
Out[82] = 1820265380

Wahrscheinlich bedeutet diese Unmenge von Ausdruecken das Ende des Verstaendnisses. Rechnerisch koennen Sie es im Ernstfall so packen, dass Sie die 7 bzw. 10 linearen Gleichungssystemen einzeln loesen und den jeweiligen Loesungsvektor herausschreiben und dann die Loesungsvektoren einlesen und die inverse Matrix daraus zusammensetzen (vgl. lucaInverseM). Wenn es eine Aufgabe aus der Physik ist, lohnt sich das Suchen nach Symmetrien in den Materialgesetzen, anstatt auf den allgemeinsten, symmetriefreien Fall loszugehen.

Mit den besten Gruessen
Udo.


Verweise:
Frühere   Chronologischer Index   Spätere
Vorherige   Thematischer Index   Nächste

DMUG DMUG-Archiv, http://www.mathematica.ch/archiv.html