Funkce, řešení rovnic
1 Funkce
Pro definování funkcí používáme operátor :=.
| (%i1) | f(x):=x^2; |
| (%i2) | f(2);f(y); |
Vypsání seznamu uživatelem definovaných funkcí
| (%i4) | functions; |
Vypsání definice uživatelem definované funkce
| (%i5) | fundef(f); |
Ekvivalentní způsob zápisu pomocí define
| (%i6) | define(g(x), x^3); |
| (%i7) | g(3); |
| (%i8) | functions; |
| (%i9) | solve(f(x)=9,x); |
Rozdíl mezi operatorem := a funkcí define
| (%i10) | f1(x):=print(x)$ |
| (%i11) | define(f2(x), print(x))$ |
V případě ":=" zůstávají obě strany nevyhodnoceny. V případě použití define je pravá
strana vyhodnocena.
| (%i12) | fundef(f1); |
| (%i13) | fundef(f2); |
| (%i14) | f1(5); |
| (%i15) | f2(5); |
| (%i16) | f(x):=x^3; |
| (%i17) | fp(x):=diff(f(x),x); |
| (%i18) | 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.
| (%i19) | define(fd(x), diff(f(x), x)); |
| (%i20) | fd(1); |
Funkce více proměnných
| (%i21) | f(x,y):=x^3-3*x*y^2; |
| (%i22) | f(3,2); |
Definování funkce jako posloupnosti výrazů
| (%i23) | f(x):= (a: x^2+4, b: x^3+3*x, 2/a+b/a+b^2); |
| (%i24) | f(t); |
| (%i25) | f(2); |
| (%i26) | f(x):= (a: x^2+4, b: x^3+3*x, ratsimp(2/a+b/a+b^2)); |
| (%i27) | f(t); |
| (%i28) | unit_step(1);unit_step(0);unit_step(-1); |
| (%i31) | wxplot2d(unit_step(x),[x,-2,2],[y,-1,2]); |
Definování po částech spojité funkce
| (%i32) | f1(x):=(if x<1 then -1 elseif x=1 then 0 else 1); |
| (%i33) | wxplot2d(f1(x),[x,-1,2],[y,-2,2]); |
| (%i34) | f1(%pi); |
| (%i35) | sgn(n):=(if integerp(n)=true then (-1)^n else print(n, "neni integer")); |
| (%i36) | sgn(%pi); |
| (%i37) | sgn(4); |
Rekurzivní definice
| (%i38) | L(n):=(if n=1 then 1 elseif n=2 then 3 else L(n-1)+L(n-2))$ |
| (%i39) | L(20); |
| (%i40) | trace(L); |
| (%i41) | L(4); |
| (%i42) | untrace(L); |
| (%i43) | L[n]:=(if n=1 then 1 elseif n=2 then 3 else L[n-1]+L[n-2])$ |
| (%i44) | L[20]; |
| (%i45) | arrays; |
| (%i46) | arrayinfo(L); |
| (%i47) | showtime:true$ |
| (%i48) | L(21); |
| (%i49) | L[21]; |
| (%i50) | 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.
| (%i51) | kill(all); |
Vytvoření funkce z výrazu
| (%i1) | vzorec:(b^2*x^2*sin(b*x)-2*sin(b*x)+2*b*x*cos(b*x)*a*t)/b^3; |
| (%i2) | define(F(x,t), vzorec); |
| (%i3) | F(0,1);F(%pi/b,5); |
Operace s funkcemi
| (%i5) | f(x):=log(x)+1;g(y):=exp(y)-1; |
| (%i7) | f(z)+g(z); |
| (%i8) | f(z)*g(z); |
| (%i9) | f(g(z)); |
| (%i10) | g(f(z)); |
Použití anonymní funkce
| (%i11) | kill(all); |
| (%i1) | functions; |
| (%i2) | f : lambda([x], x^2); |
| (%i3) | f(a); |
| (%i4) | f(2); |
| (%i5) | functions; |
| (%i6) | map(f, a+b+c); |
| (%i7) | map(lambda([x], x^2), a+b+c); |
| (%i8) | map(lambda([x], x^2), [1,2,3]); |
2 Rovnice
| (%i9) | eqn:(x-1)*(x^2+x+1); |
| (%i10) | sol:solve(eqn,x); |
Pokud rovnice obsahuje pouze jednu proměnnou, nemusíme druhý parametr zadávat.
| (%i11) | sol: solve(eqn); |
| (%i12) | sol[1];sol[2]; |
| (%i14) | ev(expand(eqn), sol[1]);ev(expand(eqn), sol[2]); |
| (%i16) | rov: x^3 - 4*x^2 + 6*x - 4 = 0; |
| (%i17) | solve(rov); |
Pouze reálná řešení
| (%i18) | algsys([rov],[x]), realonly:true; |
Rovnice s parametrem
| (%i19) | eqn:x^3+2*a*x^2+a*x=1; |
| (%i20) | solve(eqn,x); |
Řešení nerovnic
| (%i21) | load(solve_rat_ineq); |
| (%i22) | solve_rat_ineq(x^3+4*x^2+2*x-1>0); |
Soustavy rovnic
| (%i23) | s:solve([x+2*y=3, y+1/x=1], [x,y]); |
| (%i24) | ev([x+2*y=3, y+1/x=1],s[1]); |
| (%i25) | solve([y^2+1=x,x+2=y], [x,y]); |
Příkaz linsolve slouží k řešení lineárních rovnic a jejich soustav
| (%i26) | linsolve([y+x=1,x-2=3],[y,x]); |
| (%i27) | solve(sin(x)=1/2,x); |
| (%i28) | eqn :product(x-k,k,1,110); |
| (%i29) | solve(eqn,x); |
| (%i30) | eqn:x+x^(1/3)=-2; |
| (%i31) | solve(eqn, x); |
Příliš mnoho řešení
| (%i32) | eqn :sin(x)^3 -13/2*sin(x)^2 + 11*sin(x) = 4; |
| (%i33) | solve(eqn,x); |
| (%i34) | solve(eqn,sin(x)); |
| (%i35) | solve(sin(x)=1/2,x); |
| (%i36) | r1:(x-1)^2/(x^2-1)=0; |
| (%i37) | solve(r1,x); |
| (%i38) | ev(r1,x=1); |
Numerické řešení
| (%i39) | r:x^7-2*x^6-4*x^5-x^3+x^2+6*x+4; |
| (%i40) | solve(r); |
| (%i41) | if numer#false then numer:false else numer:true; |
| (%i42) | 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.
| (%i43) | find_root(r,x,-2,0); |
| (%i44) | find_root(r,x,0,2); |
| (%i45) | find_root(r,x,2,4); |
| (%i46) | allroots(r); |
| (%i47) | realroots(r); |
| (%i48) | load(mnewton); |
| (%i49) | mnewton(r,x,2); |
| (%i50) | mnewton(sin(x),x,0); |
| (%i51) | mnewton(sin(x),x,3); |