matlab probleme

Neue Frage »

hxh Auf diesen Beitrag antworten »
matlab probleme
Da ich grade Numerik höre und dazu noch Matlab Übungen machen muss bräuchte ich etwas Hilfe, da mir Matlab doch ziemliche Probleme bereitet.

Also ich habe eine unter und eine obere Dreiecksmatrix und soll von denen über ein gestaffeltes LGS die Lösungen verwenden, da ich das dann auch noch für LR zerlegung brauche. Aber erstaml will ich es hinbekommen vorwärts das LGS zu lösen also mit einer unter Dreiecksmatrix.

Grundlagen kann ich in Matlab schon, aber ich brauch da wohl bissl Routine mit solchen sachen, hier mal mein Ansatz:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
function f = forward(L,b)
%Lu=b soll gelöst werden
[n,n]=size(L);
x(1)=b(1)./L(1,1);
for i=2:n
    x(i)=(b(i)-L(i,1:i-1).*b(1:i-1))./(L(i,i))
end


irgendwas stimmt wohl auch mit der formel nicht für die Rekursion...
Dual Space Auf diesen Beitrag antworten »
RE: matlab probleme
Zitat:
Original von hxh
Also ich habe eine unter und eine obere Dreiecksmatrix und soll von denen über ein gestaffeltes LGS die Lösungen verwenden, da ich das dann auch noch für LR zerlegung brauche.

Poste vielleicht mal den Originalwortlaut der Aufgabe. Aus deinem Aufschrieb wird mir nicht klar was du tun sollst.

Zitat:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
function f = forward(L,b)
%Lu=b soll gelöst werden
[n,n]=size(L);
x(1)=b(1)./L(1,1);
for i=2:n
    x(i)=(b(i)-L(i,1:i-1).*b(1:i-1))./(L(i,i))
end

Was soll dieser Code denn bewerkstelligen?

Kennst du den \-Operator? (Siehe hier ganz unten im Post)
tigerbine Auf diesen Beitrag antworten »
RE: matlab probleme
Mir fehlt in der Formel schon mal eine Summe. verwirrt

Zitat:
Original von tigerbine
Im Fall einer unteren Dreiecksmatrix hat das LGS die Gestalt Lx=b:





Der daraus resultierende Lösungsalgorithmus heißt Vorwärtssubstitution:



FOR i = 2:1:n

END


Auch hier ist die Durchfürhrbarkeit an die Regularität der Matrix L geknüpft. Die Anzahl der Rechenoperarationen ist n². Die Laufzeit beträgt .


Das hätte ich nun so abgetippt.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
function f = forward(L,b)
L
b
%Lu=b soll gelöst werden
[n,n]=size(L);
n;
x(1,1)=b(1)./L(1,1);
for i=2:n
    sum=0
    for j=1:(i-1)
        sum=sum+L(i,j).*x(j,1);
    end
    x(i,1)=(b(i)-sum)./(L(i,i))
end


Dual, ich glaube gerade das \ dürfen sie nicht nehmen, sondern sollen selbst Programme zum Lösen von LGS schreiben.

Testlauf ergab:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
forward([1,0,0;0,1,0;0,0,1],[1;1;1])
L =
     1     0     0
     0     1     0
     0     0     1
b =
     1
     1
     1
n =
     3
sum =
     0
x =
     1
     1
sum =
     0
x =
     1
     1
     1


Ansonsten schließe ich mich Dual an, was soll zum Beispiel gestaffelt bedeuten?

Wink
Dual Space Auf diesen Beitrag antworten »
RE: matlab probleme
Zitat:
Original von tigerbine
Dual, ich glaube gerade das \ dürfen sie nicht nehmen, sondern sollen selbst Programme zum Lösen von LGS schreiben.

Entweder man darf in Matlab coden oder nicht. Ich fände es albern effiziente Routinen zu verbieten. Dann könnte man ebenso sagen, dass die Funktion length auch selber geschrieben werden muss.
hxh Auf diesen Beitrag antworten »

achso ja das gestaffelt wa nen doofer begriff kann man auch weglassen das LGS sollte einfach gelöst werden.

