Tutorial: GNU Octave und Gnuplot

Werbung
TECHNISCHE
UNIVERSITÄT
MÜNCHEN
Tutorial: GNU Octave und Gnuplot
Angewandte
Mechanik
Robert Huber, Jan Clauberg
Prof. Dr.- Ing. habil.
Hei n z Ul b r i c h
22. Oktober 2008
Inhaltsverzeichnis
1 Grundlagen
1.1 Was ist Octave? . . . . . . . . . . . . . . . . . . . .
1.2 Sinn dieses Tutorials . . . . . . . . . . . . . . . . .
1.3 Allgemeine Befehle und Konventionen . . . . . . .
1.4 Interaktive Eingabe, Funktions- und Skriptdateien
1.5 Umgang mit Variablen und Operatoren . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
2
2
2
2
2
3
2 Vektoren und Matrizen
2.1 Definition von Vektoren . . . . . . . . . . . . . . .
2.2 Definition von Matrizen . . . . . . . . . . . . . . .
2.3 Zugriffsmöglichkeiten auf Matrizen . . . . . . . . .
2.4 Erzeugung von Submatrizen . . . . . . . . . . . . .
2.5 Elementweises rechnen mit Matrizen und Vektoren
2.6 Spezielle Matrizen erzeugen . . . . . . . . . . . . .
2.7 Weitere Matrixoperationen . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
4
4
5
5
6
6
3 Lineare Systeme
3.1 Lösen von linearen Gleichungssystemen . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Weitere Funktionen und Eigenwertberechnung . . . . . . . . . . . . . . . . . . . . . .
6
6
6
4 Funktionen in Octave
4.1 Definiton und Aufruf von Funktionen . . . . . .
4.2 Kontrollstrukturen in Octave . . . . . . . . . .
4.2.1 FOR und WHILE . . . . . . . . . . . .
4.2.2 Verzweigungen mittels IF und SWITCH
4.2.3 Verschachtelung von Funktionen . . . .
4.2.4 globale Variablen . . . . . . . . . . . . .
4.2.5 Speichern, Einlesen und Ausgabe . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
7
7
7
7
8
9
9
10
5 Grafische Ausgabe
5.1 2 dimensionale graphische Ausgabe .
5.1.1 Der plot-Befehl . . . . . . . .
5.1.2 Parameter für den Befehl plot
5.2 3 dimensionale Ausgabe . . . . . . .
5.3 Graphen speichern . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
10
10
10
11
12
13
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6 Differentialgleichungen
13
6.1 DGL 1. Ordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
6.2 DGL 2. Ordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
6.3 DGL-System 2. Ordnung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1
1
Grundlagen
1.1
Was ist Octave?
Octave ist eine Scriptsprache zur numerischen Lösung mathematischer Probleme, wie z.B. Gleichungssysteme und Differentialgleichungen. Zur Plotausgabe verwendet Octave Gnuplot, welches
in der Octaveinstallation beinhaltet ist.
Das Programm ähnelt stark dem kommerziellen Programm Matlab, sodass man problemos beide
Programme verwenden kann, ohne neue Befehle zu lernen.
1.2
Sinn dieses Tutorials
Dieses Tutorial soll eine kleine Einführung in das Arbeiten mit Octave und Gnuplot darstellen.
Anhand von Beispielen wird die Handhabung Schritt für Schritt erläutert. Eingaben in Octave
werden folgendermaßen dargestellt:
>> Eingabe
Ausgaben werden folgendermaßen dargestellt:
Ausgabe
1.3
Allgemeine Befehle und Konventionen
• help listet alle Befehle und internen Variablen auf
• help name gibt Hilfe zu der Variablen oder zu dem Befehl name aus
• ; trennt mehrere Befehle in einer Zeile und unterdrückt die Ausgabe von Werten
• , trennt mehrere Befehle in einer Zeile, unterdrückt die Ausgabe von Werten jedoch nicht
• ... am Zeilenende bedeutet, dass der Befehl in der nächsten Zeile fortgeführt wird
• Octave unterscheidet zwischen Groß- und Kleinschreibung
• % leitet einen Kommentar ein
• who zeigt alle definierten Variablen und Funktionen an
• whos zeigt alle definierten Variablen und Funktionen mit näheren Informationen an
• type name gibt die Variable oder Funktion name aus
• clear name löscht die Variable oder Funktion name
• clear all löscht alle Variablen und Funktionen
1.4
Interaktive Eingabe, Funktions- und Skriptdateien
Ocatve bietet zwei Möglichkeiten Befehle entgegenzunehmen.
Befehle können direkt in das Octave-Fenster eingegeben werden, wie z.B.
>> a = 2+3
a = 5
Befehle können jedoch auch als Skriptdatei abgespeichert werden. Die Skriptdatei muss dabei die
Dateierweiterung .m besitzen. In Octave kann diese Skriptdatei dann einfach durch Eingabe des
Dateinamen (ohne die Erweiterung) ausgeführt werden.
2
Für eine Funktionsdatei erstellt man mit einem text Editor eine Datei und speichert sie als Funktion.m ab. Funktion stellt den Namen der Funktion dar. Die Datei sollte genauso benannt werden
wie die Funktion in der Datei. Aufgerufen wird die Funktionsdatei ebenfalls über diesen Namen.
Gespeichert wird die Datei im Arbeitsverzeichnis von Octave (Voreinstellung: \Octave files).
Beispiel:
Folgende Funktion ist in einer Datei mit dem Namen Fun1.m gespeichert:
function y = Fun1(x)
y=x∧2; end
Nun kann man die Funktion in Octave z.B. mit dem Wert 3 aufrufen. Das Ergebnis der Funktion
speichern wir in der Variable a:
>> a=Fun1(3)
a = 9
Selbstverständlich kann man die Funktion auch durch die Eingabe
>> Fun1(3)
aufrufen. Der Wert wird dann in die Variable ans gespeichert, in der immer das letzte errechnete
Ergebnis gespeichert ist.
ans = 9
Alternativ zur Speicherung als *.m-File kann der Code zur Definition einer Funktion auch direkt
in das Octave-Fenster eingegeben werden.
1.5
Umgang mit Variablen und Operatoren
• variable = wert weist der Variablen variable den Wert wert zu.
• Octave kennt eine große Anzahl an Standardfunktionen und Operatoren wie cos, sin, +, -, *,
/, ∧ , exp, acos, asin, atan, usw.
2
Vektoren und Matrizen
2.1
Definition von Vektoren
Vektoren lassen sich in Octave auf drei verschiedene Weisen eingeben.
1. Als Zeilenvektor: ~v = (1, 2, 3)
>> v=[1,2,3] oder v=[1 2 3]
v = 1 2 3


