Octave

Webb-sida: GNU-Octave

Referenslitteratur:

Vad är Octave

GNU Octave is

Starta octave

Från kommandoraden
Avsluta
Exempel: eπi = -1
exp(i*pi)

ans = -1.0000e+00 + 1.2246e-16i

Format

Utskriftsformat och antal decimaler
format                  % ger 5 decimalsiffror (default)
format short            %     3
format long             %    15
format short e          % exponentform med  3 decimalsiffror
format long  e          % exponentform med 15 decimalsiffror
Exempel
octave:15> format long e
octave:16> 4/3
ans =  1.33333333333333e+00

Att notera

heltalsdivision:
octave:6> idivide(7,3,"fix")
ans =  2

Complexa Tal

imaginära komponenter anges med i (eller j, I eller J)
octave:9> k = sqrt(-1)
k =  0 + 1i
octave:10> k * k
ans = -1
Semicolon stänger av automatisk utskrift av resultat:
octave:1> k = sqrt(-1);
octave:2> k = k * k;
octave:3> printf("\n\tk=%12.6f\n\n", k);

        k=   -1.000000

Arrayer

Arrayer skapas automatiskt vid användning:
v = [1 2 3];
Element-åtkomst m.h.a. (runda) parenteser
v(2) = 527;
Notera:

Exempel array i octave

octave:6> v = [ 1 2 3];  % element separeras med mellanslag
octave:7> v(2)           % hämta element på position 2
ans =  2                 %
octave:8> v(2) = 527;    % Ändra element på position 2
octave:9> v(2)
ans =  527
octave:10> ans           % ans är en automatisk variabel
ans =  527
octave:11> v(1) = 2 * v(2); % Ändra element på position 1
octave:12> v(1)
ans =  1054

Matriser

Skapa matris; semikolon separerar raderna
octave:3> A = [11 12 13; 21 22 23; 31 32 33]
A =
   11   12   13
   21   22   23
   31   32   33
octave:4> A(3,2)
ans =  32
Transponering med ' operatorn
octave:5> A'
ans =
   11   21   31
   12   22   32
   13   23   33

Skalär produkt av vektorer

Transponering med ' operatorn
octave:1> v = [1 2 3];  % rad-vektor
octave:2> u = [1 5 7];
octave:3> v'            % v' är en kolumn-vektor

   1
   2
   3

octave:4> v       % v fortfarande rad-vektor

   1   2   3

octave:5> v * v'  % skalär produkt av v med sig själv
ans =  14
octave:6> v * u'  % skalär produkt av v med u
ans =  32

for satsen i octave

Formen:
Exempel: vektor med kvadrater
octave:7> for i = 1:7
> a(i) = i * i;
> end
octave:8> a
a =
    1    4    9   16   25   36   49

Funktion: Slumpa ental

Fil: slumpaEntal.m funktion: slumpaEntal()
function slumpaEntal()
% Slumpar fram ett ental
%  heltal mellan 0 och 9
%  och skriver ut det..
slumpTal = floor(10 * rand(1));
printf('\tEntalet blev %u\n', slumpTal);
På kommandoraden ger det:
octave:1> slumpaEntal
        Entalet blev 8
octave:2>

If sats i octave

Exempel: testa udda eller jämnt m.h.v. rest
octave:1> x=7
x =  7
octave:2>      if (rem (x, 2) == 0)
>        printf ("x is even\n");
>      else
>        printf ("x is odd\n");
>      endif
x is odd
octave:3>

If sats i octave

Generell form
     if (condition)
       then_body
     else
       else_body
     endif

Läsa och if-sats

File exempel.m starta först octave skriv sedan exempel
% Presentera programmet.
printf('************************************\n');
printf(' Programmet avgör om ett inläst tal \n');
printf(' är positivt, negativt eller noll   \n');
printf('************************************\n\n');

% Fråga användaren efter ett tal och läs in det.
tal = input('Ange ett heltal: ');

% Kontollera talet och skriv ut rätt text.
if tal > 0
        printf('Talet är positivt.\n');
elseif tal == 0
        printf('Talet är lika med noll.\n');
else
        printf('Talet är negativt.\n');
end

While sats i octave

Generell form
     while (condition)
       body
     endwhile

