Eigenwerte mit Variablen < Matlab < Mathe-Software < Mathe < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 14:14 Di 06.11.2007 | Autor: | heinz_13 |
Ich habe diese Frage in keinem Forum auf anderen Internetseiten gestellt.
Hallo...
Ich möchte die Eigenwerte einer Matrix berechnen lasssen. Die Elemente der Matrix hängen dabie von einer Variablen x ab. Diese liegt im Bereich von -0.1 bis 0.1. Also auf jeden Fall kleiner eins. Wenn ich eine For-Schleife nehme muss die Schrittweite aber mindestens 1 sein. Gibt es da andere Befehle, so dass ich die Eigenwerte in Abhängigkeit von x mir ausgeben lassen kann, und plotten.
Danke
|
|
|
|
Hi,
was willst Du plotten?
Etwa so:
1: | clear all;
| 2: | clf;
| 3: | clc;
| 4: |
| 5: | hold on;
| 6: |
| 7: | Matrix=rand(3,3)
| 8: | Bereich=linspace(-0.1,0.1,10);
| 9: |
| 10: | for zaehler=1:length(Bereich)
| 11: | Matrix(1,3)=Bereich(zaehler)
| 12: | Eigenwerte=eig(Matrix)
| 13: | if isreal(Eigenwerte)
| 14: | Eigenwerte=complex(Eigenwerte);
| 15: | end
| 16: | plot(Eigenwerte,'o');
| 17: | end
| ?
mfg
nschlange
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 14:56 Di 06.11.2007 | Autor: | heinz_13 |
Also ich habe eine 3x3 Matrix. Die einzelnen Elemente hängen alle von zwei Variablen (z.B.: x,y) ab. Nun möchte ich die Eigenwerte der Matrix in Abhängigkeit von diesen Variablen plotten. Also ein surf-PLot oder sowas. Das heißt es müssen für alle Wertepaare von x und y die Eigenwerte der MAtrix bestimmt werden. x und y liegen im Bereich von z.B.: -0.1 bis 0.1. Die Schrittweite dann bei 1/100 oder 1/1000.
Bin noch ziemlich neu mit dem Programm. Vielleicht ist es auch ganz einfach.
Danke schon mal.
|
|
|
|
|
Ach so,
in welcher Weise hängen denn die Matrix-Elemente von x und y ab?
Gib doch mach ein konkretes Beispiel.
mfg
nschlange
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:16 Di 06.11.2007 | Autor: | heinz_13 |
Also...
die Matrix sieht so aus:
((A1+La+De-K) A2 A3
A2 (A1+La+De+K) A3
A3 A3 La)
so. Die A sind nur Konstanten. Für die anderen gilt:
La=d1*z+d2*(x+y);
De=d3*z+d4*(x+y);
K=d5*(x-y);
z=(-C13/C33)*(x+y);
die d sind wieder Konstanten. Ich will nun die Eigenwerte/Eigenvektoren in Abhängigkeit von x und y berechnen. Danach will ich sie als Plot darstellen.
|
|
|
|
|
Hallo,
du kannst es doch wie von nschlange vorgeschlagen mit linspace machen, nur eben pro Dimension einmal.
Aber wer sagt denn, dass man ein for-Schleife nicht mit kleineren Schrittweiten durchlaufen kann? Du kennst wohl noch nicht:
for x=-0.1:1/100:0.1,
for y=-0.1:1/100:0.1,
Matrix, Eigenwert(e) berechnen, plotten
end;
end;
So könnte man einen einfachen Plot gestalten.
Mit surf musst du zuerst die ganzen Daten berechnen und erst am Ende plotten. Dabei solltest du beachten, dass du dann aber nur je einen Eigenwert pro (x,y)-Paar ausgeben kannst. Das könnte problematisch werden, wenn die Anzahl auch von (x,y) abhängt.
Gruß
Martin
|
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 15:27 Di 06.11.2007 | Autor: | leduart |
Hallo
x=xAnfang
for i=1 to n
x=x+Schrittweite
(oder x=xAnfang*i)
next i
Gruss leduart
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 15:47 Di 06.11.2007 | Autor: | heinz_13 |
Das geht so schon, aber wenn ich es darstelle dann macht er den plot in Abhängigkeit von i und nicht von x.
|
|
|
|
|
Was macht er dann?
Hast Du schon ein Programm?
Es wäre nett, wenn Du das hier posten würdest, dann muss man nicht alles neu tippen.
Wenn ich das dann richtig verstanden habe würde ich Funktion matrix.m schreiben:
1: |
| 2: | function [ret] = matrix(x,y)
| 3: | ret=zeros(3,3);
| 4: | ret(1,1)=2*x.*y
| 5: | ret(1,2)=A2;
| 6: | u.s.w.
| 7: | .
| 8: | .
| 9: | .
| 10: | return;
|
Ein Aufruf von matrix(2,3) liefert Dir dann eine Matrix mit x=2 und y=3.
Davon kannst Du dann die Eigenwerte bestimmen.
Dann machst Du
1: |
| 2: | x=-0.1:0.001:0.1;
| 3: | y=-0.1:0.001:0.1;
| 4: | hold on;
| 5: | for i=1:length(x)
| 6: | for j=1:length(y)
| 7: | M=matrix(x(i),y(j));
| 8: | ew=eig(M);
| 9: | if isreal(ew)
| 10: | ew=complex(ew);
| 11: | end;
| 12: | plot(ew,'o');
| 13: | end
| 14: | end
|
Geht das evtl so?
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 16:47 Di 06.11.2007 | Autor: | heinz_13 |
So gehts nicht. Da kann man keinen 3D Plot machen. Nur wieder mit i und j an den Achsen. Das will ich aber nicht. Ich will es in Abhängigkeit von x und y.
|
|
|
|
|
Was ist denn mit komplexen Eigenwerten?
Falls Deine Matrizen pos. def. sind könnte man in meinem Code cell-Arrays einführen.
1: | clear all;
| 2: | clc;
| 3: | clf;
| 4: | x=-0.1:0.02:0.1;
| 5: | y=-0.1:0.02:0.1;
| 6: | ew=cell(length(x),length(y));
| 7: | hold on;
| 8: | for i=1:length(x)
| 9: | for j=1:length(y)
| 10: | M=matrix(i,j);
| 11: | ew(i,j)={eig(M)};
| 12: | for k=1:3
| 13: | plot3(x(i),y(j),ew{i,j}(k),'o');
| 14: | end
| 15: | end
| 16: | end |
Geht bestimmt auch eleganter...
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 17:28 Di 06.11.2007 | Autor: | heinz_13 |
Ja...so gehts..Nur kann ich keinen surf-Plot oder contour-Plot machen. Würd ich aber gern ...hast du da vielleicht auch noch ne idee...
erstmal danke
|
|
|
|
|
Natürlich hab ich eine Idee, das ist ja auch nicht so schwer.
Deshalb machst Du das vielleicht am besten mal selbst.
ew{i,k} enhält die drei Eigenwerte der aktuellen Matrix
Wie man auf die zugreift steht ja oben.
Für surf und co. musst Du jetzt nur eine Matrix z machen,
die die Dimension x * y hat und die Eigenwerte enhält.
Starte mal einen Versuch
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 18:27 Di 06.11.2007 | Autor: | heinz_13 |
ich bekomms nicht hin...geht wieder nur das i und j an den achsen steht...und auch nur für mesh...für surf gehts nicht...die matrix hab ich aber mehr auch nicht...
|
|
|
|
|
Was soll das heissen?
'Für mesh gehts für surf nicht.'
Rück doch mal ein paar Zeilen Code raus...
Ich habs ohne mesh gemacht.
Du musst doch nur in der for-Schleife oben die einzelnen
Eigenwerte in Matrizen packen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:49 Di 06.11.2007 | Autor: | heinz_13 |
hab geschrieben
for i=1:length(x)
for j=1:length(y)
M=matirx(i,j)
ew(i,j)={eig(M)}
z(i,j)=ew{i,j}{1}
end
end
Dann ließt er es ein aber nur für i und j und nicht für x und y.
|
|
|
|
|
Da hab ich in dem Posting von 17:18 Uhr einen Fehler gemacht.
Da steht M=matrix(i,j).
i und j sind aber nur Laufvariablen, die von 1 an wachsen.
Weiter oben hab ich das aber richtig gemacht.
Man muss schreiben
M=matrix(x(i),y(j));
um die Funktion matrix mit den richtigen Werten aufzurufen.
x(i) ist das i-te Element von x.
Ansonsten sieht das doch gut aus.
surf(x,y,z) müsste dann gehen.
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:37 Di 06.11.2007 | Autor: | heinz_13 |
Serh schön es funktioniert. Danke an dich. Da ich noch ein Anfänger mit dem Programm bin kannst du mir irgendwelche Bücher oder Internetseiten empfehlen wo MAtlap sehr gut erklärt ist. Oder wo hast du das alles gelernt?
Danke
|
|
|
|
|
Sehr schön!
Vielleicht kannst noch ein bisschen was zum Hintergrund erzählen?!
Wäre bestimmt interessant.
Zu Matlab:
Es gibt da natürlich viele Bücher, zum Einstieg braucht man die nicht.
Google mal nach "matlab einführung" oder "matlab grundlagen".
Da wird man viel finden.
Besonders empfehlen muss man die sehr gute Hilfe zu Matlab,
die auch online verfügbar ist
http://www.mathworks.com/access/helpdesk/help/helpdesk.html
und die Matlab Central
http://www.mathworks.com/matlabcentral/
Man kann auch viel Einführungsmaterial zu GNU Octave
benutzen, da die Programme sehr ähnlich sind.
Und wie bei jeder Programmiersprache möglichst viel
Code lesen.
Viele Grüße
nschlange
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:56 Di 06.11.2007 | Autor: | heinz_13 |
Ja zum Hintergrund:
Mann kann mit Hilfe dieser Matrizen Übergänge in Halbleitermaterialien berechnen. Die Eigenwerte der Matrizen sind die Übergangsenergien. Nun sind die Elemente in der Matrix von vielen Faktoren abhängig (z.B.:Verspannung im Material). Und diese Abhängikeiten sind sehr interessant. Also wie diese sich auf die Energien auswirken.
Hab das ganze auch schon mit Mathematica gerechnet da ist es wesentlich einfacher. Aber da geht halt nicht alles da es sehr analytisch ist.
Ich dank dir erstmal. Wenn ich nochmal Probleme hab dann post ich einfach hier.
mfg
Heinz_13
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 10:20 Mi 07.11.2007 | Autor: | heinz_13 |
Hallo ich bins nochmal...
Wie sieht das jetzt aus wenn ich auch noch die einzelnen Elemente der Eigenvektoren plotten will. Das heißt ich will die einzelnen Elemente in eine Matrix einlesen und dann in Abbhängigkeit von x und y darstellen.
Hab geschrieben:
[ew(i,j),ev(i,j)]={eig(M)};
und oben wieder eine Cell für ev eingefügt. Dann sagt er immer das ich zu viele Ausgabe-Parameter habe.
|
|
|
|
|
Ich kann es jetzt nicht ausprobieren, aber man könnte schreiben
1: | [V,W]=eig(M);
| 2: | ev(i,j)={V}
| 3: | ew(i,j)={W(logical(eye(3)))}
|
Das logical gibt die Eigenwerte als einen 3x1 Vektor aus,
das ist eigentlich eine 3x3 Matrix, auf deren Diagonale die
Eigenwerte stehen.
Als Eigenvektoren bekommst Du ja je x,y Kombination
3 Vektoren mit 3 Elementen.
Wie willst Du die darstellen?
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 19:41 Mi 07.11.2007 | Autor: | heinz_13 |
Genauso wie die Eigenwerte. In Abhängigkeit vopn x und y. Also ein surf oder contour plot.
|
|
|
|
|
Ich rede immer von 3x3 Matrizen:
Jede Matrix hat 3 Eigenvektoren, einen zu jedem Eigenwert.
Jeder Eigenvektor hat drei Komponenten.
Willst Du dann die Komponenten des ersten/zweiten/dritten
Eigenwertes nehmen und als z(x,y) auftragen?
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 21:44 Mi 07.11.2007 | Autor: | heinz_13 |
Das mit den Eigenwerten und Vektoren weiß ich. Die Eigenwerte hab ich schon mit surf (z(x,y)) dargestellt. Jetzt will ich einfach die einzelnen Elemente der Eigenvektoren genauso darstellen.
|
|
|
|
|
Ich häng mal zwei m-Files an,
meine Test-Matrix-Funktion und das Hauptprogramm.
Meinst Du das so?
Die Zusammengehörigkeit von Eigenwerten und Eigenvektoren müsste
man sich nochmal genauer ansehen (falls man da Aussagen machen möchte)
Sind aber schon schöne bunte Bilder...
Dateianhänge: Anhang Nr. 1 (Typ: m) [nicht öffentlich] Anhang Nr. 2 (Typ: m) [nicht öffentlich]
|
|
|
|