GNU OCTAVE: Eine Einführung PD Dr. Markus Bause Universität Erlangen-Nürnberg Department Mathematik bause@am.uni-erlangen.de http://www.am.uni-erlangen.de/home/bause Wintersemester 2009/2010 Stand: 16. Oktober 2009 1 / 44
Installation Windows Gehen Sie zur WWW-Seite http://www.octave.org von GNU Octave und folgen Sie dem Link Download. Im Absatz Windows wählen Sie den Link Octave Forge und dann den Link Windows installer (Octave and Octave-Forge). Laden Sie setup-3.0.1-setup.exe oder das setup.exe einer aktuelleren stabilen Version herunter. Führen Sie setup-3.0.1-setup.exe aus. Wählen Sie als CPU-type im Zweifel den Eintrag Generic aus und führen Sie die Installation durch. Es empfiehlt sich eine Verknüpfung mit Octave auf dem Desktop zu erstellen. Starten Sie Octave über Start Alle Programme GNU Octave Octave oder über die Verknüpfung auf dem Desktop. Bemerkung: Die Standard-Installation von Octave erfordert Java, das Sie ggf. unter http://www.java.com/de/download erhalten. Markus Bause GNU Octave 2 / 44
Linux Viele Linux-Distributionen enthalten bereits Octave, so dass Sie das Octave-Paket von der Installions-DVD bzw. über einen Download direkt installieren können. Alternative: Gehen Sie zur WWW-Seite http://www.octave.org von GNU Octave und folgen Sie dem Link Download. Im Abschnitt Latest Release finden Sie die aktuelle Octave-Version. Speichern Sie octave-3.0.1.tar.gz bzw. eine aktuellere Version. Unzippen und entpacken Sie das File octave-3.0.1.tar.gz mit gunzip octave-3.0.1.tar.gz und tar -xvf octave-3.0.1.tar. Wechseln Sie in das Verzeichnis octave-3.0.1. Rufen Sie zunächst./configure auf (ggf. mit der Option --disable-readline). Compilieren Sie Octave durch den Aufruf von make. Sie können nun Octave mit dem Befehl octave starten. Es empfiehlt sich einen (Soft-)Link auf das Executable von Octave zu setzen. Markus Bause GNU Octave 3 / 44
Grundlagen Grundlagen Was ist Matlab/GNU Octave? Matlab MATLAB MATLAB R eine hochentwickelte Sprache für wissenschaftlichtechnische Berechnungen und eine interaktive Umgebung zur Algorithmen-Entwicklung, zur Visualisierung und Analyse von Daten sowie für numerische Berechnungen. MATRIX LABORATORY Produkt der Firma The MathWorks Inc. http://www.mathworks.com Octave ist auch eine interaktive Scriptsprache und weitgehend mit dem proprietären MATLAB kompatibel, im Gegensatz dazu jedoch freie Software. Unterschiede gibt es im Grafikbereich. http://www.octave.org Markus Bause GNU Octave 4 / 44
Grundlagen Matlab-Oberfläche Markus Bause GNU Octave 5 / 44
Grundlagen Octave-Shell (Kommandozeilen-Interface) Markus Bause GNU Octave 6 / 44
Grundlagen Im Folgenden werden die grundlegenden Strukturen und Befehle von GNU Octave beschrieben. Auf Besonderheiten und Unterschiede von Octave zu Matlab wird nicht eingegangen. Hierzu wird auf die Dokumentation von Octave/Matlab verwiesen. Hilfe und Dokumentation help listet alle Befehle und internen Variablen auf. help name gibt Hilfetext zur Variablen oder Funktion name aus. doc ruft das Menü der Octave Manual Pages auf. doc name gibt Dokumentation bzw. Menü der Octave Manual Pages zur Variablen oder Funktion name aus. Windows Standard-Installation: Pdf-Dokumentation (618 Seiten) im File C:\Programme\Octave\doc\PDF\octave.pdf. Beispiel: octave:1> help exit octave:1> doc graphics Markus Bause GNU Octave 7 / 44
Grundlagen Eingabekonventionen Alle Befehle können sowohl interaktiv, als auch über Script-Dateien eingegeben werden. Hierzu werden Octave Kommandos unter Verwendung eines Editors (z.b. edit oder emacs) in ein File (Script) geschrieben. Der Name dieses Files muss die Endung.m besitzen und vor dem Punkt einen Namen haben, der kein Octave-Kommando ist. Beispiel: prog1.m Ein Script wird durch Aufruf des Dateinamens ohne Suffix eingelesen und verhält sich so, als ob ihr Inhalt Zeile für Zeile eingegeben wird. Beispiel: octave:1> prog1 Die Variable path enthält die spezifizierten Suchpfade für Script-Dateien. Mit addpath( Pfadname ) kann ein neuer Suchpfad hinzugefügt werden. Mit savepath werden die Suchpfade für die nächste Sitzung gespeichert. Markus Bause GNU Octave 8 / 44
Grundlagen Beispiel (Linux): octave:1> addpath( /home/markus/octave/test ) octave:2> savepath Beispiel (Windows): Erzeuge das Verzeichnis C:\Dokumente und Einstellungen \Markus\Eigene Dateien\Octave\Mathe4IngIWS0809. Wechsele in das Verzeichnis (Tabulator-Taste verwenden!): octave-3.0.1-exe:1> cd C:\ octave-3.0.1-exe:2> cd Dokumente und Einstellungen\Markus\Eigene Dateien\Octave\Mathe4IngI WS0809 octave-3.0.1-exe:3> pwd ans = C:\Dokumente und Einstellungen\Markus\Eigene Dateien\Octave\Mathe4IngI WS0809 octave-3.0.1-exe:4> addpath(ans) octave-3.0.1-exe:5> savepath octave-3.0.1-exe:6> path Markus Bause GNU Octave 9 / 44
Grundlagen Das Semikolon ; trennt mehrere Befehle in einer Zeile und unterdrückt die Ausgabe von Werten. Das Komma, trennt Befehle in einer Zeile, gibt aber Werte aus. Drei Punkt... am Zeilenende bedeutet, dass der Ausdruck in der nächsten Zeile weitergeht. Kommentare werden mit % eingeleitet. Octave unterscheidet zwischen Groß- und Kleinschreibung. Octave wird mit quit oder exit beendet. Datei-Management Innerhalb von Octave können die Betriebssystembefehle ls, dir, pwd, cd, delete <Filename> verwandt werden. Markus Bause GNU Octave 10 / 44
Grundlagen Variablen und Standardoperationen varname = expression weist varname den Wert expression zu. Beispiel: octave:1> a=5; Es gibt die üblichen Funktionen +,,, /, ˆ, sin, cos, exp, acos, abs, usw. Die elementaren logischen Operationen sind: < kleiner <= kleiner oder gleich & und > größer >= größer oder gleich oder == gleich <> ungleich nicht Zur Diagnose von benutzerdefinierten Objekten gibt es: whos zeigt alle definierten Variablen und Funktionen (siehe unten). clear name löscht name aus dem Speicher. clear löscht alle Variablen und Funktionen aus dem Speicher. type name gibt die Variable/Funktion name am Bildschirm aus. Markus Bause GNU Octave 11 / 44
Grundlagen disp(varname) gibt den Wert von varname am Bildschirm aus. Beispiele 1 Das Script prog1.m mit Inhalt x=4; y=5; z=x+y liefert die Ausgabe octave:1> prog1 z = 9 Weiterhin liefert octave:2> whos *** local user variables: Prot Name Size Bytes Class ==== ==== ==== ===== ===== rwd x 1 1 8 double rwd y 1 1 8 double rwd z 1 1 8 double Markus Bause GNU Octave 12 / 44
Grundlagen 2 Andere Beispiele sind octave:1> x=1/8, str= Ein String x = 0.12500 str = Ein String octave:2> sqrt(-1)-i ans = 0 octave:3> x=sqrt(2); sin(x)/x ans = 0.69846 Hierbei ist i die imaginäre Einheit i = 1. Octave kann also mit komplexen Zahlen ( Abschnitt Grundlagen im Mathe-Skript) rechnen. Markus Bause GNU Octave 13 / 44
Vektor- und Matrizoperationen Vektor- und Matrizoperationen Matrizen und Vektoren ( Abschnitt Lineare Algebra im Mathe-Skript) sind die wichtigsten Grundbausteine zur Programmierung in Octave. Vektoren Zeilenvektor v = (1, 2, 3): v=[1,2,3] Spaltenvektor v = (1, 2, 3) : v=[1;2;3] Automatische Erzeugung von Vektoren mit konstantem Inkrement: Angang[:Inkrement]:Ende Beispiele octave:1> x=3:6 x = 3 4 5 6 octave:2> y=0:0.15:0.7 y = 0.00000 0.15000 0.30000 0.45000 0.60000 octave:3> z=pi:-pi/4:0 z = 3.14159 2.35619 1.57080 0.78540 0.00000 Markus Bause GNU Octave 14 / 44
Vektor- und Matrizoperationen Matrizen Eine Matrix A = octave:1> A=[1,2;3,4] A = 1 2 3 4 ( ) 1 2 wird erzeugt durch: 3 4 Matrizen können aus Teilmatrizen erzeugt werden: octave:2> b=[5;6]; octave:3> M=[A,b] M = 1 2 5 3 4 6 Zur Generierung wichtiger (m n)-matrizen existieren eigene Befehle. Falls m gleich n ist, muss nur ein Argument übergeben werden. Markus Bause GNU Octave 15 / 44
Vektor- und Matrizoperationen eye(m,n) erzeugt eine Matrix mit 1-ern auf der Hauptdiagonale. Im Spezialfall m = n ergibt sich die Einheitsmatrix. zeros(m,n) erzeugt eine Nullmatrix der Dimension (m n). rand(m,n) erzeugt eine Zufallsmatrix der Dimension (m n) mit gleichverteilten Einträgen. Für andere Verteilungen wird auf help randn verwiesen. Grundlegende Operationen +, - und bezeichnen Matrixaddition, -subtraktion und -multiplikation. A ist die zu A transponierte und konjugierte Matrix. A. ist die zu A transponierte Matrix. Markus Bause GNU Octave 16 / 44
Vektor- und Matrizoperationen Beispiele octave:1> A=[1,2;3,4]; B=2*ones(2,2); octave:2> A+B, A-B, A*B ans = 3 4 5 6 ans = -1 0 1 2 ans = 6 6 14 14 Markus Bause GNU Octave 17 / 44
Vektor- und Matrizoperationen Elementweise Operationen Während z.b. die standard Matrixmultiplikation bezeichnet, gibt es alle Operatoren mit vorangestelltem Punkt für elementweise Verknüpfung:.,./,.ˆ usw. Beispiele octave:1> A=[1,2;3,4]; A.ˆ2 % elementweise Potenz ans = 1 4 9 16 octave:2> Aˆ2 % matrixweise Potenz ans = 7 10 15 22 Markus Bause GNU Octave 18 / 44
Vektor- und Matrizoperationen Indizierung und Slicing v(k) ist das k-te Element des Zeilen- oder Spaltenvektors v. A(k,l) ist Matrixelement a kl. v(k:m) ist der Subvektor ( Slice ) des Vektors v vom k-ten bis zum m-ten Eintrag. A(k,:) ist die k-te Zeile der Matrix A. A(:,l) ist die l-te Spalte der Matrix A. Bestimmung der Größe: length(v) gibt die Länge des Vektors v zurück. [Zeilen,Spalten]=size(A) gibt die Anzahl der Zeilen und Spalten von A zurück. Markus Bause GNU Octave 19 / 44
Vektor- und Matrizoperationen Änderung der Gestalt: reshape(a,m,n) formt A in eine (m n)-matrix um. diag(a) liefert die Diagonale a jj der Matrix A. diag(v) erzeugt eine Matrix mit dem Vektor v auf der Hauptdiagonalen. diag(v,k) erzeugt eine Matrix mit dem Vektor v in der k-ten Nebendiagonalen. A(k,:) = zv weist der k-ten Zeile von A den Zeilenvektor zv zu. A(:,l) = sv weist der l-ten Spalte von A den Spaltenvektor sv zu. A(:,k) = [] löscht die k-te Spalte aus A. Markus Bause GNU Octave 20 / 44
Vektor- und Matrizoperationen Beispiele octave:1> A=[1,2,3;4,5,6]; v=[7;8]; octave:2> A(2,3)=v(2) A = 1 2 3 4 5 8 octave:3> A(:,2)=v A = 1 7 3 4 8 8 octave:4> A(1,1:2)=v A = 7 8 3 4 8 8 Markus Bause GNU Octave 21 / 44
Vektor- und Matrizoperationen Lösen linearer Gleichungssysteme A\b löst die Gleichung Ax = b. Falls A eine (n n)-matrix ist, wird Gauß-Elimination verwendet, sonst wird eine QR-Zerlegung durchgeführt und eine Lösung im Sinne der kleinsten Fehlerquadrate berechnet. Ist A schlecht konditioniert oder singulär, wird eine Warnung ausgegeben. Inverse, Zergungen, Eigenwerte, etc. B=inv(A) berechnet die Inverse von A. [L,U,P]=lu(A) berechnet die LU-Zerlegung PA = LU. [QR]=qr(A) berechnet die QR-Zerlegung A = QR. R=chol(A) berechnet die Cholesky-Zerlegung von A. S=svd(A) berechnet die Singulärwert-Zerlegung von A. H=hess(A) bringt A auf Hessenberg-Form. E=eig(A) berechnet alles Eigenwerte von A. Markus Bause GNU Octave 22 / 44
Vektor- und Matrizoperationen [V,D]=eig(A) berechnet eine Diagonalmatrix D, die die Eigenwerte von A enthält, und eine Matrix V mit den zugehörigen Eigenvektoren. Es gilt also AV = VD. norm(x,p) berechnet die p-norm des Vektors X. Falls X eine Matrix ist, kann p die Werte 1, 2 oder inf haben. Der Default-Wert ist 2. cond(a) berechnet die Konditionszahl von A in der 2-Norm. Viele dieser Befehle unterstützen weitere Optionen. Diese können mit help funcname erfahren werden. Test auf Nulleinträge [i,j,v]=find(a) findet die Indizes aller Elemente ungleich Null in A. Es gilt: A i(l),j(l) = v l 0. any(a) ist 1, falls A Elemente ungleich Null enthält. Bei Matrizen operiert any auf den Spalten. Markus Bause GNU Octave 23 / 44
Kontrollstrukturen Kontrollstrukturen Funktionen Funktionen (Octave: function) sind ebenfalls Textdateien mit Suffix.m. Im Unterschied zu einem Script können Funktionen mit Argumenten aufgerufen werden. Alle innerhalb der Funktion verwandten Variablen sind lokal (sie beeinflussen die vorher definierten Variablen nicht). Syntax function ausgabe = f(eingabe) <Anweisungen> end Hierbei sind ausgabe und eingabe Werte, Vektoren oder Matrizen und f ein eigener Funktionsname. Beispiel: [a,b]=myfunc(x,y) Markus Bause GNU Octave 24 / 44
Kontrollstrukturen Bemerkung Ocatve kann beliebig viele Funktionen in einer.m -Datei definieren. Matlab hingegen lässt strikt nur eine Funktion pro.m -Datei zu und der Funktionsname muss mit dem Dateinamen übereinstimmen. Dies kann aus Gründen der Übersichtlichkeit verwandter Funktionen sinnvoll sein. Beispiel function y = singrad(x) % Sinus mit Argument im Gradmass y = sin(pi*x/180); end Der Aufruf von singrad erfolgt durch octave:1> a=singrad(90) a = 1 Markus Bause GNU Octave 25 / 44
Kontrollstrukturen Alternativ kann der Aufruf von singrad auch aus einem Script testsingrad erfolgen. Die Datei testsingrad.m enthalte: % Script zum Test der Funktion singrad x=90; a=singrad(x) Der Aufruf erfolgt durch: octave:1> testsingrad a = 1 Globale Variablen global name deklariert name als globale Variable. Markus Bause GNU Octave 26 / 44
Kontrollstrukturen Beispiel function out=foo(in) global N % Verwende N als globale Variable <Anweisung> end Wird N in der Funktion verändert, ändert das auch den ursprünglichen Wert von N im workplace. Schleifen Syntax der for-schleife for k = AW:SW:EW <Anweisungen> end Hierbei ist k die Laufvariable, AW ihr Anfangswert, SW ihre Schrittweite und EW ihr Endwert. Markus Bause GNU Octave 27 / 44
Kontrollstrukturen Beispiel a=0; for k=0:2:10 a=a+2ˆk; end a Dieses Script berechnet 2 0 + 2 1 + 2 2 + 2 10. Syntax der Rückwärts-for-Schleife for k = 20:-1:10 <Anweisungen> end Markus Bause GNU Octave 28 / 44
Kontrollstrukturen Syntax der while-schleife while (<Bedingung>) <Anweisungen> end Beispiel t=0; T=10; h=1; while t<t t = t + h; end t Die Variable t besitzt am Ende den Wert 10. Markus Bause GNU Octave 29 / 44
Kontrollstrukturen Verzweigungen Syntax der if-anweisung if (< Bedingung >) <Anweisungen> else <Anweisungen> end Der else-anteil ist optional. Beispiel if (2+1<4) a=7 else a=6 end Markus Bause GNU Octave 30 / 44
Kontrollstrukturen Syntax der geschachtelten if-anweisungen if (<Bedingung>) if (<Bedingung>) if (<Bedingung>)... <Anweisungen>... end end end Markus Bause GNU Octave 31 / 44
Kontrollstrukturen Syntax der mehrseitigen if-anweisungen if (<Bedingung 1>) <Anweisungen 1> elseif (<Bedingung 2>) <Anweisungen 2>... else <Anweisungen n> end Der elseif- und der else-anteil ist optional. Markus Bause GNU Octave 32 / 44
Kontrollstrukturen Syntax der switch-anweisung switch <case-ausdruck> case <Fall 1> <Anweisungen 1> case <Fall 2> <Anweisungen 2>... otherwise <Anweisungen n> end Markus Bause GNU Octave 33 / 44
Kontrollstrukturen Beispiel switch monat case {4, 6, 9, 11} tage = 30; case {1, 3, 5, 7, 8, 10, 12} tage = 31; case 2 tage=28; otherwise tage=0; % Fehler end Markus Bause GNU Octave 34 / 44
Kontrollstrukturen Funktionen von Funktionen eval(string) wertet string als Octave-Code aus. Beispiel: eval( a = acos(-1); ); feval(funcname,arg1,...) ist äquivalent zum Aufruf von funcname mit den Argumenten arg1,... Beispiel Berechnung der Werte z 1 = f(x) + f(y) und z 2 = f(x) f(y) mit Übergabe der Funktion f(u) = u 3. Das Script-File prog2.m ist: x=2.0; y=1.0; % z1 = f(x)+f(y) und z2=f(x)-f(y) mit f(u)=uˆ3 [z1,z2] = myfunc(@mycube,x,y); % Ausgabe disp(sprintf( xˆ3+yˆ3: %17.8e,z1)); disp(sprintf( xˆ3-yˆ3: %17.8e,z2)); Markus Bause GNU Octave 35 / 44
Kontrollstrukturen Die Berechnung von z 1 und z 2 erfolgt in myfunc: function [z1,z2] = myfunc(f,x,y) z1=feval(f,x)+feval(f,y); z2=feval(f,x)-feval(f,y); % Es kann sogar auf feval verzichtet werden: % z1=f(x)+f(y); % z2=f(x)-f(y); end Die Funktion myfunc ist in myfunc.m gespeichert. Die Funktionsauswertung erfolgt in mycube: function y = mycube(u) y = u.ˆ3; end Die Funktion mycube ist in mycube.m gespeichert. Markus Bause GNU Octave 36 / 44
Kontrollstrukturen Einfache Funktionen Einfache Funktionen können auch mit Hilfe des Function-Handle @ direkt im Script-File spezifiziert werden ( doc handle). Beispiel: Das Script f=@(u,v) uˆ3*vˆ3; x=2; y=1; a=feval(f,x,y) b=f(x,y) liefert für a und b den Wert 8. Die Übergabe von f wird realisiert durch: f=@(u) uˆ3; x=2.0; y=1.0; [z1,z2] = myfunc(f,x,y); % Ausgabe disp(sprintf( xˆ3+yˆ3: %17.8e,z1)); disp(sprintf( xˆ3-yˆ3: %17.8e,z2)); Markus Bause GNU Octave 37 / 44
Kontrollstrukturen Bemerkung Schleifen und Funktionsaufrufe, insbesondere über feval, sind teuer. Daher sollten alle Operationen vektorisiert werden. Die Funktionen exp(), sin() etc. können auch auf Vektoren angewandt werden. Beispiel: Es ist effizienter x=1:1:10000; t=cputime; y=mycube(x); t1=cputime-t anstatt x=1:1:10000; t=cputime; for i=1:1:1000 y(i)=mycube(x(i)); end t1=cputime-t zu verwenden. Markus Bause GNU Octave 38 / 44
Kontrollstrukturen Ein- und Ausgabe save datei var1 [var2...] speichert die Variablen var1 usw. in der Datei datei ab. load datei liest die Datei datei. format [long short] vergrößert oder verkleinert die Anzahl der ausgegebenen Kommastellen. Der Aufruf ohne Argument stellt das Standardverhalten wieder her. fprintf(string[,var1,...]) und sprintf(string[,var1,...]) lehnt sich an die Syntax der Programmiersprache C an. Markus Bause GNU Octave 39 / 44
Grafik Grafik Im Folgenden werden nur einige wichtige Routinen kurz beschrieben. Für eine detaillierte Darstellung der umfrangreichen Möglichkeiten wird auf die Manual Pages von Octave verwiesen. 2D-Grafik plot(x,y[,fmt]) zeichnet eine Linie durch die Punkte (x i, y i ). Mit dem String fmt können Linienart und Farbe gewählt werden ( help plot). semilogx(x,y[,fmt]) funktioniert wie plot, die x-achse wird logarithmisch gezeichnet. semilogy(x,y[,fmt]) funktioniert wie plot, die y-achse wird logarithmisch gezeichnet. loglog(x,y[,fmt]) funktioniert wie plot, beide Achsen werden logarithmisch gezeichnet. Markus Bause GNU Octave 40 / 44
Grafik Beispiel x=-10:0.1:10; y=sin(x).*exp(-abs(x)); plot(x,y); grid; replot; 3D-Grafik [xx,yy]=meshgrid(x,y) erzeugt aus den Vektoren x und y Gitterdaten. mesh(x,y,z) zeichnet eine Fläche in 3D. Beispiel x=-2:0.1:2; [xx,yy]=meshgrid(x,x); z=sin(xx.ˆ2-yy.ˆ2); mesh(x,x,z); Markus Bause GNU Octave 41 / 44
Grafik Mit print können Grafiken in verschiedenen Formaten abgespeichert werden ( doc print). Befehle für 2D- und 3D-Grafiken title(string) schreibt string als Titelzeile in die Grafik. xlabel(string) beschriftet die x-achse mit string. ylabel(string) beschriftet die y-achse mit string. zlabel(string) beschriftet die z-achse mit string. axis(v) legt den Ausschnitt fest; v ist ein Vektor der Form v=(xmin,xmax,ymin,ymax[,zmin,zmax]). hold [on off] legt fest, ob die nächste Grafikausgabe die alte Grafik löschen soll. clg löscht das Grafikfenster. replot erzwingt eine erneute Ausgabe der aktuellen Grafik. Markus Bause GNU Octave 42 / 44
Matlab-Kurs UnivIS Matlab für Ingenieure [MLIng] VORL; 2 SWS; Mo/Di, 14:15 15:45 CIP Pool; Schäfer, F. Markus Bause GNU Octave 43 / 44
Viel Spass beim Arbeiten mit GNU Octave Markus Bause GNU Octave 44 / 44