WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Matrix in for Schleife speichern und plotten

 

redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.10.2012, 16:18     Titel: Matrix in for Schleife speichern und plotten
  Antworten mit Zitat      
Hallo liebe Matlab Community,

der im folgenden gezeigte Code ist mein ertes Matlab Programm und noch sehr umständlich. Damit ich meine Ergebnisse auch direkt sehen kann, möchte ich die Eigenvektoren komponentenweise mit dem jeweiligen Magnetfeld B plotten (Ich bekomme dann 5 Kurven).

Dazu muss ich aber C =eigs(S) in jedem Iterationsschritt in der for-Schleife speichern.
Dies ist mein erstes Problem.

Anschließend möchte ich C(B)=eigs(S) über B plotten.

Vielleicht kann mir jemand von Euch erklären, wie ich mein Programm umschreiben muss um dies zu erreichen.

Vielen Dank

redXtream

Code:
% Eingabe des Spins
disp('Geben Sie den Spin ein');
S = input('');
disp('');
% Eingabe der Nullfeldaufspaltung
disp('Geben Sie den Wert der Nullfeldaufspaltung in WZ ein');
D = input('');
disp('');
% Eingabe der Rhombizität
disp('Geben Sie den Wert der Rhombizität ein');
F = input('');
disp('');
% Eingabe des g-Wertes
disp('Geben Sie den g-Wert in z-Richtung ein');
g = input('');
disp('');
% Eingabe des Magnetfeldes
disp('');
 i = (2*S)+1;
 j = S*(S+1)*0.33;   %Berechnung der Multipliztät i (2S+1) und j=S*(S+1)*0.33

 a = S+1;

for B=0:0.05:1
 for q = 1:i  % linke Basis
      for p = 1:i %rechte Basis, wendet man Operator Sz an so kommt p heraus
   
        a =a-1;
if (a<=-S-1)
a = S;
else
a;
end
        if(q==p)    %Fall 1, hier muss der Operator Sz ansetzen
        E(q,p)=D*a*a-D*j+ 0.4661*g*B*a;
        elseif(q+2==p) % Fall 2, hier setzt der Sx Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a+1)));
        elseif (q-2 == p) % Fall 3, hier setzt der Sy Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a-1)));
        else               % Ansonsten bleibt nur die Null
        E(q,p)=0;
        end



      end
 end
 
   
 C =eigs(E);
    disp(C);
   
end
 


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 23.10.2012, 16:04     Titel:
  Antworten mit Zitat      
Hallo,

ich würde das grob so machen:

Code:
alleB = 0:0.05:1;
for I = 1:length(alleB)
% Berechnungen mit B(I)
C(:,I) = ...; % DIe Eigenwerte werden in einer Matrix gespeichert
end
plot(alleB, C)


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.10.2012, 13:58     Titel: etwas unklar
  Antworten mit Zitat      
Hallo Harald,

vielen Dank für Deine Antwort.
Mir ist leider nicht klar, wo ich dass in meiner Software einbauen muss. Könntest Du mir dies kurz erklären.

Vielen Dank

redXtream
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 25.10.2012, 14:44     Titel:
  Antworten mit Zitat      
Hallo,

du hast
Code:


Mein Vorschlag stattdessen:
Code:
alleB = 0:0.05:1;
for I = 1:length(alleB)


In der Schleife führst du Berechnungen mit
Code:

aus. Das müsstest du dann durch
Code:
ersetzen.

Die Eigenwerte sollten dann in einer Matrix C abgelegt werden, d.h. statt
Code:
solltest du
Code:
C(:,I) = ...
schreiben.

Dann sollte der zuletzt genannte plot-Befehl funktionieren.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2012, 14:10     Titel: tausend Dank
  Antworten mit Zitat      
Harald du bis echt ein Genie.

Vielen Dank

funktioniert super.

Eine Frage allerdings noch. Wenn ich jetzt keine verbundenen Linien haben möchte, sondern nur Punkte und alle Punkte einfarbig. Wie kann ich dies realisieren?
Nochmals Danke
Gruß

redXtream
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.10.2012, 14:15     Titel: Error linie 53
  Antworten mit Zitat      
Hallo an alle. In diesem Code liegt der folgende Fehler vor:

Error using plot
Vectors must be the same lengths.

Error in version1 (line 53)
plot(alleB, C)

Ich weiß nicht worand dies liegt. Die Programm heißt version 1
Code:
Code:
% Eingabe des Spins
disp('Geben Sie den Spin ein');
S = input('');
disp('');
% Eingabe der Nullfeldaufspaltung
disp('Geben Sie den Wert der Nullfeldaufspaltung in WZ ein');
D = input('');
disp('');
% Eingabe der Rhombizität
disp('Geben Sie den Wert der Rhombizität ein');
F = input('');
disp('');
% Eingabe des g-Wertes
disp('Geben Sie den g-Wert in z-Richtung ein');
g = input('');
disp('');
% Eingabe des Magnetfeldes
disp('');
 i = (2*S)+1;
 j = S*(S+1)*0.33;   %Berechnung der Multipliztät i (2S+1) und j=S*(S+1)*0.33

 a = S+1;

alleB = 0:0.05:1
 for I = 1:length(alleB)
 for q = 1:i  % linke Basis
      for p = 1:i %rechte Basis, wendet man Operator Sz an so kommt p heraus
   
        a =a-1;
