Funkce - odlišnost od výrazu

Definice funkce f jedné proměnné a její použití.  

>    f:=x->x^2;

f := proc (x) options operator, arrow; x^2 end proc

Vyčíslení gunkce v bodě.

>    f(1);

>    f(2);

1

4

Z funkce vytvoříme výraz uvedením parametrů.

>    f(z);

z^2

Z výrazu vytvoříme funkci pomocí funkce unapply .

>    y; #výraz

>    funkce:=unapply(y,x);  #funkce jednoho parametru

sin(x)

funkce := proc (x) options operator, arrow; sin(x) end proc

Samozřejmě lze definovat funkci více proměnných, v nnásledujícím příkladě dvou.

>    modul:=(x,y)->sqrt(x^2+y^2);

modul := proc (x, y) options operator, arrow; sqrt(x^2+y^2) end proc

>    modul(3,4);

5

Je nutno rozlišovat výraz a funkci.

Z funkce se při výstupu vypíše jen jméno, její definici dostaneme pomocí eval .

>    y;

>    funkce;

>    eval(funkce);

sin(x)

funkce

proc (x) options operator, arrow; sin(x) end proc

Do funkce jednoduše dosadíme, do výrazu to takto nejde (tam bychom museli použít nař. zmíněný příkaz subs ).

>    funkce(Pi/2);

>    y(Pi/2);

1

sin(x)(1/2*Pi)

Funkci lze definovat jako proceduru.

>    g:=proc(x) x^3 end proc;

g := proc (x) x^3 end proc

>    g(5);

125

To je výhodné zejména pro složitější funkce.

>    h:=proc(x)

>      if x>0 then

>        x^2;

>      else

>        0;

>      end if;

>    end proc;

h := proc (x) if 0 < x then x^2 else 0 end if end proc

>    h(5);

>    h(-5);

25

0

Pro další usnadnění práce se hodí příkazy applyop  (aplikování funkce na část výrazu).

>    eval(f);

>    v;

>    applyop(f,2,v);

proc (x) options operator, arrow; x^2 end proc

x+z^2

x+z^4

Na závěr ukažme ještě jednu možnost definice funkce. Tou bude druhá odmocnina, kde však funkce bude vracet desetinné číslo.

>    evalf(sqrt(2));

1.414213562

Vytvoření nové funkce pro odmocninu

>    Sqrt:=evalf@sqrt;

>    Sqrt(2);

Sqrt := `@`(evalf,sqrt)

1.414213562

Použití funkce ukažme ještě na následujícím příkladu, kdy použijeme příkaz map  - aplikování funkce postupně na všechny části.

Vytvoření seznamu číslem

>    data:=[1,2,3,4,5];

data := [1, 2, 3, 4, 5]

Chceme spočítat odmocninu postupně všech členů proměnné data , ale toto nefunguje.

>    Sqrt(data);

Error, (in evalapply) invalid input: sqrt expects its 1st argument, x, to be of type algebraic, but received [1, 2, 3, 4, 5]

Musíme použít příkaz map .

>    map(Sqrt,data);

[1., 1.414213562, 1.732050808, 2., 2.236067977]

Použití výše definované funkce f (druké mocniny) na seznam.

>    eval(f);

>    map(f,data);

proc (x) options operator, arrow; x^2 end proc

[1, 4, 9, 16, 25]