Ja wir sollten das in der Tat selber so schreiben und nicht die routine in Matlab verwenden.
Danke für die Hilfe ich versuch mich mal da reinzudenken in die "Programmierung" hoffe das wird schnell besser.
tigerbine Auf diesen Beitrag antworten »

Mach das. Wie bist du denn auf deinen Code gekommen? Wink
 
 
hxh Auf diesen Beitrag antworten »

dachte man könnte die summe auch gleich so reinpacken, aber irgendwie ging das wohl doch ned so.
Ich hab mal die rückwärtsseite versucht aber mein ergebniss ist am ende nicht ganz richtig , irgendwas ist falsch nur was . Eventuell an den grenzen aber komm ned drauf
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
function b = backward(R,u)
[n,n]=size(R);
%Rx=u Lösung eines GLS mit oberer Dreiecksmatrix
x(n,1)=u(n,1)./R(n,n); 
for i=(n-1):-1:1
    sum=0
    for j=(i+1):-1:1
        sum=sum+R(i,j).*x(j,1);
    end
  x(i,1)=(u(i)-sum)./(R(i,i))
end
tigerbine Auf diesen Beitrag antworten »

Zitat:
dachte man könnte die summe auch gleich so reinpacken, aber irgendwie ging das wohl doch ned so.


imho müssen die in einer Schleife umgesetzt werden. Augenzwinkern

Schaue mir die BS gleich mal an. Wink
hxh Auf diesen Beitrag antworten »

ja dachte ich mir auch irgendwie, dass die in einem machbar sein muss , aber scheint wohl doch komplizierter zu sein, als das was ich da fabriziert habe
tigerbine Auf diesen Beitrag antworten »

Zitat:
Original von tigerbine
Im Fall einer oberen Dreiecksmatrix hat das LGS die Gestalt Rx=b:





Der daraus resultierende Lösungsalgorithmus heißt Rückwärtssubstitution:



FOR i = (n-1):-1:1

END

Auch hier ist die Durchfürhrbarkeit an die Regularität der Matrix R geknüpft. Die Anzahl der Rechenoperarationen ist n². Die Laufzeit beträgt .


code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
function b = backward(R,u)
[n,n]=size(R);

%Rx=u Lösung eines GLS mit oberer Dreiecksmatrix
x(n,1)=u(n,1)./R(n,n); 
for i=(n-1):-1:1
    sum=0;
    for j=(i+1):n
        sum=sum+R(i,j).*x(j,1);
    end
    x(i,1)=(u(i)-sum)./(R(i,i));
end
x
R\u


Imho lief der Index in der Summe falsch. Da hast du runter, statt rauf gezählt.
hxh Auf diesen Beitrag antworten »

oh dachte mir das es daran liegt , hab den denkfehler gefunden. Da muss man echt aufpassen bei so was kann man schnell durcheinander kommen.
Aber mal zu ner anderen Frage , das ganze hätte man doch auch in einer for schleife hinbekommen können ? Wenn ja denk ich mal drüber nach und schreib das mal auf.

Danke für die Hilfe smile
tigerbine Auf diesen Beitrag antworten »

Meinst du damit in einer anstall in zwei? Da würde ich nun nein sagen, da sie Summe imho so übersetzt wird und die steht dann eben noch in einer Schleife, das macht dann zwei.

Aber ich bin weiß Gott kein Programm Genie, sondern "wenn es gut läuft, warum ändern". Big Laugh

Also falls das jemand kompakter kann (1 Schleife), dann ran an den Speck.

Wink
hxh Auf diesen Beitrag antworten »

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
function x = forward(L,b)
%Lu=b soll gelöst werden, wobei L eine untere Dreiecksmatrix ist.
[n,n]=size(L);
x(1,1)=b(1,1)./L(1,1);
for i=2:n
    x(i,1)=(b(i,1)-(L(i,1:i-1)*x(1:i-1,1)))./L(i,i);
end


der code geht doch das problem war man musste ein * statt .* machen , wie bescheuert von mir..
tigerbine Auf diesen Beitrag antworten »

Ah, ok. Summe als Matrizenmultiplikation.
Neue Frage »
Antworten »



Verwandte Themen

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