Verfasst am: 07.10.2014, 13:49
Titel: Iteration mit a(i,i+1:n)
Hi,
meiner erster Beitrag, deswegen vorneweg: Ich heisse Michael Petrich, studiere nun im 3.Semester Maschinenbau an einer Fernhochschule und arbeite als Flugzeug"schlosser". Ich hab ganz wenig Erfahrung mit C++ (Studiumsbedingt) und nun seit ganzen 3 Tagen Matlab.
Alles was ich in Matlab "weiss" ist learning-by-doing und jede Menge googeln, ein paar Sachen kann man ja auch von C++ "rueberziehen".
Sorry fuer die Rechtschreibung, meine Tastatur (Laptop) gibt keine Umlaute oder sz her.
Ich hab ein Verstaendnisproblem, bzw. wunder ich mich, was da Matlab macht. Zuerst: der Code funktioniert und macht das, was er soll:
Code:
a = [1-23-15;-11-230;3-11-20;-23-115]; % Matrix des LGS
x=zeros(z,1); %2.Teil rekursive Ergebnisberechnung
for i=z:-1:1
a(i,s),a(i,i+1:z),x(i+1:z), %Zwischenwertausgabe, damit ich "in" das Programm schauen kann
x(i) = (a(i,s)-a(i,i+1:z)*x(i+1:z)) / a(i,i) end
Das "Programm" soll eine Matrix bzw. ein LGS entsprechend in die Dreiecksform bringen und dann rekursiv Loesen, wobei ich den 1.Teil selbst erstellt habe und den 2.Teil (nachdem ich nicht weiter gekommen bin) im Netz gefunden habe und entsprechend auf mein Programm angepasst habe. Jetzt funktioniert das Ganze und ermittelt korrekte Ergebnisse, aber ich versteh noch nicht so wirklich, wie die einzelnen Schleifen im 2.Teil aussehen:
es geht um x(i) = (a(i,s)-a(i,i+1:z)*x(i+1:z)) / a(i,i) :
es ist also theoretisch zu also berechnen:
x(4) = a(4,5)/a(4,4)
x(3) = ( a(3,5) - a(3,4)*x(4))/a(3,3)
x(2) = ( a(2,5) - a(2,3)*x(3) - a(2,4)*x(4) ) / a(2,2)
x(1) = ( a(1,5) - a(1,2)*x(2) - a(1,3)*x(3) - a(1,4)*x(4) ) / a(1,1)
wenn ich die Programmzeile x(i) = (a(i,s)-a(i,i+1:z)*x(i+1:z)) / a(i,i) von Hand auf nem Papier "aufloese", dann komme ich auf zb:
fuer i=4 (erster Durchlauf) > x(4) = ( a(4,5) - a(4,5)*x(5)) / a(4,4) denn in meinem Verstaendis muesste Matlab doch x(i+1:z) mit i=4 und 1 eben zu x(5) aufloesen, bzw eben zu a(4,5) nur existiert x(5) garnicht und fuer das zweite a(4,5) liest er auch nicht den Matrix-Wert 23.3333 ein. Ich komme also zu dem Schluss, dass er (i+1:z) im ersten Durchlauf nicht mit (5) gleichsetzt.
Aber welche Werte liest er dann ein, bzw. woher kommen die Werte, zumal im ersten Durchlauf i=4 fuer a(4,?) und fuer x(?) jeweils eine "leere Menge" eingelesen wird.
Noch "komischer" wirds dann im 2. Durchlauf, denn fuer i=3 muss er ja:
x(3) = ( a(3,5) - ( a(3,4)*x(4) + a(4,?)*x(?) ) / a(3,3) setzen. Da der 2. Summand ja wieder 0 ist, stimmt die Rechnung so auch.
Warum macht er nun bei i=3 aus a(i,i+1:z)*x(i+1:z) --> a(3,4)*x(4)+a(3,?)*x(?)
, bzw. bei i=2 --> a(2,3)*x(3)+a(2,4)*x(4)+a(2,?)*x(?)
Matlab erstellt also immer einen neuen Summanden, was ja auch gewollt ist, aber ich versteh nicht, was Matlab dazu im Detail veranlasst, es muss aber mit der Bezeichnung (i+1:z) zu tun haben. Bitte bringt ein wenig Licht in meine Welt
Durch langes probieren und querlesen hab ich jetzt (zumindest teilweise) verstanden, wie Matlab das macht:
i=1
a(i,i+1:3) ist identisch mit a(1,2:3) und das heisst, er soll die Werte im Feld a(1,2) und a(1,3) als Teilmatrix nehmen und zb ausgeben, in meinem Fall waere das:
a(1,i+1:3)
ans =
-2 3
wenn ich allerdings sowas wie a(1,3:2) abfrage, dann geht das je eigentlich nicht und fuer diesen Fall gibt er dann eine leere Matrix aus, in dem Fall dann eine mit [1,0]-Feldern.
a(2,3:4)*x(3:4) ist dann eine einfache Matrix-Multiplikation, also
Ich bin jetzt nicht sicher, ob du mit "entwickeln" die Lösung des Gauß-Verfahrens oder das Umsetzen in Code meinst. Wenn man das Gaußverfahren (für obigen Teil reicht ja die Rücksubstituion) mal von Hand löst, erkannt man mMn recht deutlich ein geordnetes Schema* nach dem man vorgeht.
Man erkennt jedenfalls, dass sich die Indizes schön linear ändern, so dass man diese mathematisch in eine Summe packen kann und in Matlab durch einen größer werdenden Bereich der Matrix erfassen kann.
die Formel in der Art hatte ich noch nicht gefunden, in meinem Studienheft war/ist das schon aufgedroesselt.
Das Schema hab ich dann waerend des Schreibens bzw. Bearbeiten der Aufgabe "gesehen".
Mit Entwickeln meinte ich dann das Umsetzen in den Code, da tu ich mich teilweise echt schwer. Ich hab vor guten 2 Monaten mit C++ angefangen (gezwungenermassen -> Studiumsbedingt) und hatte davor keinen blassen Dunst.
Bis bei mir so verschachtelte Iterationen laufen muss ich ganz schon rumtueffteln, also der erste Teil meines Gauss-Verfahrens haben mich bestimmt 5-6 Stunden gekostet.
Dazu kommt, dass ich mit MatLab ja bisher nur via "try-and-error" rumbastel und versuche so viel wie moeglich Grundsaetzliches von C++ rueber zu nehmen, was nicht immer klappt, so wie bei den Inidzies der Variablen. Wenn man das dann unter der Praemisse sieht, dass MatLab ja mit Vorliebe mit Matritzen arbeitet, dann wird es schon klarer.
Naja, muehsam ernaehrt sich das Eichhoernchen
Ich denke, da braucht man einfach auch Erfahrung im Umgang mit den Tools und bei der Erstellung von solchen Schleifen, dann sieht man solche Sachen eher. Wobei ich als Anfaenger ja sagen muss, das MatLab zwar etwas "starrer" ist als C++, dafuer auch irgendwie weniger kompliziert und einfacher zu verstehen, zumindest fuer mich.
Ich fuerchte, dass wird nicht das letzte Mal sein, dass ich hier mal was fragen muss.
Vielleicht macht es Sinn, zum Reinkommen in Matlab ein Buch oder Skript zu verwenden?
Ich hatte auch nur Kenntnisse in C++ aufgrund zweier Veranstaltungen zu Beginn meines Studiums und ein bisschen in VBA wg meines Hiwi-Jobs, bevor ich mit Matlab-Programmierung angefangen habe. In Matlab habe ich mich dann mit Hilfe dieses Buches, learning by doing und Nutzung des Forums/Lesen im Netz eingearbeitet.
Gerade durch den Einsatz von Matrizen, die man statt mit Schleifen sehr häufig mittels logischer Matrizen und in Matlab vorhandenen Funktionen bearbeiten kann unterscheidet es sich von Beginn an sehr in der Herangehensweise (soweit ich das als Nicht-Programmierer Beurteilen kann) von C++.
_________________
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.