Karlsruher Institut f¨ur Technologie WS 2010/11 Institut f¨ur theoretische Festk¨orperphysik
Dr. Andreas Poenicke und Dipl.-Phys. Patrick Mack 15.12.10
http://comp.physik.uni-karlsruhe.de/Lehre/ERA/ era@physik.uni-karlsruhe.de
L¨ osungsvorschlag zu ¨ Ubungsblatt Nr. 5 zur Vorlesung
” Einf¨ uhrung in das rechnergest¨ utzte Arbeiten“
1 Matrizen
Die Konstruktion von Matrizen wird in Matlab durch verschiedene Befehle erleichtert, die schon bestimmte Matrizen erzeugen. Z.B.: diag, eye, ones, zero, meshgrid (siehe Hilfe). Oft hilf- reich ist auch, daß Matlab Matrizen durch Nulleintr¨age auf die entsprechende Dimension erg¨anzt.
a) Der Befehl meshgrid kann genutzt werden zwei Matrizen Xij = i und Yij =j zu erzeugen.
Zu beachten ist, daß die nachfolgende Multiplikation als elementweise Operation nicht als Matrix- Multiplikation durchgef¨uhrt wird.
[X Y] = meshgrid(1:10);
A = X + Y B = X .* Y
b) Matrizen lassen sich auch leicht aus Teilen anderer Matrizen zusammensetzen. Quell- und Ziel- bereiche werden in den Indizes angegeben. Beachten sie die Abk¨urzung :f¨ur ganze Zeilen/Spalten.
C(1:5, :) = A(1:5, :);
C(6:10, :) = B(6:10, :);
det(C) trace(C)
c)
Der Befehl eye(m) erzeugt eine Einheitsmatrix der Dimension m×m. Wird der Befehldiag mit einem Vektor als Argument aufgerufen gibt er eine Diagonalmatrix mit den Werten des Vektors als Diagonalwerte zurueck.ones(m,n)erzeugt einem×n-Matrix mit dem Wert 1 in allen Elementen, kann also genutzt einen Vektor nur mit 1en zu erzeugen.
m=10
D=2*eye(m) - diag( ones( 1, m-1 ), -1 ) + diag( ones( 1, m-1 ), 1 ) eig(D)
2 Der Matlab-Befehl plot stellt Vektoren graphisch dar. Im Gegensatz zu z.B. Maple wird daher der Bereich der dargestellt werden soll nicht durch eine Option des Plot-Befehls sondern durch die Definition des Vektors selbst festgelegt. Bei Definition der Vektoren bietet sich oft der Befehl linspace an.
t = linspace(0, 40, 301);
xi=.1;
x(1, :) = exp(-xi * t) .* cos( sqrt(1 - xi^2) * t );
xi=.5;
x(2, :) = exp(-xi * t) .* cos( sqrt(1 - xi^2) * t );
xi=1;
x(3, :) = exp(-xi * t) .* cos( sqrt(1 - xi^2) * t );
xi=5;
x(4, :) = exp(-xi * t) .* cos( sqrt(1 - xi^2) * t );
plot(t, x) alternativ z.B.
t=0:40/300:40 hold on
xi=0.1;
plot( t, exp(-xi*t).*cos(sqrt(1-xi^2)*t) );
xi=0.5
plot( t, exp(-xi*t).*cos(sqrt(1-xi^2)*t) );
xi=1.0
plot( t, exp(-xi*t).*cos(sqrt(1-xi^2)*t) );
xi=5.0
plot( t, exp(-xi*t).*cos(sqrt(1-xi^2)*t) );
hold off
0 5 10 15 20 25 30 35 40
−0.8
−0.6
−0.4
−0.2 0 0.2 0.4 0.6 0.8 1
Abbildung 1: Beispiel zu Aufgabe 2)
3 Um die Felder plotten zu k¨onnen, m¨ussen wir sie erst diskretisieren. Entlang einer Achse verwenden wir den Ausdruck x1:dx:x2, der einen Vektor mit den Elementen (x1, x1 +dx, x1 + 2dx, . . . , x2) erstellt. Weiterhin ist es hilfreich, zwei Felder zu haben die jeweils einfach dem x- bzw. den y-Wert entsprechen. In Matlab erhalten wir diese recht komfortabel mit der Funktion meshgrid, welche als Parameter die Punkte entlang der x- und y-Achse erwartet.
a) Wichtig ist wieder, dass Matlab bei Feldern und Matrizen im Prinzip immer Matrix-Operationen durchf¨uhren will. Um punktweise Operationen zu erwingen ist immer ein Punkt vor dem Operator n¨otig, also x.*y, x./y etc.!
[x,y] = meshgrid( -5:0.2:5, -5:0.2:5 );
surf( x, y, x.*y );
surf( x, y, 1 ./ ( 1 + ( x.^2 + y.^2 ).^3 ) );
surf( x, y, exp( -( x.^2 + y.^2) ) );
−5
0
5 −5 0
−30 5
−20
−10 0 10 20 30
−5
0
5 −5 0
5 0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
−5
0
5 −5 0
5 0
0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1
Abbildung 2: Beispiele zu Aufgabe 3a)
Andere Darstellungen ergeben sich durch Ersetzen von surf durch mesh, pcolor odercontour.
b) F¨ur die Darstellung von Vektorfeldern existiert die Funktion quiver, die an den Diskretisie- rungspunkten kleine Pfeile zeichnet. Die Syntax ist fast analog zur Darstellung skalarer Felder, nur dass jetzt zwei Argumente (x- und y-Komponente) des darzustellenden Feldes ¨ubergeben werden m¨ussen:
[x,y] = meshgrid( -5:0.5:5, -5:0.5:5 ); % Geringere Diskretisierungsdichte!
quiver( x, y, -y, x );
quiver( x, y, -x ./ sqrt( x.^2 + y.^2 ), -y ./ sqrt( x.^2 + y.^2 ) );
quiver( x, y, -y, -x );
−6 −4 −2 0 2 4 6
−6
−4
−2 0 2 4 6
−5 −4 −3 −2 −1 0 1 2 3 4 5
−5
−4
−3
−2
−1 0 1 2 3 4 5
−6 −4 −2 0 2 4 6
−6
−4
−2 0 2 4 6
Abbildung 3: Beispiele zu Aufgabe 3b)
4
a) In Matlab m¨ussen Funktionen in einer Datei liegen, die den selben Dateinamen wie die Funktion selbst tr¨agt und als Endung .m hat. Wir legen also eine Dateipotential.mmit folgendem Inhalt an:
function result=potential(x,y,x0,y0,q)
result= q ./ sqrt((x-x0).^2+(y-y0).^2) end
Der Aufruf erfolgt wie in der Aufgabenstellung vorgegeben!
−5
0
5
−5 0
5 0 1 2 3 4 5 6 7 8
Abbildung 4: Beispiele zu Aufgabe 4a)
b) Die Funktion besteht aus einer Schleife, die alle Zeilen der ¨ubergebenen Matrix durchgeht. F¨ur jede Zeile wird die Funktion potential aus Teilaufgabe a) aufgerufen und zum Gesamtpotential hinzuaddiert.
function resultat = potential2(x,y,qList)
% Einfache Methode um die Matrix zu initialisieren resultat = 0*x;
% Eine Schleife ueber alle Zeilen der Liste for( i = 1:length(qList(:,1)) )
resultat = resultat + potential(x,y,qList(i,1),qList(i,2),qList(i,3));
end
Der Aufruf erfolgt wie in der Aufgabenstellung vorgegeben.
−5
0
5
−5 0
5
−8
−6
−4
−2 0 2 4 6 8
Abbildung 5: Beispiel zu Aufgabe 4b)