Eine sehr kurze Einführung in Octave

angelehnt an die Matlab Einführung von Dr. Thomas Schramm
Rechenzentrum der Technischen Universität Hamburg-Harburg
WS03/04
Recht frei nach der Matlab Expo von Mathworks
 

Vorbemerkung: Diese Einführung gilt für die XP-Version von Octave.

Inhaltsübersicht

  1. Am besten man tut es
  2. Etwas systematischer..
  3. Wie einem Hilfe zuteil wird
  4. Matrixfunktionen mit Beispielen
  5. Skripte und Funktionen
  6. Beispiele aus der Numerik
  7. Grafik & Visualisierung

  1. Am besten man tut es

    In Octave können Zahlen sehr einfach eingegeben und berechnet werden. Z.B.

    (1003-29)/47
    ans = 20.7234  

    In diesem Dokument sind die Octave EINGABEN grün und die AUSGABEN blau dargestellt.

    Die Ausgabe wird in der Octavevariablen ans gespeichert. Der wichtigste Datentyp in Octave ist die Matrix (eine Zahl ist eine 1x1-Matrix). Matrizen können Variablen zugeordnet werden, z.B. die Magische-Dürer-Matrix:

    A=[16 3 2 13; 5 10 11 8; 9 6 7 12; 4 15 14 1]
    A =
        16  3  2 13
         5 10 11  8
         9  6  7 12
         4 15 14  1

     
    Bei der Eingabe werden die Zahlen in einer Zeile mit Blanks oder Kommta getrennt, die einzelnen Zeilen mit Semikolon. Um z.B. die Summe aller Elemente der ersten Spalte zu erhalten, geben wir

    A(1,1)+A(2,1)+A(3,1)+A(4,1)
    ans = 34

    ein. Viel schneller geht die Benutzung des Doppelpunkt-Operators (:). Z.B.

    1:4
    ans =
         1 2 3 4

     also finden wir das obige Ergebnis mit der sum-Funktion

    sum(A(1:4,1))
    ans =
          34

    Noch kürzer ist die automatische Nutzung des kleinsten und größten Indexes

    sum(A(:,1))
    ans = 34
        
    bzw. die Summation über alle Spalten auf einmal:

    sum(A)
    ans =
          34 34 34 34
     

    Um desgleichen mit den Zeilen zu veranstalten, benutzen wir einfach die transponierte Matrix:

    B=A'
    B =
            16  5  9  4
           3 10  6 15
           2 11  7 14
          13  8 12  1

    sum(B)
    ans =
          34 34 34 34

    Oder für die Diagonale mit dem diag-Kommando

    diag(A)
    ans =
          16
          10
           7
           1

    sum(diag(A))
    ans =
          34

    Wenn die Matrix um die Mittelachse gespiegelt wird ,können wir auch die Summe der Gegendiagonalen berechnen.

    B=fliplr(A)
    B =
        13  2  3 16
        8  11 10  5
        12  7  6  9
        1  14 15  4
     

    sum(diag(fliplr(A)))
    ans = 34     

    Magische Quadrate lassen sich im übrigen ganz einfach in Octave z.B. mit

    B=magic(4)
    B =
        16 2  3 13
        5 11 10  8
        9  7  6 12
        4 14 15  1

    erzeugen. Dies entspricht nicht ganz unserer Eingangsmatrix. Dies läßt sich leicht korrigieren:

    C=B(:,[1,3,2,4])
    C =
        16 3  2 13
        5 10 11  8
        9  6  7 12
        4 15 14  1

    Zurück zur Inhaltsübersicht

     

  2. Etwas systematischer..

    Als Matrix-Element kann jeder gültiger Octaveausdruck verwendet werden:

    x=[-1.3 sqrt(3) (1+2+3)*4/5]
    x =
        -1.3000 1.7321 4.8000

    Auf Matrixelemente wird mit der Angabe des Indexes in Klammern zugegriffen

    x(4)=42
    x =
        -1.3000 1.7321 4.8000 0 42.0000

    (Beachten Sie, daß x(4) vorher noch nicht definiert war!)

    Komplexe Zahlen werden einfach mit einem i oder j als imaginärer Einheit eingegeben. Z.B.:

    A=[1 2 ;3 4]+i*[5 6; 7 8]
    A =
        1.0000 + 5.0000i 2.0000 + 6.0000i
        3.0000 + 7.0000i 4.0000 + 8.0000i

     
    Z.B. finden wir für die bekannte Euler-Formel

    exp(i*(1+i))
    ans = 0.1988 + 0.3096i

    und

    cos(1+i)+i*sin(1+i)
    ans = 0.1988 + 0.3096i

    Wie erwartet ;-)

    Zurück zur Inhaltsübersicht

     

  3. Wie einem Hilfe zuteil wird, man aufräumt und man andere Informationen erhält:

    Am einfachsten benutzt man das help-Kommando. Z.B.

    help sum
    Sum is a built-in function

     - Built-in Function:  sum (X, DIM)
         Sum of elements along dimension DIM.  If DIM is
         omitted, it defaults to 1 (column-wise sum).

       Overloaded function

       gsum(galois,...)     spsum(sparse,...)
       spsum(complex_sparse,...)

    Additional help for built-in functions, operators, and variables
    is available in the on-line version of the manual.  Use the command
    `help -i <topic>' to search the manual index.

    Help and information about Octave is also available on the WWW
    at http://www.octave.org and via the help-octave@bevo.che.wisc.edu
    mailing list.


    Um sich den Zustand der definierten Variablen und Funktionen anzusehen, kann man das who bzw. whos-Kommando benutzen.

    who
    *** dynamically linked functions:
        dispatch

    *** currently compiled functions:
        columns  fliplr   magic    mod

    *** local user variables:
        A  B  C  x
     

    whos
    *** dynamically linked functions:

    prot  type                       rows   cols  name
    ====  ====                       ====   ====  ====
     r--  dynamically-linked function      -      -  dispatch

    *** currently compiled functions:

    prot  type                       rows   cols  name
    ====  ====                       ====   ====  ====
     rwd  user-defined function         -      -  columns
     rwd  user-defined function         -      -  fliplr
     rwd  user-defined function         -      -  magic
     rwd  user-defined function         -      -  mod

    *** local user variables:

    prot  type                       rows   cols  name
    ====  ====                       ====   ====  ====
     rwd  complex matrix                2      2  A
     rwd  matrix                        4      4  B
     rwd  matrix                        4      4  C
     rwd  matrix                        1      4  x


    Um alle definierten Variablen zu löschen geben wir

    clear all

    ein,  um nur eine Varibale zu löschen, wird z.B.

          clear x

          eingegeben.

         Zurück zur Inhaltsübersicht


  1. Matrixfunktionen

    In Octave sind grundsätzlich alle Rechenoperationen wie +-*/ und ^ für Matrizen definiert. Einige Beispiele:

    A=[1 2 3;4 5 6]; B=[0 1 2; 4 5 6];

    (Hier dient das Semikolon zwischen den Definitionen zum trennen der Eingaben und unterdrücken der Ausgaben.)

    C=A-B
    C =
        1 1 1
        0 0 0

    A*B'
    ans =
         8 32
        17 77

    A/B
    ans =
        0.7500 0.2500
        0.0000 1.0000

    A\B
    ans =
        2.0000  1.5000 1.0000
        0       0      0
       -0.6667 -0.1667 0.3333

    Hierbei entspricht der /-Operator der Rechts- und der \-Operator der Links-Division. D.h. das Ergebnis von X=B/A entspricht der Lösung der Gleichung X*A=B und X=A\B der Gleichung A*X=B .
    Die Matrix-Links-Divison A\B ist immer definiert, wenn B soviele Zeilen hat wie A. Für die Rechts-Divison gilt A/B=(B'/A')' . Für über- bzw. unterbestimmte Systeme wird dann ein Ausgleichsverfahren (Least Squares) angewendet.

    D=[1,2,3;3,5,6;7,8,9]
    D =
        1 2 3
        3 5 6
        7 8 9

    D^2
    ans =
        28  36  42
        60  79  93
        94 126 150

    x=[1 2 3]; y=[4 5 6]';
    x*y
    ans = 32

    b=x*D
    b = 30 36 42

    Wird eine komponentenweise Multiplikation, Division oder Exponentation gewünscht, ist der Operation ein Punkt (.) voranzustellen.

    A.*B
    ans =
         0  2  6
        16 25 36

    A./B
    ans =
        Inf    2.0000 1.5000
        1.0000 1.0000 1.0000

    D.^2
    ans =
        1  4  9
        9 25 36
       49 64 81

    Für Matrizen sind viele weitere Funktionen, wie Eigenwerte (eig) , LU-Zerlegung (lu), Matrix-Exponential (expm), usw. definiert. Für dünn besetzte große Matrizen (sparse) gibt es in Octave spezielle Verfahren, die sehr viel Speicher und Rechenzeit sparen.

    Zurück zur Inhaltsübersicht

     

  2. Skripte und Funktionen

    Skripte sind einfache ASCII-Textfiles, die Octavebefehle enthalten. Zeilen, denen ein %-Vorangestellt ist, werden als Kommentar verarbeitet. Aus einer Octave-Session heraus kann das Skript durch Aufrufen des Dateinmens aufgerufen werden. Das Standardverzeichnis, aus dem die abgespeicherten Dateien gelesern werden können ist ~\octave_files. Temporär kann das Arbeitsverzeichnis mit dem Befehl cd dir oder chdir dir geändert werden.

    Ein gültiges Skript wäre z.B:

    %fibscript.m
    %Fibonacci-Zahlen
    f=[1 1]; n=1;
    while f(n) + f(n+1)<80
          f(n+2)=f(n)+f(n+1);
          n=n+1;
    end;
    f

    Dieses Textfile sollte dann unter dem Namen fibscript.m abgespeicht werden.

    !Achtung Windows-Editoren neigen dazu ein nicht sichtbares ".txt" an die Datei anzuhängen. Man vergewissere sich mit der rechten Maustaste und "Eigenschaften" und benutze ggf. den Befehl "umbenennen", um das ".txt" zu entfernen.

    Ausgeführt wird das Skript mit

    fibscript
    f =
        1 1 2 3 5 8 13 21 34 55

    Eleganter ist allerdings die Formulierung mit Hilfe einer Funktion. Diese könnte so aussehen:

    function f=fibfun(n)
    %FIBFUN berechnet die n-te Fibonacci Zahl
    if n>2
        f=fibfun(n-1)+fibfun(n-2);
        else
        f=1;
    end;
    end;

    Die Funktion wird unter dem Namen fibfun.m  abgespeichert.
    Hinweis:
      Der Funktionsname (erste Zeile) muss identisch dem Dateinamen sein, unter dem die Funktion abgespeichert wird.
    Jetzt können wir die 10-te Fibonacci-Zahl einfach mit

    fibfun(10)
    ans =  55

    aufrufen. Ein Hilfesystem wird durch die Kommentar-Zeile gleich mitgeliefert:

    help fibfun
    FIBFUN berechnet n-te Fibonacci Zahl

    Zurück zur Inhaltsübersicht

     

  3. Beispiele aus der Numerik - Insbesondere Polynome

    Polynome werden in Octave sehr einfach durch die Angabe des Koeffizientenvektors definiert., z.B. wird das Polynom y=x3-30x+30 in Octave mit

    p=[1 0 -30 30 ];

    dargestellt. Jetzt muß noch ein Wertebereich für x definiert werden:

    x=[-8:0.1:8];

    (-8 bis 8 mit der Schrittweite 0.1). Die Funktionswerte y bekommen wir dann (alle auf einmal) mit der Funktion polyval :

    y=polyval(p,x);

    Das kann geplottet werden:

    plot(x,y) 



    Nullstellen finden wir mit roots :

    x0=roots(p) 
    x0 =
        -5.92167
         4.88447
         1.03719

    Test:

    polyval(p,x0)
    ans =
        1.0e-013 *
        0.42109
       -0.21316
        0.03553

    Zurück zur Inhaltsübersicht

     

  4. Grafik & Visualisierung

    Octave benutzt zur grafischen Darstellung gnuplot. Sämtliche gnuplot-Operationen können angewendet werden. Octave kennt viele Befehle zur Visualisierung von Daten. Die plot-Funktion haben wir bereits kennen gelernt. Es gibt eine besondere Funktion, um Funktionen zu plotten, die noch keinen definierten Wertebereich haben.

    fplot('sin',[-pi pi])

     

    Die Funktion muß in Apostrophs eingeschlossen sein. Bei einem etwas komplizierterem Beispiel und schalten wir noch das Gitter ein:

    grid on
    fplot('sin(x)+exp(-x)',[0 12])

     

     
    Für die Visualisierung von Matrizen als 3-dimensionale Daten definieren wir uns einen Wertebereich mit der meshgrid-Funktion:

    [x,y]=meshgrid(-3:1/8:3);

    Jetzt kann x bzw. y in einer Formel wie eine normale Variable verwendet werden. Z.B. der Eierkarton

    z=sin(x).*cos(y);

    Alls Sammlung von 2-D Kurven

    plot(z)



    Oder als Kontur-Plot

    contour(z)



    Oder als Fläche im Raum

    surf(z)

    Oder als Kombination von Kontur- und Flächenplot

    surfc([-3:1/8:3],[-3:1/8:3],z)

      

    Es gibt viele weitere Plotfunktionen und –Optionen, sehen Sie sich die entsprechenden Hilfen z.B. zu
    plot3, pcolor, mesh, image usw. an

    Zurück zur Inhaltsübersicht