Octave

Webb-sida: GNU-Octave

Referenslitteratur:

Vad r Octave

GNU Octave is

Starta octave

Frn 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

imaginra komponenter anges med i (eller j, I eller J)
octave:9> k = sqrt(-1)
k =  0 + 1i
octave:10> k * k
ans = -1
Semicolon stnger 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 anvndning:
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)           % hmta 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

Skalr 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'  % skalr produkt av v med sig sjlv
ans =  14
octave:6> v * u'  % skalr 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 jmnt 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

Lsa och if-sats

File exempel.m starta frst octave skriv sedan exempel
% Presentera programmet.
printf('************************************\n');
printf(' Programmet avgr om ett inlst tal \n');
printf(' r positivt, negativt eller noll   \n');
printf('************************************\n\n');

% Frga anvndaren efter ett tal och ls in det.
tal = input('Ange ett heltal: ');

% Kontollera talet och skriv ut rtt 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:
Berkna frsta 10 vrden 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:
Berkna frsta 100 vrden 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
    • Drfr mste file laddas med source kommandot.
  • Filen mste brja med 1; (enligt dokumentationen)
  • Om filen innehller en funktion (med brjan p frsta raden) och filen har samma namn med ett tillagt suffix .m som funktionen behver den inte laddas.
    • e.g. function ff1() i fil ff1.m
    • Frutsatt 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;
% lser in tre vrden
function [a,b,c] = readabc()
a = input("a = ");
b = input("b = ");
c = input("c = ");
end

Resultat frn exekveringen av fregende 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 frn fregende 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

Jmfr while sats med until sats

while (condition) % S lnge condition r sant
      body        % upprepas body
endwhile          % end eller endwhile

do
   body            % body upprepas
until (condition)  % s lnge condition r falskt, dock minst en gng



% Evig vntan:
ColdHell = 0;
do
 disp("\n\tVnta lite\n");
until (ColdHell)

switch statement

Formen:
switch tal
   case vrde 1
      satsgrupp 1  % Om tal har vrde 1 utfrs stasgrupp 1
   case vrde 2
      satsgrupp 2  % Om tal har vrde 2 utfrs stasgrupp 2
      . . .
   case vrde n    % Om tal har vrde n utfrs stasgrupp n
      satsgrupp n
   otherwise       % I annat fall utfrs satsgrupp.
      satsgrupp
end

switch exempel

Formen:
mynt = input('Valr: ');
switch mynt
  case {0.5, 1}
     disp('Femtioring eller enkrona')
  case 5
     disp('Femkrona')
  case 10
     disp('Tiokrona')
  otherwise
     disp('Inmatade valrer ska vara 0.5, 1, 5, eller 10')
end

Ngra bermda 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