Auszug MatLab Programm < Numerik < Hochschule < Mathe < Vorhilfe
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 23:08 Mi 29.10.2014 | Autor: | Thenotebook |
Habe hier einen Auszug aus einem MatLab-Programm und brauche dringend Hilfe!
[mm] \sourceon [/mm] MatLab
%"Eingabe der Matrix A und Vektor b"
[m,n] = size(A); % A ist quadratisch, also m=n
D = zeros(n,n);
for i = 1:n
D(i,i) = A(i,i);
end
x= ones(n,1);
resnorm = norm(A*x-b);
x = x - inv(D)*(A*x-b);
resnorm = norm(A*x-b);
end
[mm] \sourceoff
[/mm]
Meine Frage:
Welches Problem soll hier mit welchem Verfahren gelöst werden?
Und wieso macht das Programm nur einen Schritt, wenn A eine Diagonalmatrix ist?
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 10:02 Do 30.10.2014 | Autor: | Marcel |
Hallo,
> Habe hier einen Auszug aus einem MatLab-Programm und
> brauche dringend Hilfe!
>
> [mm]\sourceon[/mm] MatLab
> %"Eingabe der Matrix A und Vektor b"
> [m,n] = size(A); % A ist quadratisch, also m=n
> D = zeros(n,n);
> for i = 1:n
> D(i,i) = A(i,i);
> end
> x= ones(n,1);
> resnorm = norm(A*x-b);
> x = x - inv(D)*(A*x-b);
> resnorm = norm(A*x-b);
> end
>
> [mm]\sourceoff[/mm]
der Code ist doch nun nicht wirklich schwer zu durchschauen. Schreib' Dir
doch mal in mathematischen Formeln hin, was da gemacht wird. Vieles
steht ja schon quasi im Code drin... Bei manchen Sachen solltest Du vielleicht
eine Hilfsvariable mitführen...
> Meine Frage:
> Welches Problem soll hier mit welchem Verfahren gelöst
> werden?
Das weiß ich jetzt auch nicht - mir stellt sich an dieser Stelle die Frage, woher
Du den Code hast, wenn Du selbst nicht weiß, wofür er gut ist. Aber wenn
Du obiges befolgst und Dir klargemacht hast, was der Code macht (da werden
mit den Diagonalelementen einer Matrix eine $n [mm] \times [/mm] n$-Matrix gebildet,
diese invertiert (was nicht besonders schwer ist), ...), dann guckst Du halt
nach numerischen Verfahren, wo man sowas macht... Dazu hast Du sicher
ein Skript zum Reingucken!
> Und wieso macht das Programm nur einen Schritt, wenn A
> eine Diagonalmatrix ist?
Dazu kann man vielleicht mehr sagen, wenn Du mal nachguckst:
Das letzte
end
hat gar keinen Bezug - da fehlt wohl etwas. (Innerhalb des Programms
gibt es noch ein "for i=1:n, ..., end", das ist okay, aber das allerletze "end"
steht alleine!)
Gruß,
Marcel
|
|
|
|
|
Im letzten Teil fehlte wirklich etwas:
x= ones(n,1);
resnorm = norm(A*x-b);
while resnorm > 10^-6
x = x - inv(D)*(A*x-b);
resnorm = norm(A*x-b);
end
Habe den Ausschnitt aus einer Altklausur...
Ist es einfach nur ein iteratives Verfahren (Jacobi oder Gauss-Seidel) zur Lösung des linearen Gleichungssystems Ax = b?
Ich war wohl gestern Abend zu müde, um das wirklich zu durchschauen.
Bin nicht wirklich fit in MatLab.
Und wieso es nur einen Schritt macht, wenn es eine Diagonalmatrix ist, müsste dann sein, weil es nach nur einem Schritt schon gelöst ist und resnorm=0.
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 14:28 Do 30.10.2014 | Autor: | Marcel |
Hallo,
> Im letzten Teil fehlte wirklich etwas:
>
> x= ones(n,1);
> resnorm = norm(A*x-b);
> while resnorm > 10^-6
> x = x - inv(D)*(A*x-b);
> resnorm = norm(A*x-b);
> end
>
>
> Habe den Ausschnitt aus einer Altklausur...
>
> Ist es einfach nur ein iteratives Verfahren (Jacobi oder
> Gauss-Seidel) zur Lösung des linearen Gleichungssystems Ax
> = b?
> Ich war wohl gestern Abend zu müde, um das wirklich zu
> durchschauen.
> Bin nicht wirklich fit in MatLab.
Du kannst aber auf Matlab zugreifen? Ansonsten installiere Dir Octave,
die Befehle sind oft gleich bis ähnlich. Dann kannst Du entweder durch
eintippen eines Befehls rausfinden, was er macht, oder Du benutzt "help".
Bsp: help ones.
Ich sag' Dir jetzt mal, was da gemacht wird:
> Und wieso es nur einen Schritt macht, wenn es eine
> Diagonalmatrix ist, müsste dann sein, weil es nach nur
> einem Schritt schon gelöst ist und resnorm=0.
> [mm]\sourceon[/mm] MatLab
> %"Eingabe der Matrix A und Vektor b"
Die Matrix A und den Vektor b solltest Du definieren, oder halt das Ganze
als Funktion schreiben
function Loese_irgendwas(A,b);
(Wichtig: Speichere das Programm als Loese_irgendwas.m ab!)
> [m,n] = size(A); % A ist quadratisch, also m=n
m ist die Zeilenzahl, n ist die Spaltenzahl. (Man könnte auch m=size(A,1) und
n=size(A,2) schreiben).
Wenn A quadratisch sein muss, sollte man hier eigentlich eine Fehlermeldung
ausgeben, wenn eine fehlerhafte Eingabe stattfindet. Ebenso kann man
dann testen, ob length(b) zu m passt. (b muss so viele Komponenten haben,
wie A Zeilen hat - beachte: mit x aus [mm] $\IR^{n \times 1}$ [/mm] wird $A*x [mm] \in \IR^{m \times 1}$ [/mm] sein!)
> D = zeros(n,n);
D ist die (quadratische) [mm] $n\times [/mm] n$-Nullmatrix.
> for i = 1:n
> D(i,i) = A(i,i);
> end
D wird nun zu einer Diagonalmatrix gebaut - die Diagonalelemente von
D sind genau die von A.
> x= ones(n,1);
x ist ein $n [mm] \times [/mm] 1$-Spaltenvektor mit lauter 1en:
[mm] $x=\vektor{1\\1\\.\\.\\.\\1} \in \IR^{n \times 1}$
[/mm]
> resnorm = norm(A*x-b);
Hier wird die euklidische Norm von $A*x-b [mm] \in \IR^{n \times 1}$ [/mm] berechnet und das
Ergebnis dann an resnorm zugewiesen!
> while resnorm > 10^-6
Solange [mm] $Ax-b\,$ [/mm] noch "von der Norm her zu groß ist" (Schwellwert [mm] $10^{-6}$ [/mm] - da
wird man durchaus noch ein wenig dran spielen können - beachte, dass es
aber eine Maschinengenauigkeit gibt):
> x = x - inv(D)*(A*x-b);
Berechne [mm] $x-D^{-1}*(Ax-b)$ [/mm] und weise diesen Wert (Vektor) [mm] $x\,$ [/mm] zu.
> resnorm = norm(A*x-b);
resnorm wird entsprechend des neuen x aktualisiert.
> end
> [mm]\sourceoff[/mm]Eingabefehler: "{" und "}" müssen immer paarweise auftreten, es wurde aber ein Teil ohne Entsprechung gefunden (siehe rote Markierung)
Wenn Du jetzt raussuchst, zu welchem Verfahren das passen könnte,
noch ein Hinweis:
Mit
x=ones(n,1)
wird
$A*x$
einen $m \times 1$ (hier ist aber eh m=n) Spaltenvektor bauen, wo in jeder
Komponente die entsprechende Zeilensumme von A steht.
D.h. ist $A=(a_{i,j})_{\substack{i=1,...,m\\j=1,...,n}$, so ist mit obigem x dann
v:=Ax
gegeben durch
$v=\vektor{\sum_{i=1}^n a_{\red{1},i}\\\sum_{i=1}^n a_{\red{2},i}\\.\\.\\.\\\sum_{i=1}^n a_{\red{m},i}}$
Bsp.:
$A=\pmat{1, & 2, & 3 \\ 4, & 5, & 6}*\vektor{1\\1\\1}=\pmat{1+2+3\\4+5+6}=\vektor{6\\15}$
Und das rausfinden, welches Verfahren das ist/sein könnte, überlasse ich
weiterhin Dir. Denn irgendwas sollst Du auch tun. ^^
Gruß,
Marcel
|
|
|
|
|
Was das "Programm tut" war mir klar. Auch ohne Eingabe in MatLab.
Es müsste das Jacobi-Verfahren sein.
Aber ich hatte dafür schon mal einen Code geschrieben und der sah eben ganz anders aus als dieser und war FÜR MICH um einiges übersichtlicher. Das liegt wohl im Auge des Betrachters.
Aber vor meiner Klausur werde ich mir nochmal die iterativen Verfahren anschauen müssen...
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:22 Do 30.10.2014 | Autor: | Marcel |
Hallo,
> Was das "Programm tut" war mir klar. Auch ohne Eingabe in
> MatLab.
was denn nun? Vorhin hattest Du mir noch gesagt:
> Bin nicht wirklich fit in MatLab.
Das war Deine Reaktion auf meinen Hinweis, dass das Programm nicht
wirklich schwer zu durchschauen ist... Also:
> Es müsste das Jacobi-Verfahren sein.
http://de.wikipedia.org/wiki/Jacobi-Verfahren#Beschreibung_in_Matrixschreibweise
Und ja, ich denke das auch:
http://www.ma.tum.de/foswiki/pub/Ferienkurse/WiSe1011/MatLab/handouts4.pdf
> Aber ich hatte dafür schon mal einen Code geschrieben und
> der sah eben ganz anders aus als dieser und war FÜR MICH
> um einiges übersichtlicher. Das liegt wohl im Auge des
> Betrachters.
Wenn Du einen eigenen Code hast, den Du besser verstehst, und sofern
beide Codes *stets* i.W. das gleiche Ergebnis liefern, ist es für Dich immer
am Sinnvollsten, Deinen zu verstehen.
Ausnahme: Wenn der andere Code wesentlich schneller läuft.
> Aber vor meiner Klausur werde ich mir nochmal die
> iterativen Verfahren anschauen müssen...
Wann schreibst Du die Klausur?
Und ja: Das Wichtigste ist, zu verstehen, wieso etwas funktioniert, denn
wenn man das verstanden hat, dann ist das Umsetzen nur noch eine
*Zeit-Sache*!
P.S. Ich bin mir allerdings nicht 100% sicher, ob da das Jacobi-Verfahren
richtig programmiert ist. Das muss ich mir nochmal in Ruhe angucken,
wenn ich die Zeit und Lust dafür finde. Oder es ist doch was anderes...
P.P.S. Ich habe mal gerade nochmal nachgeguckt, das Ganze sollte zum
Jacobi-Verfahren passen.
Gruß,
Marcel
|
|
|
|