LGS lösen mit Matlab < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:21 Sa 20.10.2012 | Autor: | Mija |
Aufgabe | Wir sollen folgende Funktionen in Matlab implementieren:
1. Eine Funktion function[x]=forwardSub(A,b), die die Vorwärtssubstitution darstellt mit A einer linken unteren Dreiecksmatrix.
2. Eine Funktion function[x]=backwardSub(A,b), die die Rückwärtssubstitution darstellt mit A einer rechten oberen Dreiecksmatrix.
3. Eine Funktion function[L,R,p] = LRZerl(A) für die LR-Zerlegung von A mit der Permutationsmatrix p.
4. Eine Funktion function [x] = sol(A,b) zum Lösen des LGS Ax=b nach x (Also das Zusammenbringen der ersten drei Funktionen in eine Funktion) |
Nun habe ich das Problem, dass meine ersten drei Funktionen im Einzelnen alle funktionieren und das ausspucken, was sie sollen.
Jedoch habe ich nun Probleme meine vierte Funktion zu implementieren. Dort bekomme ich als c (durch die Vorwärtssubstitution) etwas falsches raus und das gleiche später mit x (bei der Rückwärtssubstitution) auch nochmal.
Wo ist mein Fehler?
Hier sind mal alle Funktionen:
1.
function[x] = forwardSub(A,b)
% das ist die Vorwaertssubstitution zur Loesung des linearen
% Gleichungssystems Ax=b
% A soll die Gestalt einer linkeren unteren Dreiecksmatrix haben
[m,n]=size(A);
s=length(b);
if m~=n
error('Die Matrix A ist keine quadratische Matrix')
end
if ((s~=m) | (s~=n))
error('Die Dimension der Matrix und die Dimension des Vektors stimmen nicht überein')
end
x=zeros(n,1);
x(1)=b(1)/A(1,1);
for j=2:n % j-te Zeile
summe=0;
for k=1:j-1
summe=summe+A(j,k)*x(k);
end
x(j)=(b(j)-summe)/A(j,j);
end
c=x
L=A;
save forwardSub
end
2.
function[x] = backwardSub(A,b)
% das ist die Rueckwaertssubstitution zur Loesung des linearen
% Gleichungssystems Ax=b
% A soll die Gestalt einer rechten oberen Dreiecksmatrix haben
c=b;
[m,n]=size(A);
s=length(c);
if m~=n
error('Die Matrix A ist keine quadratische Matrix')
end
if ((s~=m) | (s~=n))
error('Die Dimension der Matrix und die Dimension des Vektors stimmen nicht überein')
end
x=zeros(n,1);
x(n)=c(n)/A(n,n);
for j=n-1:-1:1 % j-te Zeile
summe=0;
for k=j+1:n
summe=summe+A(j,k)*x(k);
end
x(j)=(c(j)-summe)/A(j,j);
end
x
R=A;
save backwardSub
end
3.
function [L,R,p] = LRZerl(A)
amax=max(max(abs(A)));
n=size(A,1);
eps=1e-14;
p=[1:n]';
for j=1:n-1
absajj=abs(A(p(j),j));
s=j;
% Elimination
for i=j+1:n % i-te Zeile
if abs(A(p(i),j)>absajj)
s=i;
absajj=abs(A(p(i),j));
end
end
if absajj<eps*amax
fprintf(1,'Warnung: Matrix fast [mm] singulaer!\n');
[/mm]
end
ps=p(s);
p(s)=p(j);
p(j)=ps;
ajj=A(p(j),j);
for i=j+1:n % i-te Zeile
lij=A(p(i),j)/ajj;
for k=j+1:n
A(p(i),k)=A(p(i),k)-lij*A(p(j),k);
end
A(p(i),j)=lij;
end
end
R=triu(A(p,:))
L=eye(n)+tril(A(p,:),-1)
p
save LRZerl
end
4.
function [x] = sol(A,b)
A=input('Eingabe von A: ');
b=input('Eingabe von b: ');
LRZerl(A);
load LRZerl p
b=b(p)
save sol
load sol b
forwardSub(A,b);
load forwardSub L c
save sol
load sol c
b=c;
backwardSub(A,b);
end
Hinweis: Ich habe als Beispiel immer die Matrix
$A = [mm] \pmat{ 2 & 4 & 1 \\ 1 & 2 & 4 \\ 4 & 1 & 2 }$ [/mm] und [mm] $b=\vektor{13 \\ 17 \\ 12}$ [/mm] verwendet.
Dort müssten rauskommen
[mm] $L=\pmat{ 1 & 0 & 0 \\ 0.5 & 1 & 0 \\ 0.25 & 0.5 & 1 }$, $R=\pmat{ 4 & 1 & 2 \\ 0 & 3.5 & 0 \\ 0 & 0 & 3.5}$, $p=\vektor{3 \\ 1 \\ 2}$, $c=\vektor{12 \\ 7 \\ 10.5}$, $x=\vektor{1 \\ 2 \\ 3}$
[/mm]
Ich würde mich sehr freuen, wenn mir jemand weiterhelfen könnte.
|
|
|
|
Hallo Mija,
> Wir sollen folgende Funktionen in Matlab implementieren:
> 1. Eine Funktion function[x]=forwardSub(A,b), die die
> Vorwärtssubstitution darstellt mit A einer linken unteren
> Dreiecksmatrix.
> 2. Eine Funktion function[x]=backwardSub(A,b), die die
> Rückwärtssubstitution darstellt mit A einer rechten
> oberen Dreiecksmatrix.
> 3. Eine Funktion function[L,R,p] = LRZerl(A) für die
> LR-Zerlegung von A mit der Permutationsmatrix p.
> 4. Eine Funktion function [x] = sol(A,b) zum Lösen des
> LGS Ax=b nach x (Also das Zusammenbringen der ersten drei
> Funktionen in eine Funktion)
> Nun habe ich das Problem, dass meine ersten drei
> Funktionen im Einzelnen alle funktionieren und das
> ausspucken, was sie sollen.
>
> Jedoch habe ich nun Probleme meine vierte Funktion zu
> implementieren. Dort bekomme ich als c (durch die
> Vorwärtssubstitution) etwas falsches raus und das gleiche
> später mit x (bei der Rückwärtssubstitution) auch
> nochmal.
>
> Wo ist mein Fehler?
>
> Hier sind mal alle Funktionen:
>
> 1.
> function[x] = forwardSub(A,b)
> % das ist die Vorwaertssubstitution zur Loesung des
> linearen
> % Gleichungssystems Ax=b
> % A soll die Gestalt einer linkeren unteren Dreiecksmatrix
> haben
>
> [m,n]=size(A);
> s=length(b);
>
> if m~=n
> error('Die Matrix A ist keine quadratische Matrix')
> end
>
> if ((s~=m) | (s~=n))
> error('Die Dimension der Matrix und die Dimension des
> Vektors stimmen nicht überein')
> end
>
> x=zeros(n,1);
> x(1)=b(1)/A(1,1);
>
> for j=2:n % j-te Zeile
> summe=0;
> for k=1:j-1
> summe=summe+A(j,k)*x(k);
> end
> x(j)=(b(j)-summe)/A(j,j);
> end
> c=x
>
> L=A;
> save forwardSub
>
> end
>
>
> 2.
> function[x] = backwardSub(A,b)
> % das ist die Rueckwaertssubstitution zur Loesung des
> linearen
> % Gleichungssystems Ax=b
> % A soll die Gestalt einer rechten oberen Dreiecksmatrix
> haben
>
> c=b;
>
> [m,n]=size(A);
> s=length(c);
>
> if m~=n
> error('Die Matrix A ist keine quadratische Matrix')
> end
>
> if ((s~=m) | (s~=n))
> error('Die Dimension der Matrix und die Dimension des
> Vektors stimmen nicht überein')
> end
>
> x=zeros(n,1);
> x(n)=c(n)/A(n,n);
>
> for j=n-1:-1:1 % j-te Zeile
> summe=0;
> for k=j+1:n
> summe=summe+A(j,k)*x(k);
> end
> x(j)=(c(j)-summe)/A(j,j);
> end
> x
>
> R=A;
> save backwardSub
>
> end
>
>
> 3.
> function [L,R,p] = LRZerl(A)
>
> amax=max(max(abs(A)));
> n=size(A,1);
> eps=1e-14;
> p=[1:n]';
> for j=1:n-1
> absajj=abs(A(p(j),j));
> s=j;
> % Elimination
> for i=j+1:n % i-te Zeile
> if abs(A(p(i),j)>absajj)
> s=i;
> absajj=abs(A(p(i),j));
> end
> end
> if absajj<eps*amax
> fprintf(1,'Warnung: Matrix fast [mm]singulaer!\n');[/mm]
> end
> ps=p(s);
> p(s)=p(j);
> p(j)=ps;
> ajj=A(p(j),j);
> for i=j+1:n % i-te Zeile
> lij=A(p(i),j)/ajj;
> for k=j+1:n
> A(p(i),k)=A(p(i),k)-lij*A(p(j),k);
> end
> A(p(i),j)=lij;
> end
> end
> R=triu(A(p,:))
> L=eye(n)+tril(A(p,:),-1)
> p
>
> save LRZerl
>
> end
>
>
> 4.
> function [x] = sol(A,b)
>
> A=input('Eingabe von A: ');
> b=input('Eingabe von b: ');
>
> LRZerl(A);
> load LRZerl p
Nach diesem Befehl ist die Matrix L immer noch die Matrix A.
> b=b(p)
> save sol
> load sol b
> forwardSub(A,b);
> load forwardSub L c
> save sol
> load sol c
> b=c;
> backwardSub(A,b);
>
> end
>
>
> Hinweis: Ich habe als Beispiel immer die Matrix
>
> [mm]A = \pmat{ 2 & 4 & 1 \\ 1 & 2 & 4 \\ 4 & 1 & 2 }[/mm] und
> [mm]b=\vektor{13 \\ 17 \\ 12}[/mm] verwendet.
>
> Dort müssten rauskommen
>
> [mm]L=\pmat{ 1 & 0 & 0 \\ 0.5 & 1 & 0 \\ 0.25 & 0.5 & 1 }[/mm],
> [mm]R=\pmat{ 4 & 1 & 2 \\ 0 & 3.5 & 0 \\ 0 & 0 & 3.5}[/mm],
> [mm]p=\vektor{3 \\ 1 \\ 2}[/mm], [mm]c=\vektor{12 \\ 7 \\ 10.5}[/mm],
> [mm]x=\vektor{1 \\ 2 \\ 3}[/mm]
>
>
> Ich würde mich sehr freuen, wenn mir jemand weiterhelfen
> könnte.
Gruss
MathePower
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 18:00 Sa 20.10.2012 | Autor: | Mija |
Suuuper, vielen Dank für den Hinweis, es funktioniert jetzt alles, jippie!! :)
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 10:11 Mo 22.10.2012 | Autor: | Loddar |
> Gelöscht..
Und warum? Schöne Form von Egoismus!
|
|
|
|