if (a<=-S-1)
a = S;
else
a;
end
        if(q==p)    %Fall 1, hier muss der Operator Sz ansetzen
        E(q,p)=D*a*a-D*j+ 0.4661*g*alleB(I)*a;
        elseif(q+2==p) % Fall 2, hier setzt der Sx Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a+1)));
        elseif (q-2 == p) % Fall 3, hier setzt der Sy Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a-1)));
        else               % Ansonsten bleibt nur die Null
        E(q,p)=0;
        end



      end
 end
 
   
 C(:,I) = eigs(E);
    disp(C);
   plot(alleB, C)
end


Hoffe auf Hilfe.

Grüße

redXtream
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 26.10.2012, 14:30     Titel:
  Antworten mit Zitat      
Hallo,

mein Fehler. Man muss C entweder zeilenweise belegen oder (jetzt wohl einfacher) die Transponierte plotten.

Code:
plot(alleB, C')  

Dieser Befehl sollte dann außerhalb der for-Schleife über I stehen, weil alles auf einmal geplottet wird.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.10.2012, 22:15     Titel: Problem besteht immer noch
  Antworten mit Zitat      
Liebe Matlab Community, lieber Harald

es ist immer noch der folgende Fehler im Code:
??? Subscripted assignment dimension mismatch.

Error in ==> Diagonalisierungsprogramm3 at 53
C(:,I) = eigs(E);

ich weiß nicht woran es liegt. Bitte helft mir weiter:
Code:

% Eingabe des Spins
disp('Geben Sie den Spin ein');
S = input('');
disp('');
% Eingabe der Nullfeldaufspaltung
disp('Geben Sie den Wert der Nullfeldaufspaltung in WZ ein');
D = input('');
disp('');
% Eingabe der Rhombizität
disp('Geben Sie den Wert der Rhombizität ein');
F = input('');
disp('');
% Eingabe des g-Wertes
disp('Geben Sie den g-Wert in z-Richtung ein');
g = input('');
disp('');
% Eingabe des Magnetfeldes
disp('');
 i = (2*S)+1;
 j = S*(S+1)*0.33;   %Berechnung der Multipliztät i (2S+1) und j=S*(S+1)*0.33

 a = S+1;

alleB = 0:0.05:1
plot(alleB, C', '.k')
 for I = 1:length(alleB)
 for q = 1:i  % linke Basis
      for p = 1:i %rechte Basis, wendet man Operator Sz an so kommt p heraus
   
        a =a-1;
if (a<=-S-1)
a = S;
else
a;
end
        if(q==p)    %Fall 1, hier muss der Operator Sz ansetzen
        E(q,p)=D*a*a-D*j+ 0.4661*g*alleB(I)*a;
        elseif(q+2==p) % Fall 2, hier setzt der Sx Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a+1)));
        elseif (q-2 == p) % Fall 3, hier setzt der Sy Operator an
        E(q,p)=D*0.5*F*(j/0.33-(a*(a-1)));
        else               % Ansonsten bleibt nur die Null
        E(q,p)=0;
        end



      end
 end
 
   
 C(:,I) = eigs(E);
    disp(C);
 
end
 

Viele Grüße

redXtream
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.10.2012, 22:43     Titel:
  Antworten mit Zitat      
Hallo,

der Fehler deutet generell darauf hin, dass eine Zuweisung mit nicht kompatiblen Dimensionen erfolgt.
Setze doch mal einen Haltepunkt in die Zeile, in der der Fehler auftritt, und schau dir C und eigs(E) an.

Falls das nicht weiterhilft, bitte die eingegebenen Parameter S,D,F,g posten.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2012, 13:19     Titel: Parameter
  Antworten mit Zitat      
Hallo,

also typische Parameter wären:

S = 2
D = 3
F = 0.33
g = 2


Wie kann ich diesen Haltepunkt erzeugen?
Gruß

redXtream
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.10.2012, 13:50     Titel:
  Antworten mit Zitat      
Hallo,

mit diesen Parametern läuft dein Code bei mir durch. Einzige Änderung: der Plot-Befehl muss naheliegenderweise ans Ende des Codes. Man kann ja nichts plotten, was es noch gar nicht gibt.

Haltepunkt setzen: auf den Strich vor der Zeile klicken.
Ausführliche Informationen zum Thema Debuggen:
http://www.mathworks.com/help/relea.....atlab/debugging-code.html

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.10.2012, 15:19     Titel: Leider nicht
  Antworten mit Zitat      
Hallo Harald,

wenn ich den Code eingebe und erneut abspeichere, dann läuft das Programm bei mir ebenfalls durch. Wenn ich dann aber folgende Parameter eingebe:

S = 2.5
D = 3
F = 0
g = 2

dann funktioniert das Programm nicht. Dies ist auch in Ordnung. Wenn ich aber dann wieder
S = 2
D = 3
F = 0.33
g = 2
eingebe. Erscheint folgender Fehler:

Subscripted assignment dimension mismatch.

Error in Test_2 (line 53)
C(:,I) = eigs(E);

Ich bin zu sehr Anfänger um aus dieser Sacher selber herauszukommen. Vielleicht nimmst du Dir kurz die Zeit und versuchst es ebenfalls.

Vielen Dank und Grüße

redXtream
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 30.10.2012, 16:18     Titel:
  Antworten mit Zitat      
Hallo,

jetzt verstehe ich, wo das Problem liegt. Nach einem Durchlauf liegt das alte C noch im Speicher, womit die Dimensionen nicht mehr zusammenpassen.
Mögliche Abhilfe:
a) als Funktion speichern
b) vor dem erneuten Ausführen
Code:


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
redXtream

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 31.10.2012, 14:32     Titel: Jetzt funktionierts
  Antworten mit Zitat      
Vielen Dank Harald,

jetzt funktioniert es.

Viele Grüße

redXtream
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.