eine Stromquelle der Stärke S vom Knoten ii zum Knoten jj
liefert zum Quellvektor s die Beiträge:
s(ii) = s(ii) - S
s(jj) = s(jj) + S
Das nachfolgende M-Skript baut die Matrix G und den Vektor aus einer
Leitwertiste LWL der Länge ng und einer Stromquellen-Liste SQL
der Länge ns auf. Da die Indizes in Matlab immer ab 1 laufen, in
LWL und SQL aber auch der Knoten 0 verwendet wird, müssen die
Indices gegenüber den Knotennummern um 1 nach oben verschoben werden.
» VZStempel = [ +1 -1; -1 +1 ];
» for ij=1:ng
Ind = LWL(ij,1:2) + 1;
G(Ind,Ind) = LWL(ij,3)*VZStempel;
end
» for ij=1:ns
s(SQL(ij,1)) = s(SQL(ij,1)) - SQL(ij,3);
s(SQL(ij,2)) = s(SQL(ij,2)) + SQL(ij,3);
end
Bemerkung: In der Regel entstehen bei solchen Systemen Matrizen mit weit
mehr Null- als Nicht-Null-Elementen und Matlab kennt geeignetere Datenstrukturen
für solche Probleme, als die hier gewählten 2-dimensionale Felder
(volle Matrizen). Mit Hilfe der Anweisung:
» spy(sparse(G))
kann man die Besetzungsstruktur der Matrix G graphisch darstellen.
8. Elimination von Teilfeldern
Mit Hilfe von leeren Vektoren und Matrizen, kann man die Gestalt eines
verändern.
Die Länge einer oder meherer Dimensionen kann man reduzieren, indem
man einem Teilfeld, das sich über den gesamten Index-Bereich einer oder
mehrerer Dimensionen erstreckt, eine leere Matrix [] als Wert zuordnet.
Im folgenden Beispiel wird zunächst Reihe 2 eines 3*3*3 Feldes
eliminiert, übrig bleibt ein 2*3*3 Feld. Elimination von Reihe 2
bedeutet, &daß diese Reihe in jeder Ebene des Feldes eliminiert
wird, anderenfalls entstünde als Ergbenis keine Feldstruktur.
Man kann in dieser Form also in einem n-dimensionalen Feld immer nur ein
oder mehrere (n-1)-dimensionale Teilfelder eliminieren.
Man beachte, &daß bei der Elimination von Teilfeldern, eventuell die
Dimension reduziert wird, Matlab erzeugt hier keine Ergebnisfelder mit
Dimensionen der Länge 0.
» A=rand(3,3,3)
A(:,:,1) =
0.9501 0.4860 0.4565
0.2311 0.8913 0.0185
0.6068 0.7621 0.8214
A(:,:,2) =
0.4447 0.9218 0.4057
0.6154 0.7382 0.9355
0.7919 0.1763 0.9169
A(:,:,3) =
0.4103 0.3529 0.1389
0.8936 0.8132 0.2028
0.0579 0.0099 0.1987
» size(A)
ans =
3 3 3
» A(2,:,:)=[]
A(:,:,1) =
0.9501 0.4860 0.4565
0.6068 0.7621 0.8214
A(:,:,2) =
0.4447 0.9218 0.4057
0.7919 0.1763 0.9169
A(:,:,3) =
0.4103 0.3529 0.1389
0.0579 0.0099 0.1987
» size(A)
ans =
2 3 3
» A(2,3,:)=[]
??? A null assignment can have only one non-colon index.
» A(1,2,3)=[]
??? A null assignment can have only one non-colon index.
» A(:,:,2:3)=[]
A =
0.9501 0.4860 0.4565
0.6068 0.7621 0.8214
» size(A)
ans =
2 3
Der Zugriff auf Feldelemente mit nur einem Index bezieht sich wieder auf
den zugeordneten internen Vektor. In diesem Falle ist es m&öglich einzelne
Feldelemente zu eliminieren. Die Gestalt des anderen Feldes wird dann
allerdings zerstört und das Ergebnis ist ein (Zeilen-) Vektor.
» size(A)
ans =
3 3 3
» A(2:5)=[]
» size(A)
ans =
1 23
Falls mehr als ein Argument angegeben wird, ist das Argument jeweils
der Gestaltsvektor und man kann die Funktion auch mit nur einem
vektoriellen Argument aufrufen. repmat(x,L) liefert eine
Matrix der Gestalt L, deren Elemente alle den Wert x
haben:
» L=[ 3 2 2 ]
L =
3 2 2
» ones(L)
ans(:,:,1) =
1 1
1 1
1 1
ans(:,:,2) =
1 1
1 1
1 1
» repmat(5,L)
ans(:,:,1) =
5 5
5 5
5 5
ans(:,:,2) =
5 5
5 5
5 5
Falls nur ein skalares Argument angegeben wird, wird dies häufig
als Kurzbeschreibung zur Erzeugung einer quadratischen Matrix
interpretiert, also
eines zweidimensionalen Feldes mit gleicher Länge in beiden
Dimensionen. Dies liegt zum einen daran, daß zweidimensionale
quadratische Felder in den Anwendungen eine größere
Bedeutung als alle anderen Felder haben, zum anderen aber auch daran,
daß Matlab (Matrix Laboratory) speziell auf die Verarbeitung
solcher Felder ausgelegt ist.
Felder mit ganzzahligen Werten können als Feldindex benutzt werden,
um aus einem großen Feld ein Teilfeld auszuwählen. Steht bei einer
Dimension nur der Operator : so bezeichnet er alle möglichen
Indexwerte dieser Dimension.
» A=randn(5)
A =
0.2573 0.2193 0.6145 0.3803 -0.3179
-1.0565 -0.9219 0.5077 -1.0091 1.0950
1.4151 -2.1707 1.6924 -0.0195 -1.8740
-0.8051 -0.0592 0.5913 -0.0482 0.4282
0.5287 -1.0106 -0.6436 0.0000 0.8956
» B=A(2:3,2:4)
B =
-0.9219 0.5077 -1.0091
-2.1707 1.6924 -0.0195
» I=1:4
I =
1 2 3 4
» C=A(I,2:3)
C =
0.2193 0.6145
-0.9219 0.5077
-2.1707 1.6924
-0.0592 0.5913
» A(:,1)
ans =
0.2573
-1.0565
1.4151
-0.8051
0.5287
Matlab erlaubt bei Wertzuweisungen auf der linken Seite die
Angabe eines Teilfeldes, auch dann, wenn das Feld bis dahin
noch nicht definiert ist.
In den folgenden Beispielen wird zunächst ein 2*2 Feld erzeugt,
das den Namen A erhält. Durch die nachfolgende Wertzuweisung
wird ein weiteres zweidimensionales Feld mit Namen B erzeugt. Die
Gestalt dieses Feldes ergibt sich aus den in der Wertzuweisung
auftretenden maximalen Indices, B ist also ein 4*4 Feld. Die
Wertzuweisung legt die Werte nur für einen Teil der Elemente
fest, die anderen Elemente erhalten den Wert 0.
>>>>>>>>>>>>>>>
geht nur f&uer;r ein- und zweidimensionale Felder
>>>>>>>>>>>>>>>>
» A=eye(2)
A =
1 0
0 1
» B(3:4,3:4)=A
B =
0 0 0 0
0 0 0 0
0 0 1 0
0 0 0 1
» B(:,1:2,3:4) = A
??? Ambiguous or mismatched subscripted assignment.
» B(:,3:4)=A
B =
0 0 1 0
0 0 0 1
» C(:,:)=A
C =
1 0
0 1
» D(:,:,:)=A
D =
1 0
0 1
Verkettung von Feldern
Elimination von Feldelementen
Der Funktionsaufruf meshgrid(-8:0.5:+8) erzeugt dabei zwei
33*33 Matrizen mit x- bzw y-Koordinaten, die jeweils von -8.0 bis
+8.0 laufen, in X haben dabei alle Zeilen, in Y alle Spalten dieselben
Werte. Mit den beiden nächsten Anweisungen werden elementweise
die zugehöhrigen Z-Koordinaten berechnet.
Bei der graphischen Darstellung von Funktionen benötigt man
gelegentlich unregelmäßig gestaltete Koordinatenfelder,
etwa solche von der Gestalt eines L. Matlab kennt aber, wie die meisten
anderen Programmiersprachen auch, nur Felder, bei denen die Länge
einer Dimension immer unabhängig von den Index-Werten in den
anderen Dimensionen ist. Bei zweidimensionalen Feldern also nur
solche mit rechteckiger Gestalt. Spezielle Effekte sind aber mit Hilfe
von NaN-Werten möglich.
Beispiel 6.6
» [X,Y] = meshgrid(-8:0.5:+8);
» R = sqrt(X.^2+Y.^2)+eps;
» Z = sin(R)./R;
» Z(1:17,1:17) = NaN;
» colormap hot
» surf(X,Y,Z)
» shading interp
berechnet zunächst dieselben Funktionswerte wie in Beispiel 6.5,
danach werden jedoch die Werte von Z(1:17,1:17) gleich NaN
gesetzt. Die Matlab Graphik-Prozeduren stellen solche Werte einfach
nicht dar, was dazu führt, daß die Oberflächhe
aufgeschnitten wird und einen Blick in das Innere erlaubt.
Mit colormap hot und shading interp wird die Darstellung
der Funktionsoberfläche beeinflusst.
Skalare Expansion
Operationen, die zwei Operanden erfordern, lassen
sich elementweise nur dann für Felder definieren, wenn diese
dieselbe Gestalt haben.
Matlab lä&szlt;t dabei eine Ausnahme zu: Die Operation ist auch
dann möglich, wenn ein Operand ein Skalar, der andere ein Feld
ist. Der skalare Operand wird in diesem Falle zunächst zu einem
Feld expandiert, das seine Gestalt vom anderen Operanden, seine
Elementwerte aber vom Skalar erbt.
» M=[2 4; 10 5];
» N=2*M+10
N =
14 18
30 20
Beispiel 6.5:
Bei der Lösung linearer Differentialgleichungen treten sogenannte
Ortskurven auf, von denen man die Amplitude und Phasenverschiebung
der Lösungskurve ablesen kann.
Die Ortskurve
ist gegeben durch:
» omega=0:100;
» Z=1./(2i*omega+1);
» plot(real(Z),imag(Z))
Bei der Darstellung dieser Ortskurve taucht das Problem auf, daß
das Parameterfeld Omega am Anfang viel zu grob, am Ende unnötig
fein ist. Wir wählen deshalb ein Parameterfeld, bei dem die
Parameterwerte am Anfang näher zusammenliegen als am Ende:
» omega=0.0:0.1:0.9;
» omega=[ omega 1+10*omega 10+100*omega ];
» Z=1./(2i*omega+1);
» plot(real(Z),imag(Z))
Felder und Ablaufstrukturen