Householder-Ähnlichkeitstransformation Hessenbergform in Matlab realisieren

Neue Frage »

pablosen Auf diesen Beitrag antworten »
Householder-Ähnlichkeitstransformation Hessenbergform in Matlab realisieren
Guten Abend

Ich möchte den als jpg angehängten Algorithmus in Matlab realisieren. Eingabe soll A sein und Ausgabe die zu A ähnliche Matrix in Hessenbergform.

Ich komme einfach nicht mehr weiter. Habe nun mehrmals pedantisch den Code kontrolliert, aber finde keinen Fehler.

Das einzige, was mich ein bischen stutzig macht, ist, ob ich an den richtigen Stellen s auf 0 setze. Aber irgendwie müsste das doch so stimmen.

Wäre megafroh, wenn sich das mal einer den Code anschauen könnte. Falls jmd. ein m-file mit dem gleichen Algorithmus hätte, der aber funktioniert, würde das auch weiterhelfen.


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:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
function A = hessenberg(A)
n=length(A);

Q=eye(n);
eps=.0000000001;
s=0;
countwhile=0;

for i=1:1:n-2
    
    %while is step b)
    while(s<=eps)
    
        %step a)
        s=0;
        for j=i+countwhile+1:1:n
            s=s+A(j,i+countwhile)^2; 
        end
        s=sqrt(s);

        rho=-sign(A(i+1+countwhile,i+countwhile));
        c=sqrt(2*s*(s+abs(A(i+1+countwhile,i+countwhile))));

        countwhile=countwhile+1;        
    end
    
    %step c)
    Q(i+1,i)=(A(i+1,i)-rho*s)/c;
    for j=i+2:1:n
        Q(j,i)=A(j,i)/c;
        
    end
    
    %step d)
    A(i+1,i)=rho*s;
    for j=i+2:1:n
        A(j,i)=0;        
    end
    
    %step e)
    for j=1:1:i
        s=0;
        for k=i+1:1:n
            s=s+Q(k,i)*A(j,k);
        end
        s=2*s;        
        for k=i+1:1:n
            A(j,k)=A(j,k)-s*Q(k,i);            
        end        
    end
    
    %step f)
    for j=1:1:i
        s=0;
        for k=i+1:1:n
            s=s+Q(k,i)*A(k,j);            
        end
        s=2*s;
        for k=i+1:1:n
            A(k,j)=A(k,j)-s*Q(k,i);            
        end        
    end
    
    %step g)
    s=0;
    for j=i+1:1:n
        s=s+Q(k,i)*A(j,k);
    end
    s=2*s;
    
    for j=i+1:1:n
        A(j,k)=A(j,k)-s*Q(k,i);        
    end   
    s=0;
end



Grüsse
Pablo
Airblader Auf diesen Beitrag antworten »

Hi,

habe gerade leider keine Zeit, irgendwelche Codes anzuschauen, aber schau doch mal auf dieser Seite unter "Matlab-Demos". Da gibt es die "Hessenberg-Transformation" (benötigt noch die anderen Dateien nebenan).

air
pablosen Auf diesen Beitrag antworten »

Hallo Airblader

Danke dir. Der Link ist gut und das funktioniert so. Trotzdem ist es leider nicht der Algorithmus, den ich gepostet habe leider. Die berechnen da die Eigenwerte und nutzen die Frobius-Norm.

Habe den kompletten Algorithmus nun neu programmiert und bin auf exakt den gleichen Code gekommen, den ich oben gepostet habe.

Lese ich vlt. den Algorithmus falsch?
Den Wert an der Stelle A(1,2) macht meine Funktion richtig, den Rest aber leider nicht.

Gute Nacht.
Airblader Auf diesen Beitrag antworten »

Zählst du deine Hilfsvariable countwhile überhaupt jemals hoch verwirrt

air
pablosen Auf diesen Beitrag antworten »

Zitat:
Original von Airblader
Zählst du deine Hilfsvariable countwhile überhaupt jemals hoch verwirrt

air
stimmt, sry. Habe die Zeile "countwhile=countwhile+1;" hinzugefügt und oben den code geändert.

Muss ja am Ende der while-Schleife um eins erhöht werden, wenn ich den Algo so lese... und wenn Bedingung erfüllt ist dann für den step a) die Variable i um eins erhöht

Mit "gehe zu a) mit i+1" sind doch alle i's im Schritt a) gemeint (?)
Airblader Auf diesen Beitrag antworten »

Ja, ist so in Ordnung.
Jetzt scheint mir noch, dass du beim letzten Schritt die Hälfte vergessen hast. Augenzwinkern

Edit: Wobei ich bei dem Algo jetzt nicht ganz sicher bin, ob das 'i' in Schritt b) global verändert werden soll. Ich kenne den Algo leider nicht und kann es daher nicht sagen.
Wenn es nach der Korrektur des letzten Schrittes immer noch nicht funktioniert (soweit habe ich keinen anderen Fehler gefunden), dann würde ich das i einfach global verändern (d.h. beim Abbruchkriterium einen continue-Befehl einbauen, wie auch immer der in Matlab heißt).

air
 
 
pablosen Auf diesen Beitrag antworten »

Zitat:
Original von Airblader
Ja, ist so in Ordnung.
Jetzt scheint mir noch, dass du beim letzten Schritt die Hälfte vergessen hast. Augenzwinkern

Edit: Wobei ich bei dem Algo jetzt nicht ganz sicher bin, ob das 'i' in Schritt b) global verändert werden soll. Ich kenne den Algo leider nicht und kann es daher nicht sagen.
Wenn es nach der Korrektur des letzten Schrittes immer noch nicht funktioniert (soweit habe ich keinen anderen Fehler gefunden), dann würde ich das i einfach global verändern (d.h. beim Abbruchkriterium einen continue-Befehl einbauen, wie auch immer der in Matlab heißt).

air
Ja, danke, habs verbessert. Heisst auch continue; Hat leider aber doch nichts gebracht. Habe 2 Varianten gemacht. 1mal mit globaler Variable, die ändert, 1mal mit dem countwhile, funktioniert alles nicht.

Naja, werds morgen mal einer Kollegin vorlegen und wenn ichs rauskriege, wo das Problem ist, werd ichs posten.

Danke für die Hilfe. Schlaf gut dann.
Pablo
Airblader Auf diesen Beitrag antworten »

Alles klar. Vielleicht ja auch ein Fehler im Algo, kommt ja auch mal vor.
Gute Nacht und halte mich auf dem Laufenden Wink

air
pablosen Auf diesen Beitrag antworten »

edit: zu früh gefreut
pablosen Auf diesen Beitrag antworten »

2 Fehler waren drin:
- das j vom Punkt f) muss von i+1 bis n gehen (Fehler im Algorithmus)
- ich habe bei Punkt 1g) die for-Schleife nur für die erste Berechnung durchlaufen lassen anstatt auch für die 2.for-Schleife.

Richtig ist Punkt g also:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
 %step g)   
    for j=i+1:1:n
        s=2*(Q(i+1:n,i)'*A(j,i+1:n)');
    
    for k=i+1:1:n
        A(j,k)=A(j,k)-s*Q(k,i);        
    end
    end


Habs jetzt mit 5x5 Matrizen versucht, alles korrekt wie die BuiltIn-Funktion hess(A) von Matlab smile

Danke.
Airblader Auf diesen Beitrag antworten »

Na, dann hat es sich ja gut ausgeglichen Freude

air
Neue Frage »
Antworten »



Verwandte Themen

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