# Funkce, řešení rovnic

## Funkce

Pro definování funkcí používáme operátor :=.

f(x):=x^2;

f(2);f(y);

Vypsání seznamu uživatelem definovaných funkcí

functions;

Vypsání definice uživatelem definované funkce

fundef(f);

Ekvivalentní způsob zápisu pomocí define

define(g(x), x^3);

g(3);

functions;

solve(f(x)=9,x);

Rozdíl mezi operatorem := a funkcí define

f1(x):=print(x)$

define(f2(x), print(x))$

V případě ":=" zůstávají obě strany nevyhodnoceny. V případě použití define je pravá
strana vyhodnocena.

fundef(f1);

fundef(f2);

f1(5);

f2(5);

f(x):=x^3;

fp(x):=diff(f(x),x);

fp(1);

Chybové hlášení je vyvoláno operací diff(f(1),1), nejdříve se provede substituce
hodnoty za proměnnou a teprve poté výpočet derivace.

define(fd(x), diff(f(x), x));

fd(1);

Funkce více proměnných

f(x,y):=x^3-3*x*y^2;

f(3,2);

Definování funkce jako posloupnosti výrazů

f(x):= (a: x^2+4, b: x^3+3*x, 2/a+b/a+b^2);

f(t);

f(2);

f(x):= (a: x^2+4, b: x^3+3*x, ratsimp(2/a+b/a+b^2));

f(t);

unit_step(1);unit_step(0);unit_step(-1);

wxplot2d(unit_step(x),[x,-2,2],[y,-1,2]);

Definování po částech spojité funkce

f1(x):=(if x<1 then -1 elseif x=1 then 0 else 1);

wxplot2d(f1(x),[x,-1,2],[y,-2,2]);

f1(%pi);

sgn(n):=(if integerp(n)=true then (-1)^n else print(n, "neni integer"));

sgn(%pi);

sgn(4);

Rekurzivní definice

L(n):=(if n=1 then 1 elseif n=2 then 3 else L(n-1)+L(n-2))$

L(20);

trace(L);

L(4);

untrace(L);

L[n]:=(if n=1 then 1 elseif n=2 then 3 else L[n-1]+L[n-2])$

L[20];

arrays;

arrayinfo(L);

showtime:true$

L(21);

L[21];

showtime:false$

Spočtené hodnoty jsou ukládány do pole a v případě potřeby nejsou opětně počítány.
Pro výpočet L[21] je tedy potřeba jen jeden krok.

kill(all);

Vytvoření funkce z výrazu

vzorec:(b^2*x^2*sin(b*x)-2*sin(b*x)+2*b*x*cos(b*x)*a*t)/b^3;

define(F(x,t), vzorec);

F(0,1);F(%pi/b,5);

Operace s funkcemi

f(x):=log(x)+1;g(y):=exp(y)-1;

f(z)+g(z);

f(z)*g(z);

f(g(z));

g(f(z));

Použití anonymní funkce 

kill(all);

functions;

f : lambda([x], x^2);

f(a);

f(2);

functions;

map(f, a+b+c);

map(lambda([x], x^2), a+b+c);

map(lambda([x], x^2), [1,2,3]);

## Rovnice

eqn:(x-1)*(x^2+x+1);

sol:solve(eqn,x);

Pokud rovnice obsahuje pouze jednu proměnnou, nemusíme druhý parametr zadávat.

sol: solve(eqn);

sol[1];sol[2];

ev(expand(eqn), sol[1]);ev(expand(eqn), sol[2]);

rov: x^3 - 4*x^2 + 6*x - 4 = 0;

solve(rov);

Pouze reálná řešení

algsys([rov],[x]), realonly:true;

Rovnice s parametrem

eqn:x^3+2*a*x^2+a*x=1;

solve(eqn,x);

Řešení nerovnic

load(solve_rat_ineq);

solve_rat_ineq(x^3+4*x^2+2*x-1>0);

Soustavy rovnic

s:solve([x+2*y=3, y+1/x=1], [x,y]);

ev([x+2*y=3, y+1/x=1],s[1]);

solve([y^2+1=x,x+2=y], [x,y]);

Příkaz linsolve slouží k řešení lineárních rovnic a jejich soustav

linsolve([y+x=1,x-2=3],[y,x]);

solve(sin(x)=1/2,x);

eqn :product(x-k,k,1,110);

solve(eqn,x);

eqn:x+x^(1/3)=-2;

solve(eqn, x);

Příliš mnoho řešení

eqn :sin(x)^3 -13/2*sin(x)^2 + 11*sin(x) = 4;

solve(eqn,x);

solve(eqn,sin(x));

solve(sin(x)=1/2,x);

r1:(x-1)^2/(x^2-1)=0;

solve(r1,x);

ev(r1,x=1);

Numerické řešení

r:x^7-2*x^6-4*x^5-x^3+x^2+6*x+4;

solve(r);

if numer#false then numer:false else numer:true;

solve(r);

Příkaz find_root slouží pro numerické řešení rovnic. První dva parametry jsou stejné
jako u příkazu solve, druhé dva určují krajní body intervalu, na kterém rovnici řešíme. 

find_root(r,x,-2,0);

find_root(r,x,0,2);

find_root(r,x,2,4);

allroots(r);

realroots(r);

load(mnewton);

mnewton(r,x,2);

mnewton(sin(x),x,0);

mnewton(sin(x),x,3);