1
2. Als Spaltenvektor: ~v =  2 
3
>> v=[1;2;3]
1
v= 2
3
Ein Spaltenvektor kann problemlos in einen Zeilenvektor und ein Zeilenvektor problemlos in
3
einen Spaltenvektor umgewandelt werden. Dazu verwendet man den Post-Operator ’ in Octave (bei komplexen Vektoren erzeugt der Operator den konjugiert komplexen transponierten
Vektor):
>> u = v’
u = 1 2 3
3. Octave kann auch automatisch einen Vektor mit einem bestimmten Inkrement erzeugen: v =
[Anfangswert:Inkrement:Endwert]
>> v = [1:0.1:2]
v = 1 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2.0
2.2
Definition von Matrizen
Matrizen lassen sich wie folgt eingeben:


1 2 3
Beispiel: A =  4 5 6 
7 8 9
>> A =
1
A = 4
7
[1
2
5
8
2 3; 4 5 6; 7 8 9] oder A=[1,2,3;4,5,6;7,8,9]
3
6
9
Ähnlich wie bei Spalten- und Zeilenvektoren kann man in Octave auch Matrizen mit dem PostOperator ’ transponieren (auch hier erzeugt der Operator bei komplexen Matrizen die konjugiert
komplexe transponierte Matrix).
Zum Beispiel:
>> A = [1 2; 3 4]
A =
1 2
3 4
>> B = A’
B =
1 3
2 4
Matrizen können auch aus Teilmatrizen zusammengesetzt
werden.
1 2
5 6
Zum Beispiel sollen die 2x2 Matrizen A =
und B =
zu einer 2x4 Matrix C
3 4
7 8
zussammengesetzt werden.
>> C=[A B]
A =
2.3
1 2
3 4
5 6
7 8
Zugriffsmöglichkeiten auf Matrizen
In Octave ist ebenfalls ein Zugriff auf einzelne Elemente, Zeilen oder Spalten möglich.
4
• Zugriff auf einzelne Elemente: Mit dem Befehl A(2,1) kann beispielsweise in der 2. Zeile auf
das 1. Element zugegriffen werden.
• Zugriff auf einzelne Zeilen: Mit dem Befehl A(1,:) kann beispielsweise auf die 1. Zeile der
Matrix A zugegriffen werden.
• Zugriff auf einzelne Spalten: Mit dem Befehl A(:,1) kann beispielsweise auf die 1. Spalte der
Matrix A zugegriffen werden.
Neben dem Zugriff auf einzelne Elemente, Zeilen und Spalten ist auch
 die Zuweisung
 von Elementen,
