WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Iteration mit a(i,i+1:n)

 

PEOPLES
Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.10.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 07.10.2014, 13:49     Titel: Iteration mit a(i,i+1:n)
  Antworten mit Zitat      
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 -2 3 -1 5;-1 1 -2 3 0;3 -1 1 -2 0;-2 3 -1 1 5];         % Matrix des LGS
               
[z,s]=size(a);                                                                            % Matrix-Abmessungen ermitteln
         
for k=1:(z-1)                                                                            %k definiert Pivotzeile

 for i=(k+1):z
 m(i)=a(i,k)/a(k,k);                                                                  %Faktor m erstellen
 end

 for u=(k+1):z
  for i=1:s
     a(u,i)=a(u,i) - m(u)*a(k,i)                                                   %Gaussverfahren auf die Zeilen anw.

  end
 end
end                                                                                    %1.Teil erstellt Dreiecksmatrix



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) :

die Matrix in 3Eckform:
Code:

1  -2  3  -1             5
    -1  1   2             5
        -3  11            10
             11.6666    23.3333
 

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 Very Happy

Vielen Dank

Michael
Private Nachricht senden Benutzer-Profile anzeigen


PEOPLES
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.10.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 07.10.2014, 20:12     Titel:
  Antworten mit Zitat      
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
Code:

       4
       2
1  2     =  8

x
  =    1
        3
        4
        2

 


Aber sowas "entwickeln", puhh, ich bekomme da immer Knoten im Kopf Very Happy

Vielen Dank
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.10.2014, 21:59     Titel:
  Antworten mit Zitat      
Hallo Michael,

Willkommen im Forum Wink

Vielleicht hilft es dir, wenn ich dir sage, dass der Teil, den du im Netz gefunden hast
Code:
x=zeros(z,1);                                                                          
for i=z:-1:1
   x(i) = (a(i,s)-a(i,i+1:z)*x(i+1:z)) / a(i,i)
end


einfach nur diese Formel zur Lösung nach Gauß ist (aus https://de.wikipedia.org/wiki/Gauss.....3.BCckw.C3.A4rtseinsetzen ).


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.

x_4 = 1/a_44 * a_45
x_3 = 1/a_33 * [ a_35 - a_34 * x_4 ]
x_2 = 1/2_22 * [ a_25 - (a_24 * x_4 + a_23 * x_3) ]
x_1 = 1/a_11 * [ a_15 - (a_14 * x_4 + a_13 * x_3 + a_12 * x_2)]

* kA wie ich es besser ausdrücken kann.

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.


Grüße,
Seban
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
PEOPLES
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 3
Anmeldedatum: 07.10.14
Wohnort: Deutschland
Version: ---
     Beitrag Verfasst am: 07.10.2014, 22:52     Titel:
  Antworten mit Zitat      
Hi Seban,

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 Very Happy

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.

Vielen Dank auf jeden Fall.
Private Nachricht senden Benutzer-Profile anzeigen
 
Seban
Forum-Meister

Forum-Meister


Beiträge: 600
Anmeldedatum: 19.01.12
Wohnort: ---
Version: ab R2014b
     Beitrag Verfasst am: 07.10.2014, 23:20     Titel:
  Antworten mit Zitat      
Gern geschehen.

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++.
_________________

Richtig fragen
Debugging
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.