Cholesky-Zerlegung < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Ich habe hier einen Code geschrieben (Entwurf) zur Berechnung der Choleskyzerlegung einer Matrix A, der aber natürlich nicht funktioniert^^ Ist auch erst mein drittes Programm, das ich mit matlab schreiben muss und meine kenntnisse und erfahren mit matlab beschränken sich auf ein minimum*g*
Probleme:
1. Das Edit-Programm zeigt mir rote Fehler an, obwohl ich nicht weiß, was falsch ist
2. Ich weiß nicht, ob ich das mit dem zuweisen der [mm] c_k_l [/mm] so machen kann
3. Ich habe null Ahnung, wie ich aus den einzelnen Werten am Ende meine Matrix C darstellen kann.
Für eine Antwort wäre ich sehr dankbar Muss meine Übung schon am Mittwoch abgeben, damit ich am Freitag nach 1. Mai frei hab^^
Danke und lg JustSmile
Hier nun der Code:
% Funktion zur Berechnung der Choleskyzerlegung
function cholesky
format;
A=input('Geben Sie eine beliebige, positiv definite nxn-Matrix ein:','s');
tic;
if size(A,1)~=size(A,2)
disp('Sie haben keine nxn Matrix eingegeben.');
else
n=size(A,1);
end
k=1;
p=0;
% Berechnen des ersten Matrixeintrages von C
c_1_1=sqrt(A(1,1));
% Berechnen der restlichen Diagonalenglieder von C
while k<n
p=p+(c_k_k)^2;
k=k+1;
D=A(k,k)-p;
if D<=0
disp('Sie haben keine positiv definite Matrix eingegeben.');
else
c_k_k=sqrt(D);
end
end
% Berechnen der restlichen Glieder - spaltenweise, angefangen mit der
% ersten
k=0;
l=0;
p=0;
% While-Schleife, die die Spalten von C von rechts nach links durchläuft
while l<(n-1)
l=l+1;
k=l;
% While-Schleife, die die einzelnen Werte der jeweiligen Spalte von
% oben nach unten durchläuft, wobei jeweils unterhalb der
% Hauptdiagonalen angefangen wird
while k<n
k=k+1;
if l==1
p=0;
else
for h=1:(l-1)
p=p+(c_k_h)*(c_(l-1)_h);
end
end
c_k_l=(A(k,l)-p)*(1/c_l_l);
end
end
% Ausnullen aller übriger Matrixwerte
l=1;
k=0;
while k<(n-1)
k=k+1;
l=k;
while l<n
l=l+1;
c_k_l=0;
end
end
C=[[c_1_1:c1_n]:[c_n_1:c_n_n];
disp('Die Matrix der Choleskyzerlegung zu Ihrer Matrix sieht wie folgt aus:');
disp(C);
t=toc;
fprintf('%d Sekunden wurden zur Berechnung benötigt\t',t);
PS: Gibts ne andere Möglichkeit, die Formelzeichen zu deaktivieren?!?
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 21:15 Mo 28.04.2008 | Autor: | vivo |
hallo,
was genau geht denn nicht ????
hier ist mal pseudo code, so werden einfach die alten [mm] a_{ij} [/mm] überschreiben:
for i := 1 to n do
for j := 1 to i-1 do
[mm] a_{ij} [/mm] := [mm] (a_{ij} [/mm] - [mm] \summe_{k=1}^{j-1} a_{ik} a_{jk}) [/mm] / [mm] a_{jj} [/mm]
[mm] a_{ii} [/mm] := [mm] \wurzel{a_{ii} - \summe_{k=1}^{j-1} a_{ik}^2}
[/mm]
end
end
musst halt die summen noch als schleifen bauen und dass wars dann eigentlich schon. Matrix a rein und schleifen laufen lassen.
gruß
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 21:43 Mo 28.04.2008 | Autor: | JustSmile |
Das habe ich prinzipiell auch so gemacht:
Sei [mm] G=(g_i_j)
[/mm]
Dann ist für i<j [mm] g_i_j=0
[/mm]
Dann ist für i=j [mm] g_i_j=Wurzel a_i_i-Summe...
[/mm]
Dann ist für i>j [mm] g_i_j=(a_i_j-Summe...)*(1/g_j_j)
[/mm]
Mein Problem besteht ja auch nicht darin, die Rechnung zu programmieren, sondern darin, hinterher meine Matrix angezeigt zu bekommen!
Die Fehler, die mir der Editor anzeigt, verstehe ich ja gerade nicht, was da falsch ist!
Für eine konstruktive Antwort bezüglich meines Matrix-Ausgabe-Problems wäre ich immernoch dankbar
Bzgl. deiner Nachfrage, was da nicht funktioniert: Matlab führt ein Programm nur aus, wenn keine roten Fehler mehr angezeigt werden! Am einfachsten ist es, wenn du den Code einfach in den Editor lädst, dann zeigt der dirs rechts schon an - geht leichter als hier zu beschreiben, wo ihr die Fehler findet.
Trotzdem danke für die Mühe.
lg
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 22:01 Mo 28.04.2008 | Autor: | BKM |
Guten Abend.
Ich habe Dein ProgrammProgramm mal etwas überarbeitet und ohne Fehler zum laufen gebracht. Was ich NICHT geprüft habe, ist die mathematische Seite. D.h. ob Du die Formel(n) für die Cholesky-Zerlegung richtig eingegeben hast, ist von mir ungeprüft. Es laeuft lediglich dein Programm ohne Fehler mit der Nachricht nach dem Befehl Run ( Enter):Geben Sie eine beliebige, positiv definite nxn-Matrix ein:
Beste Grüße.
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Erstmal super vielen Dank! Auch wenn ich nicht weiß, was jetzt das einfügen der kommentare genau geändert hat für matlab^^
Ich habe jedenfalls mein Programm jetzt nochmal überarbeitet und mein Problem bereits gelöst, allerdings läuft mein Programm noch nicht ganz rund. Für einen Rat zu folgenden Problemen wäre ich dankbar:
1. Es kommt JEDES mal meine Meldung, ich habe keine nxn-matrix eingegeben (Zeile 8-10)
2. Es kommt die Fehlermeldung, er sqrt wäre nicht Definiert für char (Zeile 16)
Was ist da los? Ich komme leider noch nicht weiter :-/
Und noch eine Frage: gibt es einen Code in matlab, mit dem man eine positiv-definite matrix zufällig erstellen kann wie z.b. zeros(n) oder so?
Danke nochmals und einen schönen Abend!
Hier der neue Code, der auf jeden fall ausführbar ist: Cholesky
Dateianhänge: Anhang Nr. 1 (Typ: txt) [nicht öffentlich]
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 17:20 Di 29.04.2008 | Autor: | Rene |
Hallo erstmal!
Du musst in der Zeile A=input(...) den parameter 's' entfernen. Der sagt nämlich, das die Eingabe als string interpretiert werden soll. Folge du hast in A einen String. Wenn du jetz versuchst aus einem Element von A, was ja dan ein char ist die Wurzel zu ziehen geht das natürlich nicht.
Danach läuft das M-File durch, aber das Ergebnis ist falsch, da du das 2. Diagonal-Element erst berechnen kannst, wenn du die 1. Spalte bzw. Zeile von L, bei dir C, vollständig berechnet hast, da du die Eintrgäge ja benötigst um [mm]c_{ii}[/mm] zu berechnen.
Ich hab die Zerlegung mal als function geschrieben, vielleicht hilft dir das ja deinen Fehler zu beheben.
cholesky.m
Die Datei muss natürlich, wenn man sie als function aufrufen möchte, auch als cholesky.m gespeichert werden
MFG
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 22:14 Di 29.04.2008 | Autor: | JustSmile |
Danke Danke Danke!!!!!!!!!!!
Hat mir super geholfen, auf die sache mit dem 's' wäre ich nie gekommen, weil ich noch ein totaler matlab neuling bin und das erst das 3. programm ist^^
Vielen Vielen Danke nochmal für die ganze Mühe!
lg
|
|
|
|