While sats i octave exempel med array

Fibonacci serien:
Beräkna första 10 värden i Fibonacci serien.

octave:1> fib = ones (1, 10);
octave:2>      i = 3;
octave:3>      while (i <= 10)
>        fib (i) = fib (i-1) + fib (i-2);
>        i++;
>      endwhile
octave:4> fib(10)
ans =  55
octave:5>
octave:12> fib
fib =

    1    1    2    3    5    8   13   21   34   55

Fibonacci serien med for-sats

Fibonacci serien:
Beräkna första 100 värden i Fibonacci serien.
octave:1> fib = ones (1, 2);
octave:2> fib
fib =
   1   1
octave:3>  for i = 3:100
> fib (i) = fib (i-1) + fib (i-2);
> endfor
octave:4> fib(100)
ans =  3.5422e+20
octave:5>

Exempel: flera funktioner i en fil

fil: ff.m
1;
function ff1()
printf('\t hej ff1\n');
end

function ff2()
printf('\t hej ff2\n');
end

Exekvera funktioner

Starta octave, ladda filen och anrop funktionerna:
octave:1> source("ff.m")
octave:2> ff1()
         hej ff1
octave:3> ff2()
         hej ff2

Notera att

  • Filnamnet är olikt funktionsnamnen
    • Därför måste file laddas med source kommandot.
  • Filen måste börja med 1; (enligt dokumentationen)
  • Om filen innehåller en funktion (med början på första raden) och filen har samma namn med ett tillagt suffix .m som funktionen behöver den inte laddas.
    • e.g. function ff1() i fil ff1.m
    • Förutsatt att filen liger i samma katalog som octave startades i.

Funktioner med parametrar

fil fun.m
1;
% funktion med en in- och en ut-parameter
function y = f(x)
 y = x * x;
end
Starta octave och sedan:
octave:1> source ("fun.m");
octave:2> a = f(5);
octave:3> a
a =  25

Funktioner med fler än en ut-parameter

fil funs.m
1;
% läser in tre värden
function [a,b,c] = readabc()
a = input("a = ");
b = input("b = ");
c = input("c = ");
end

Resultat från exekveringen av föregående exemplet:

Starta octave och:
octave:1> source ("funs.m");
octave:2> [d,e,f] = readabc();
a = 21   % Obs: endast talet 21 matades in!
b = 32
c = 43
octave:3> d
d =  21
octave:3> a
error: `a' undefined near line 6 column 1

Att notera från föregående exemplet:

do — until statement

Fil fib.m:
function a = fib(n)  % Returnerar array
 a = ones(1,2);
 i = 2;
 do
  i++;
  a(i) = a(i-1) + a(i-2);
 until (i == n);
end
Resultat i octave:
octave:1> a = fib(11)
a =

    1    1    2    3    5    8   13   21   34   55   89

Jämför while sats med until sats

while (condition) % Så länge condition är sant
      body        % upprepas body
endwhile          % end eller endwhile

do
   body            % body upprepas
until (condition)  % så länge condition är falskt, dock minst en gång



% Evig väntan:
ColdHell = 0;
do
 disp("\n\tVänta lite\n");
until (ColdHell)

switch statement

Formen:
switch tal
   case värde 1
      satsgrupp 1  % Om tal har värde 1 utförs stasgrupp 1
   case värde 2
      satsgrupp 2  % Om tal har värde 2 utförs stasgrupp 2
      . . .
   case värde n    % Om tal har värde n utförs stasgrupp n
      satsgrupp n
   otherwise       % I annat fall utförs satsgrupp.
      satsgrupp
end

switch exempel

Formen:
mynt = input('Valör: ');
switch mynt
  case {0.5, 1}
     disp('Femtioöring eller enkrona')
  case 5
     disp('Femkrona')
  case 10
     disp('Tiokrona')
  otherwise
     disp('Inmatade valörer ska vara 0.5, 1, 5, eller 10')
end

Några berömda citat

The question of whether computers can think is like the question of whether submarines can swim.
— Edsger W. Dijkstra
Computer Science is no more about computers than astronomy is about telescopes.
— M.R. Fellows and I. Parberry
Program testing can be used to show the presence of bugs, but never to show their absence!
— Edsger W. Dijkstra