1 2 3
Zeilen und Spalten möglich. Zum Beispiel soll in der Matrix A =  4 5 6  die zweite Spalte
7 8 9


11
durch den Spaltenvektor ~v =  12  ausgetauscht werden.
13
>> A = [1 2
>> v = [11;
>> A(:,2) =
1 11
A = 4 12
7 13
3; 4 5 6; 7 8 9];
12; 13];
v
3
6
9
Oder auf direktem Weg:
A(:,2) = [11; 12; 13]
2.4
Erzeugung von Submatrizen
Möchte man aus einer Matrix eine Teilmatrix entnehmen, lautet der Befehl A(a:b,c:d).
Die Funtkionsweise lässt sich gut an folgendem Beispiels erkennen:
>> A=[1 2 3 4; 5 6 7 8; 9 10 11 12];
>> B=A(2:3,3:4)
B =
2.5
7 8
11 12
Elementweises rechnen mit Matrizen und Vektoren
Neben der normalen Matrizen- und Vektorenrechnung kann Octave auch komponentenweise auf
Vektoren und Matrizen zugreifen.
kann
man
Den Unterschied
gut an folgendem Beispiel sehen: Es
1 2
5 6
seien die beiden Matrizen A =
und B =
gegeben.
3 4
7 8
Nun führt man die Multiplikation der Matrizen erst normal und dann komponentenweise durch.
>> A*B
19 22
A =
43 55
Es wurde wie man sieht eine normale Matrix/Matrix-Multipliaktion ausgeführt, also Zeile x Spalte.
Nun führt man die Multiplikation komponentenweise durch. Dazu setzt man einen Punkt vor den
Operator. Hier also .*
>> A.*B
5
A =
5 12
21 32
Nun wurde offensichtlich jedes Element der Matrix A mit dem selben Element von der Matrix B
multipliziert.
2.6
Spezielle Matrizen erzeugen
Für die Erzeugung einiger spezieller Matrizen bietet Octave bereits Befehle.
• ones(m,n) erzeugt eine Matrix der Dimension m x n mit Einsen
• zeros(m,n) erzeugt eine Matrix der Dimension m x n mit Nullen
• eye(m,n) erzeugt eine Matrix mit Einsen auf der Hauptdiagonalen. Im Falle von m=n ergibt
sich dabei die Einheitsmatrix.
2.7
Weitere Matrixoperationen
• diag(A) erzeugt aus den Elementen der Diagonale der Matrix A einen Spaltenvektor
• diag(v) erzeugt aus den Elementen des Vektors v eine quadratische Diagonalmatrix
• A(i,:) = [] löscht die i-te Zeile aus der Matrix A
• A(:,i) = [] löscht die i-te Spalte aus der Matrix A
3
Lineare Systeme
3.1
Lösen von linearen Gleichungssystemen
Eine elementare Funktion in Octave ist die Lösung von linearen Gleichungssystemen.
Der Befehl zur Lösung ist A\b. Octave löst das Gleichnungssystem mittels Gaußelimination. Falls
die Matrix nicht quadratisch ist, gibt Octave keine Fehlermeldung aus, sondern löst das zugehörige
Ausgleichsproblem mittels dem Prinzip der kleinsten Fehlerquadrate.
5 12
5
Als Beispiel soll das lineare Gleichungssystem
· ~x =
gelöst werden.
21 32
6
>> x = A\b
x =
3.2
−4.00000
−4.50000
Weitere Funktionen und Eigenwertberechnung
• inv(A) berechnet die Inverese Matrix von A
• eig(A) berechnet die Eigenwerte von A
• svd(A) berechnet die Singulärwerte von A
• [V,D] = eig(A) berechnet eine Diagonalmatrix D, die die Eigenwerte von A enthält und eine
Matrix V, die die zugehörigen Eigenvektoren enthält.
6
4
Funktionen in Octave
Wie bereits im Abschnitt 1.4 erläutert schreibt man Funktion in einem beliebigen Editor und
speichert sie dann als .m File. Wichtig im Vergleich zu Matlab ist, dass man in Octave in einem
.m-File auch mehrere Funktionen schreiben kann. Um jedoch eine gute Übersichtlichkeit und die
Kompatibilität zu Matlab zu gewährleisten, ist es ratsam, pro .m-File nur eine Funktion zu schreiben
und das File nach der Funktion zu benennen
Um erweiterte Funktionen schreiben zu können, sind Kontrollstrukturen von essentieller Bedeutung.
Die wichtigsten werden im Folgenden näher erläutert.
4.1
Definiton und Aufruf von Funktionen
Die Definition und der Aufruf von Funktionen lehnt sich stark an die Syntax von C an.
Als Beispiel wollen wir eine Funktion (stupid addition) definieren, die 3 Eingabewerte und 2 Ausgabewerte hat:
function [out1,out2] = stupid addition(x,y,z)
out1 = x;
out2 = x+y;
out3 = x+y+z;
end
Aufgerufen wird die Funktion mit folgendem Befehl, dabei werden die Werte 1,2,3 übergeben:
>> [erg1, erg2] = stupid addition(1,2,3)
erg1 = 1
erg2 = 3
Alternativ lässt sich in Octave eine Funktion auch mit dem Befehl feval(@Funktionsname, arg1,
arg2, ...) aufrufen. Dabei wird die Funktion mit @ übergeben. In unserem Beispiel also:
[erg1, erg2] = feval(@stupid addition,1,2,3)
erg1 = 1
erg2 = 3
4.2
Kontrollstrukturen in Octave
Ähnlich wie in den meisten Programmiersprachen kann man auch in Octave Kontrollstrukturen
programmieren. Zu ihnen gehören die Anweisungen ’FOR’, ’IF’ und ’WHILE’.
Die dazu meist benötigten grundlegenden logischen Operatoren sind:
<
==
∼
4.2.1
kleiner
gleich
nicht
>
<>
größer
ungleich
<=
&
kleiner gleich
und
>=
|
größer gleich
oder
FOR und WHILE
Mit diesen beiden Strukturen kann man Algorythmen eine bestimme Anzahl lang durchlaufen
lassen. Die Funktionsweise wird an folgendem Beispiel schnell deutlich:
Die Funktion soll alle Zahlen von 1 bis n addieren und zurückgeben. Als Eingabe erhält sie den
Wert des Parameters n.
7
function y = Addi(n)
y=0
for i=1:n
y=y+i;
end
>> Addi(3)
ans = 6
Wie man sieht wurde die Addition ans = 1 + 2 + 3 = 6 durchgeführt.
Die gleiche Funktion kann auch mittels der WHILE-Schleife programmiert werden:
function y = Addi(n)
y=0
i=0
while i<(n+1)
y=y+i;
i=i+1;
end
4.2.2
Verzweigungen mittels IF und SWITCH
Mittels dieser beiden Strukturen lassen sich Verzweigungen in Octave programmieren. Die Funktionsweise lässt sich auch hier wiederum am besten anhand zweier Beispiele erkennen:
Die Funktion soll entscheiden, ob der übergebene Parameter n gleich 6 oder ungleich 6 ist und dies
ausgeben.
function Ents(n)
if n==6
printf(’Der Parameter n hat den Wert 6’);
else
printf(’Der Parameter n hat einen Wert verschieden von 6’);
end
>> Ents(5)
Der Parameter n hat einen Wert verschieden von 6
Eine Erweiterung dieser Funktion wäre, dass die Funktion prüft, ob der Parameter n gleich 4,5,6
oder anderswertig ist. Diese Aufgabe lässt sich mit Hilfe der SWITCH Anweisung programmieren.
8
function Ents(n)
switch n
case 4;
printf(’Der
case 5;
printf(’Der
case 6;
printf(’Der
otherwise
printf(’Der
end
Parameter n hat den Wert 4’);
Parameter n hat den Wert 5’);
Parameter n hat den Wert 6’);
Parameter n hat einen Wert ungleich 4,5,6’);
>> Ents(4)
Der Parameter hat den Wert 4
4.2.3
Verschachtelung von Funktionen
In Octave lassen sich wie auch in anderen Programmiersprachen Funktionen verschachteln. Man
kann dies an den bereits verwendeten Funktionen zeigen. Mit der Anweisung >> Ents(Addi(3))
wird als erstes die Funktion Addi aufgerufen und 1,2 und 3 addiert und daraufhin geprüft, ob das
Ergebnis 4,5,6 oder anderswertig ist.
>> Ents(Addi(3))
Der Parameter hat den Wert 6
4.2.4
globale Variablen
Variablen, die in Funktionen verwendet werden sind lokale Variablen, d.h. sie sind nur innerhalb
der Funktion (z.B. innerhalb eines .m Files) verfügbar, aber nicht in Octave selbst. Wenn diese
Variablen jedoch auch nach der Ausführung der Funktion in Octave zur Verfügung stehen sollen,
dann müssen sie global definiert werden:
global Variable
Die Funktionsweise sieht man an folgendem Beispiel: Die Variable z wird in Octave global definiert
und soll mit der Funktion manipulate geändert werden. Die Funktion manipulate bekommt einen
Faktor übergeben, mit dem sie die globale Variable multiplizieren soll. Dazu ist es notwendig sowohl
in der Hauptfunktion (hier Octave), als auch in der Funktion manipulate die Variable z global zu
definieren.
Die Funktion manipulate:
function manipulate(x)
global z;
z=z*x;
Nun kann man in Octave ebenfalls die Variable z global definieren und einen Wert zuweisen: >>
global z >> z=5
Nun ruft man die Funktion manipulate mit dem Multiplikator 5 auf:
>> manipulate(5)
>> z
9
z=25
Man sieht also, dass die Funktion den Wert von z geändert hat, obwohl die Funktion an sich keinen
Rückgabevariable besitzt.
4.2.5
Speichern, Einlesen und Ausgabe
• Mit dem Befehl save(’Filename’, ’varname1’ [,’varname2’,’var2’]) wird die Variable
varname1 in die Datei Filename gespeichert.
• Möchte man die Variable wieder laden, lautet der Befehl load(’Filename’)
• Möchte man eine Ausgabe auf mehr Nachkommastellen, so lautet der Befehl format long,
möchte man weniger Nachkommastellen format short
• Die Ausgabe von Text und Variablen lehnt sich stark an die Syntax von C an.
Möchte man beispielsweise den Wert der Variable x (=25) als Satz ausgeben: ”Der Wert von
x ist 25”, dann lautet der Befehl:
>> fprintf(’Der Wert von x ist %g’, x)
Der Wert von x ist 25
Beispiel zum Speichern: Positions-File
Möchte man beispielweise die Position eines Körpers (nur x-Koordinate) zu verschiedenen Zeitpunkten t in einem pos.-File speichern, so würde der Befehl folgend lauten:
>> pos = [x t] (wobei x und t Spaltenvektoren sind)
>> save(’-ascii’,’0001.pos’,’pos’)
5
Grafische Ausgabe
Für die graphische Ausgabe verwendet Octave Gnuplot, das automatisch mit Octave mitinstalliert
ist.
5.1
5.1.1
2 dimensionale graphische Ausgabe
Der plot-Befehl
Der grundlegende Befehl lautet plot(x,y,options). Dabei ist x ein Vektor mit allen x-Werten, die
man plotten möchte und y ein Vektor mit den zugehörigen y-Werten. Mit Optionen können noch
zusätzlich unter anderem die Linienfarbe und die Linienart eingestellt werden.
Zum Plotten einer Funktion kann man meist auf dem selben Wege vorgehen. Als Beispiel soll die
einfache Funktion y = x2 geplotet werden.
1. Man erstellt einen Vektor mit der Anzahl an x-Werten, die man in seinem Plot haben möchte.
In unserem Beispiel sollen die x-Werte von -10 bis 10 gehen, in einer Schrittweite von 0.1
Durch den Befehl length(x) kann man sich anzeigen lassen, wieviele Elemente der Vektor
10
hat, in unserem Fall 201.
>> x=[-10:0.1:10]
2. Nun muss man die zugehörigen Funktionswerte im Vektor y abspeichern. Besonders wichtig
ist hierbei, dass die Rechenoperation elementweise ablaufen muss, denn es handelt sich hierbei
ja um keine Matrix-/Vektor-Rechnung. Die Funktion kann selbstverständlich auch in einem
separaten m-File erstellt werden.
>> y=x.∧2
3. Nun kann man die Funktion mit plot plotten.
>> plot(x,y)
5.1.2
Parameter für den Befehl plot
• Einen Titel erzeugen: title(string)
• Beschriftung der x-Achse: xlabel(string)
• Beschriftung der y-Achse: ylabel(string)
• Zahlenbereich der Achsen: axis(v) mit v=[xmin, xmax, ymin, ymax, zmin, zmax]
• Gitternetz erzeugen: grid
• Graph neu berechnen: replot
• Alte Grafik löschen oder nicht: hold (wenn alte Grafik nicht gelöscht werden soll)
• plot(x,y,”b*”): erzeugt einen blauen Graphen aus Sternchen.
Diese Parameter können wir auf unser Beispiel anwenden:
11
plot(x,y,"b*")
title("Parabel")
xlabel("x-Werte")
ylabel("y-Werte")
grid
axis([-15,15,-5,150])
replot
5.2
3 dimensionale Ausgabe
Die Funktion [xx,yy]=meshgrid(x,y) erzeugt in Octave aus den Vektoren x und y Gitterdaten,
auf deren Basis dann die zugehörigen z-Werte berechnet werden müssen. Daraufhin werden die
Daten mit dem Befehl mesh(x,y,z)als 3-dimensionale Grafik dargestellt.
Als Beispiel soll ein Gitter für x = [-1,1] und y = [-2,2] erzeugt werden und darauf die Funktion
z = sin(x2 + 2 ∗ y 2 ) dargestellt werden:
>> x = -1:0.1:1
>> y = -2:0.1:2
>> [xx,yy]=meshgrid(x,y)
>> z = sin(xx.∧2+2*yy.∧2)
mesh(x,y,z)
Der Plot sieht dann folgendermaßen aus:
12
5.3
Graphen speichern
In Octave geplottete Grafiken lassen sich durch folgenden Befehl speichern:
print(’Name.eps’,’-deps’)
Speichert den aktuellen Plot in das Arbeitsverzeichnis von Octave.
6
Differentialgleichungen
Eine der wichtigsten Funktionen von Octave ist das Lösen von Differentialgleichungen. Dazu verwendet man meist den Integrator lsode (in Matlab werden meistens die Integratoren ode23 und
ode45 verwendet, die ebenfalls auf einer Runge-Kutta-Methode basieren).
Allgemein versteht man unter einer Differentialgleichung eine Gleichung, in der auch die Ableitungen derselben Funktion vorkommen.
Der Integrator lsode kann Gleichungen der Form
dx
dt
= f (x, t)
lösen mit der Anfangsbedingung:
x(t0 ) = x0
Gelöst werden prinzipiell nur Differentialgleichung oder Differentialgleichungssysteme 1. Ordnung.
Eine Beispiel für den Aufruf des Integrators lsode wäre:
>> x = lsode(’DGL’,x0,t)
Mit DGL wird dem Integrator die zu lösenden Differentialgleichung übergeben. DGL ist eine Octave Funktion, die die rechte Seite f (x, t) der Differentialgleichungen berechnet. x0 stellt den Anfangswert dar. Im Vektor t sind die diskreten Zeitpunkte, an denen die DGL gelöst werden soll
enthalten. Möchte man die Lösung auf dem Intervall [0;10] generieren, so hat man prinzipiell zwei
Möglichkeiten den Vektor t zu erstellen:
• Durch ein bestimmtes Inkrement: t=[0:0.1:10]
• Durch eine bestimmte Länge (Anzahl der Elemente) des Vektors: t=linspace(0,10,50)
Hier wird ein Vektor mit 50 Elementen erstellt.
Die Zeilen von x enthalten die berechneten Lösungen des Anfangswertproblems.
13
6.1
DGL 1. Ordnung
Als erstes Beispiel soll eine DGL 1. Ordnung mit Anfangswert betrachtet werden, die im Intervall
[0;10] gelöst werden soll.
Exponentielles Wachstum wird durch die DGL ẋ = x beschrieben.
Betrachtet wird das Anfangswertproblem mit x(to ) = x0 = 0.1
Zuerst erstellen wir eine Octave Funktion der DGL, die im nächsten Schritt dem Integrator lsode
übergeben werden kann.
function dx = EXP DGL(x,t)
dx = x;
Nun können wir die Differentialgleichung EXP DGL dem Integrator lsode übergeben. Als Intervall
für t verwenden wir [0,10] mit einem Inkrement von 0.1 .
>> t=[0:0.1:10]
>> x = lsode (’EXP DGL’,0.1,t)
Das nun im Vektor x gespeicherte Ergebnis der numerischen Lösung können wir als Plot darstellen:
>> plot(t,x)
Zusätzlich lässt sich mit Octave problemlos das Richtungsfeld der Differentialgleichung plotten:
function Richtungsfeld
x=0:0.5:5;
t=0:0.25:5;
for k=1:length(x)
for l=1:length(t)
DX(k,l)=EXP DGL(x(k),t(l));
DT(k,l)=1;
end
end
quiver(t,x,DT,DX);
14
6.2
DGL 2. Ordnung
Ähnlich wie im ersten Beispiel lassen sich auch Differentialgleichungen höherer Ordnung lösen. Als
Beispiel soll folgende DGL dienen:
ẍ +
M
L ẋ
+ 5x = 0
mit Anfangswerten x0 = 1 und ẋ0 = 1
Da Octave nur DGLs in der Form ẋ = f (x) verarbeiten kann, muss die DGL als System 1. Ordnung
geschrieben werden.
Es sei
x
~z =
ẋ
Daraus folgt das Gleichungssystem:
ż1 = z2
ż2 = − M
L z2 − 5z1
Dieses System muss nun in eine Octave Funktion implementiert werden:
function dz = DGL2(z,t)
M = 2;
L = 10;
dz = zeros(2,1);
dz(1) = z(2);
dz(2) = -(M/L)*z(2)-5*z(1);
Wie im ersten Beispiel kann die Funktion nun dem Integrator lsode übergeben und daraufhin der
zeitliche Verlauf der Ortskoordinate x = z1 geplottet werden:
15
>> t=linspace(0,1,100)
>> z = lsode(’DGL2’,[1;1],t)
>> plot(t,z(:,1))
Der Befehl >> plot(t,z(:,2)) zeigt den zeitlichen Verlauf der Geschwindikgeit ẋ = z2
Das Phasendiagramm kann wie folgt dargestellt werden:
>> plot(z(:,1),z(:,2))
16
6.3
DGL-System 2. Ordnung
1 2 ~
0 3 ~
1 0
Die Lösung eines System wie z.B.
ẍ +
ẋ +
~x = 0
3 4
8 7
0 5
| {z }
| {z }
| {z }
M
D
K
erfolgt in Analogie zum vorherigen Beispiel, der einzigste Unterschied ist nun, dass ~x und ~ẋ Vektoren sind.
Man setzt wiederum:


