Matlab: schleife

Neue Frage »

kingskid Auf diesen Beitrag antworten »
Matlab: schleife
Hallo!

Kann mir jemand helfen eine schleife in matlab zu programmieren?

ich hab eine Matrix A_1 gegeben und soll nun zuerst die LU-zerlegung berechnen, und damit eine neue Matrix definieren. von dieser neuen matrix wieder die LU-zerlegung bilden, LU umdrehen usw.
dieses verfahren sollte dann gegen eine obere dreiecksmatrix konvergieren mit den eigenwerten von A_1 auf der diagonalen.

sobald die differenz von und kleiner als ist, soll die schleife verlassen werden und die anzahl der benötigten iterationen sowie die letzten berechnete matrix angezigt werden.

hab das mal so angefangen:
A=[2 -1 0; -1 2 -1; 0 -1 2];[L,U]=lu(A);B=U*L; k=0;
while norm(B-A, 'fro')<= 1D-10;[L,U]=lu(A);A=U*L; k=k+1;
end

das problem ist nur, dass die schleife damit nicht funktioniert. wie muss ich das mit dem B eingeben,dass davon immer wieder die LU-zerlegung gebildet wird?

viele grüße
Poff Auf diesen Beitrag antworten »
RE: Matlab: schleife
Hab nicht wirklich Ahnung, aber vielleicht sowas

A=[2 -1 0; -1 2 -1; 0 -1 2];[L,U]=lu(A);B=U*L; k=0;

while norm(B-A, 'fro') >= 1D-10;B=A;[L,U]=lu(A);A=U*L; k=k+1;

end;

B=A, ob das so zulässig ist und macht was erwartet musst prüfen

ob's überhaupt weiterbringt steht nochmal auf nem anderen Blatt.
kevin.flynn Auf diesen Beitrag antworten »
RE: Matlab: schleife
Hi!

Probier's mal hiermit:

%Beginn
A=[2 -1 0; -1 2 -1; 0 -1 2];
[L,U]=lu(A);
B=U*L;
k=0;

while norm(B-A, 'fro')>= 1D-10
A=B;
[L,U]=lu(A);
B=U*L;
k=k+1;
end;
B
k
%Ende

... ist mit Sicherheit nicht schön programmiert... aber es funktioniert! Freude

Grüßle! Wink
kingskid Auf diesen Beitrag antworten »

Hi!

vielen dank für eure tipps, aber es läuft so glaub ich noch nicht.
es kommt zwar eine matrix raus, aber die eigenwerte stehen nicht auf der diagonalen, matlab macht den vorgang nur einmal und nicht so oft bis die bedingung erfüllt ist. kommt ja auch k=0 raus.
warum habt ihr da eigentlich beide >= geschrieben und nicht "kleiner gleich"???

hmm, habt ihr sonst noch ne idee??

viele grüße
kingskid
kevin.flynn Auf diesen Beitrag antworten »

Hi!

Hm... Also bei mir hat's funktioniert...

Wenn du mein Stückchen Quellcode in dein Matlab copy/pastest solltest du zu folgendem Ergebnis kommen:

B =

3.4142 -1.0000 0
-0.0000 2.0000 -1.0000
0 -0.0000 0.5858


k =

45

Deine Matrix A kannst du dann auch mit [eigenvektoren eigwerte]=eig(A) auf ihre Eigenvektoren/werte überprüfen.

Gib vor der Ausführung am besten nochmal ein clear; ein, um alle definierten Variablen zu löschen. Vielleicht hing noch etwas im Speicher rum...

"Gößer gleich" habe ich verwendet, weil man als logische Bedingung der while-Schleife ja will, dass sie so lange ausgeführt wird, bis deine besagte Differenz einen gewissen Wert unterschreiten soll.

Ähem... Und eigentlich sollte für dein Problem k=46 rauskommen, aber den ersten Schleifendurchgang amchen wir ja ausserhalb des while-Algorithmus. Also immer eins dazuzählen!

Grüßle!
kingskid Auf diesen Beitrag antworten »

hi !!

ahh, vielen vielen dank, nehm alles zurück! it works!! *juhu* smile

aber kannst du mir das bitte nochmal erklären, wenn eine differenz einen wert unterschreiten soll, warum nehm ich dann nicht differenz < wert?
achso, d.h. die schleife läuft so lange, bis der wert größer wird...?
da hab ich nicht drangedacht...

und warum muss man A=B vor [L,U]=U*L eingeben?
hab das grad ausprobiert erst nach B=U*L zu machen, aber das funktioniert nicht...

macht man den ersten durchgang immer außerhalb des algos?

many thx4help!

viele grüße Wink
 
 
kevin.flynn Auf diesen Beitrag antworten »

Hi!

Hat’s geklappt? Prima!

Zu deinen Fragen:

- Die Bedingung einer while-Schleife gibt vor, unter welchen Umständen die Schleife ausgeführt werden soll. In deinem Fall soll die LU-Zerlegung so lange wiederholt werden, bis die Matrixdifferenz einen gewissen Wert unterschreitet (quasi: „Wiederhole die Schleife, solange Differenz>=1d-10 ist“).

- A=B gibst du deshalb vorher ein, weil du ja den Wert deiner Matrix k-1 (also dein B aus dem vorigen Schleifendurchgang) zuerst zwischenspeichern musst, bevor du in B eine neu berechnete Matrix speicherst. Ansonsten kannst du ja keine Differenz zwischen A und B berechnen, weil deine alte Matrix k-1 verloren geht. Du könntest der Variablen A an dieser Stelle natürlich auch einen ganz anderen Namen geben, hättest dabei aber eine neue Variable im Quellcode zu berücksichtigen, was bei größeren Progrämmchen schnell unübersichtlich werden kann und auch unnötig Speicher vergeudet.

- Mit Sicherheit kann man auch den ersten Schritt irgendwie in die Schleife verwursteln… Mir ist aber auf Anhieb nicht eingefallen, wie…. Und für unsere Bedürfnisse war’s ja auch so okay. Freude

Zum Schluss habe ich da selbst noch eine (vielleicht etwas indiskrete…) Frage. Ich erwarte auch nicht ernsthaft eine Antwort von dir. Aber bedeutet deine Herkunft „KAMA“ etwa, dass du in Karlsruhe Mathe studierst. Ist vielleicht etwas arg weit hergeholt... wäre aber ein witziger Zufall, weil auch ich dort studiere.

Naja…

Grüßle! Wink
kingskid Auf diesen Beitrag antworten »

Hi!

ah okay, vielen vielen dank für deine erklärungen... so macht das sinn smile
cool!

*lol* du frägst mich was ohne eine antwort zu erwarten?

mhmm, so falsch liegst du gar net KA=Karlsruhe, MA=Mannheim.... Augenzwinkern
hätt dir mal ne pm geschickt, aber du bist nicht angemeldet...
...weil mit dem thread hier hat das ja nichts mehr so direkt zu tun.
oder bist du vielleicht im studiverzeichnis?

viele grüße Wink
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »