LR-Zerlegung < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 19:10 Mo 28.04.2014 | Autor: | David90 |
Aufgabe | Schreibe eine Matlab-Funktion x=vorrueck(L,R,b), welche zu einer gegebenen unteren Dreiecksmatrix L [mm] \in \IR^{nxn} [/mm] und einer oberen Dreiecksmatrix R [mm] \in \IR^{nxn} [/mm] das Gleichungssystem LRx=b durch Vorwärts- und Rückwärtseinsetzen löst. Dabei dürfen nur die 4 Grundrechenarten und keine MATLAB-Kommandos wie A^(-1)*b oder inv(A)*b verwendet werden. Teste das Programm mit [mm] L=\pmat{ 1 & 0&0 \\ 3 & 1&0 \\ 2&2&1 }, R=\pmat{2 & 3&5 \\ 0 & 3&7 \\0&0&-4 }, b=\vektor{11 \\ 34\\32}.
[/mm]
Die Lösung des Gleichungssystems LRx=b ist dann x=[3 5 [mm] -2]^T [/mm] |
Hallo Leute,
also hier ist meine Funktion vorrueck:
function x=vorrueck(L,R,b)
%Vorwärtseinsetzen
y(1)=b(1)/L(1,1);
for j=2:n
summe=0;
for k=1:j-1
summe=summe+L(j,k)*y(k);
end
y(j)=(b(j)-summe)/L(j,j);
end
%Rückwärtseinsetzen
x(n)=y(n)/R(n,n);
for j=n-1:1
summe=0;
for k=j+1:n
summe=summe+R(j,k)*x(k);
end
x(j)=(y(j)-summe)/R(j,j);
end
end
Also der Vektor y in der ersten Schleife ist auf jeden Fall richtig. Wenn ich die Funktion anwende, zeigt er mir am Ende als x-Vektor komischerweise x=[0 0 -2]?!?
Findet jemand den Fehler, weil ich hab mich schon dumm und dämlich gesucht. Danke schon Mal.
Viele Grüße
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:26 Mo 28.04.2014 | Autor: | DieAcht |
Hallo David,
> Schreibe eine Matlab-Funktion x=vorrueck(L,R,b), welche zu
> einer gegebenen unteren Dreiecksmatrix L [mm]\in \IR^{nxn}[/mm] und
> einer oberen Dreiecksmatrix R [mm]\in \IR^{nxn}[/mm] das
> Gleichungssystem LRx=b durch Vorwärts- und
> Rückwärtseinsetzen löst. Dabei dürfen nur die 4
> Grundrechenarten und keine MATLAB-Kommandos wie A^(-1)*b
> oder inv(A)*b verwendet werden. Teste das Programm mit
> [mm]L=\pmat{ 1 & 0&0 \\ 3 & 1&0 \\ 2&2&1 }, R=\pmat{2 & 3&5 \\ 0 & 3&7 \\0&0&-4 }, b=\vektor{11 \\ 34\\32}.[/mm]
>
> Die Lösung des Gleichungssystems LRx=b ist dann x=[3 5
> [mm]-2]^T[/mm]
> Hallo Leute,
>
> also hier ist meine Funktion vorrueck:
>
> function x=vorrueck(L,R,b)
>
> %Vorwärtseinsetzen
> y(1)=b(1)/L(1,1);
>
> for j=2:n
> summe=0;
> for k=1:j-1
> summe=summe+L(j,k)*y(k);
> end
> y(j)=(b(j)-summe)/L(j,j);
> end
>
> %Rückwärtseinsetzen
> x(n)=y(n)/R(n,n);
>
> for j=n-1:1
Hier muss stehen:
for j=n-1:-1:1
Grund: Du willst doch von unten nach oben.
> summe=0;
> for k=j+1:n
> summe=summe+R(j,k)*x(k);
> end
> x(j)=(y(j)-summe)/R(j,j);
> end
>
> end
>
> Also der Vektor y in der ersten Schleife ist auf jeden Fall
> richtig. Wenn ich die Funktion anwende, zeigt er mir am
> Ende als x-Vektor komischerweise x=[0 0 -2]?!?
Grund: Den ersten Schritt hast du manuell durchgeführt.
> Findet jemand den Fehler, weil ich hab mich schon dumm und
> dämlich gesucht. Danke schon Mal.
>
> Viele Grüße
Übrigens könntest du zum Beispiel die Addition in jeder
Schleife umgehen. Wenigstens diesen Punkt würde ich an
deiner Stelle noch verbessern. Sonst sollte es klappen.
Gruß
DieAcht
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:29 Mi 30.04.2014 | Autor: | David90 |
Ok du hast Recht jetzt klappt es, danke:) Was meinst du mit der Addition umgehen?
Viele Grüße
|
|
|
|
|
Es sollte
x(j+1:n)*R(j,j+1:n)
als Skalarprodukt statt der Schleife ausreichen. (vielleicht passt das Format bei mir nicht-> dann muss man nur etwas transponieren)
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 23:16 Mi 30.04.2014 | Autor: | DieAcht |
Auf die Schnelle habe ich folgendes gebastelt:
1: | function b=vr(L,R,b)
| 2: |
| 3: | n=size(L,1);
| 4: |
| 5: | y(1)=b(1)/L(1,1);
| 6: | if n == 1
| 7: | b = b/L;
| 8: | else
| 9: | for k=2:n
| 10: | b(k) = b(k) - L(k,1:k-1)*b(1:k-1);
| 11: | end
| 12: |
| 13: | for k=n:-1:1
| 14: | b(k) = (b(k) - R(k,k+1:n)*b(k+1:n))/R(k,k);
| 15: | end
| 16: | end
| 17: |
| 18: | end
|
Das Stichwort hat wieschoo schon genannt. Damit will ich
dir zeigen, dass man deine "Summe"-Variable umgehen kann.
Wieso ihr unbedingt x zurückgeben müsst verstehe ich leider
auch nicht und habe das geändert.
|
|
|
|