x1
 x2 

~z = 
 ẋ1 
ẋ2
Da nun ~x = [x1 ; x2 ] und ẋ = [ẋ1 ; ẋ2 ] aus jeweils zwei Komponenten bestehen, hat der Zustandsvektor ~z die Dimension 4.
Dies ergibt folgende Octave Funktion der DGL:
function dz = DGL3(z,t)
M
R
K
M
=
=
=
1
[1 2; 3 4];
[0 3; 8 7];
[1 0; 0 5];
= inv(M);
dz = zeros(4,1);
dz(1) = z(3);
dz(2) = z(4);
dz(3:4,1) = -M 1*R*z(3:4,1)-M 1*K*z(1:2,1);
>> t=linspace(0,1,100)
>> z = lsode(’DGL3’,[1,1,1,1],t)
>> plot(t,z(:,1)
17
7
Anhang - Linux-Befehlsreferenz
Terminal öffnen
In das home-Verzeichnis wechseln; Dieser Verzeichnis entspricht
/usr/users/laplace/praktXX (Achtung das Trennzeichen ist /)
In das Unterverzeichnis dir1 wechseln
In das Unterverzeichnis dir1/dir2 wechseln (Achtung das Trennzeichen ist /)
Verzeichnis newdir erstellen
Datei delme.txt löschen
Verzeichnis deldir mit allen Unterverzeichnissen und Dateien
löschen
Text-Editor starten
Octave starten; Zum Ausführen eines Octave-Skripts einfach den
Dateinamen des Skripts ohne .m eingeben
AMVis starten; AMVis sucht die Eingabedaten im aktuellen
Verzeichnis
MBSim starten und unter Verwendung von integrator.xml das
Modell test.xml simulieren
Dymola starten
Simpack starten
Passwort ändern; Altes Passwort eingeben, dann zweimal das neue
Passwort eingeben; Das Passwort wird nicht angezeigt, auch nicht
als ****; Das neue Passwort muss mindestens 8 Zeichen besitzen,
mindestens 1 Kleinbuchstabe, mindestens ein Großbuchstabe und
mindestens eine Ziffer!
firefox (Internet Browser) starten
18
Im Menü auf Terminal,
XTerm, Konsole, ... klicken
cd
cd dir1
cd dir1/dir2
mkdir newdir
rm delme.txt
rm -rf deldir
gedit
octave
amvis
mbsimxml integrator.xml
test.xml
dymola
simpack
passwd
firefox
Herunterladen