Funkce v Maplu a reseni rovnic Funkce v Maplu > y:=x^2; :=y x2 > subs(x=2,y); 4 > eval(y, x=2); 4 Funkce muze byt zadana pomoci operatoru -> nebo jako procedura. > y:=x->x^2; :=y x x2 > y(2); 4 > y(t); t2 > whattype(eval(y)); procedure > whattype(y); symbol Vsimnete si rozdilu mezi: > print(y); x x2 > print(y(x)); x2 > y(0);y(1);y(2);y(c); 0 1 4 c2 > y; y Zde se vyhodnocuje pouze jmeno funkce. > eval(y); x x2 > y(t); t2 Zde se vyhodnocuje funkcni hodnota v t. Vsimnete se rozdilu mezi predchazejicim zadanim a nasledujicimi prikazy. > restart; > y(x):=x^2; :=( )y x x2 > y(x), y(0), y(1/c); , ,x2 ( )y 0 y 1 c > print(y); proc() end procoption ;remember ' '( )procname args Definovali jsme funkci, ale bez funkcniho predpisu. > y:=x->x^2; :=y x x2 > print(y); x x2 > infolevel[solve]:=1; :=infolevelsolve 1 > solve(y=9,x); solve: Warning: no solutions found > solve(y(x)=9,x); ,3 -3 Definovani funkce vice promennych: > f:=(x,y)->x^3-3*x*y^2; :=f ( ),x y -x3 3 x y2 > f(3,2); -9 > plot3d(f,-1..1,-1..1,numpoints=2500, style=patchcontour, axes=framed); ­1 ­0.5 0 0.5 1 ­1 ­0.5 0 0.5 1 ­2 ­1 0 1 2 Definovani po castech spojite funkce Pomoci vetveni. > Definujme nyni funkci, ktera ma hodnotu -1 pro realna cisla mensi jak 1, 0 pro hodnotu x=1 a 1 jinak. > step:=x-> if x<1 then -1 elif x=1 then 0 else 1 fi; step xproc( ):= option ;,operator arrow if then elif then else end if step(3/2), step(1), step(1/2); , ,1 0 -1 > plot(step, -1..Pi, discont=true, color=black, scaling=constrained); ­1 ­0.5 0 0.5 1 ­1 1 2 3 > step(Pi); Error, (in step) cannot determine if this expression is true or false: Pi < 1 Problem je v tom, ze Maple umi porovnavat pouze cisla typu integer, fraction a float. > step(1.1); 1 Dalsi nevyhodou tohoto zpusobu je to, ze nemuzeme provadet radu matematickych operaci - derivovat, integrovat, atd... Proto casteji pouzivame: > STEP:=x->piecewise(x<1, -1, x=1, 0, x>1, 1, 'procname'(x)); :=STEP x ( )piecewise , , , , , , STEP(3/2), STEP(1), STEP(1/2), STEP(Pi); , , ,1 0 -1 1 > STEP(u); -1 dsolve(diff(g(u),u)=STEP(u), g(u)); Linear: # equations 2 =( )g u { - +u _C1 f:=x->piecewise(x<=0, x, x>0, 1/x); :=f x piecewise , , ,x 0 x <0 x 1 x > f(0); 0 Definice funkce pomoci procedury: > sgn:=proc(n::integer) (-1)^n end proc: > sgn(Pi); Error, invalid input: sgn expects its 1st argument, n, to be of type integer, but received Pi > sgn(4); 1 Definice procedury ma obecne tuto syntaxi: proc(posloupnost parametru) [local posloupnost_jmen;] [options posloupnost_jmen;] prikazy end proc; U kazdeho parametru muze byt uvedeno, jakeho je typu. Obecne procedura vraci posledni pocitanou hodnotu. > y:=proc(x) x^2 end: > y(x), y(0), y(2); , ,x2 0 4 > whattype(%%); procedure > restart; Rekurse Rekursivni definici funkce nebo procedury budeme ilustrovat na vypoctu tzv. Lucasovych cisel Ln, ktere jsou definovany pomoci linearni rekurence: L(1)=1, L(2)=3, L(n)=L(n-1)+L(n-2) pro n>2. > L:=proc(n::posint) if n=1 then 1 elif n=2 then 3 else L(n-1)+L(n-2) fi end: > L(6); 18 > time(L(20)); 0.023 > profile(L): > L(6); 18 > showprofile(); function depth calls time time% bytes bytes% -------------------------------------------------------- ------------------- L 5 15 0.000 0.00 7048 100.00 -------------------------------------------------------- ------------------- total: 5 15 0.000 0.00 7048 100.00 > restart; Pro zefektivneni procedury pouzijeme option remeber, ktera zpusobi zapamatovani funkcnich hodnot tak, jak jsou pocitany. > LL:=proc(n::nonnegint) Lucas(n) end: Pri volani procedury LL se kontroluje typ argumentu, pokud je v poradku, vola se rekursivni definice Lucas (timto zamezime opetovnemu testovani argumentu) > Lucas:=proc(n) option remember; if n=1 then 1 elif n=2 then 3 else Lucas(n-1)+Lucas(n-2) fi end: Kazda mapleovska procedura je spojena s pametovou tabulkou, ktera se aktivuje pomoci option remember. Polozky tabulky jsu funkcni hodnoty, indexovane pomoci argumentu odpovidajicimu volani funkce. Pokud proceduru zavolame pomoci Lucas(n), Maple se podiva do tabulky, zda tam neni ulozena odpovidajici funkci hodnota. Pokud ne, vyvola se telo procedury a dvojice (n, Lucas(n)) se automaticky ulozi do pamaetove tabulky. > LL(6); 18 Pametova tabulka je dostupna jako ctvrty operand procedury. > op(4, eval(Lucas)); table([ , , , , , ])=1 1 =2 3 =3 4 =5 11 =4 7 =6 18 Odstraneni pametove tabulky: > subsop(4=NULL, eval(Lucas)): > op(4, eval(Lucas)); > profile(Lucas): > LL(6); 18 > showprofile(); function depth calls time time% bytes bytes% -------------------------------------------------------- ------------------- Lucas 5 9 0.000 0.00 5048 100.00 -------------------------------------------------------- ------------------- total: 5 9 0.000 0.00 5048 100.00 > time(Lucas(300)); 0.042 > restart; > Lucas:=proc(n) Lucas(n):=Lucas(n-1)+Lucas(n-2) end: > Lucas(1):=1: Lucas(2):=3: > op(4, eval(Lucas)); table([ , ])=1 1 =2 3 > Lucas(5): op(4, eval(Lucas)); table([ , , , , ])=1 1 =2 3 =3 4 =5 11 =4 7 Pomoci prikazu forget muzeme odstranit jednu nebo vsechny hodnoty z Pomoci prikazu forget muzeme odstranit jednu nebo vsechny hodnoty z pametove tabulky: > forget(Lucas, 3): > op(4, eval(Lucas)); table([ , , , ])=1 1 =2 3 =5 11 =4 7 > forget(Lucas): > op(4, eval(Lucas)); UNAPPLY Tento zpusob definovani funkce je vyhodny zejmena tehdy, pokud z nejakeho vyrazu ci formule chceme udelat funkci > vzorec:=(b^2*x^2*sin(b*x)-2*sin(b*x)+2*b*x*cos(b*x)*a* t)/b^3; :=vzorec - +b2 x2 ( )sin b x 2 ( )sin b x 2 b x ( )cos b x a t b3 > F:=unapply(vzorec, x, t); :=F ( ),x t - +b2 x2 ( )sin b x 2 ( )sin b x 2 b x ( )cos b x a t b3 > F(0,1),F(Pi/b,5); ,0 - 10 a b3 Jine pokusy selhavaji > vzorec; - +b2 x2 ( )sin b x 2 ( )sin b x 2 b x ( )cos b x a t b3 > F:=(x,t)->%; :=F ( ),x t % > F(0,1); > G:=(x,t)->vzorec; :=G ( ),x t vzorec > F(u,v),G(u,v); - +b2 x2 ( )sin b x 2 ( )sin b x 2 b x ( )cos b x a t b3 Jedinou moznosti je jeste: > H:=subs(telo=vzorec, (x,t)->telo); :=H ( ),x t - +b2 x2 ( )sin b x 2 ( )sin b x 2 b x ( )cos b x a t b3 > H(u,v); - +b2 u2 ( )sin b u 2 ( )sin b u 2 b u ( )cos b u a v b3 Operace s funkcemi > f:=x->ln(x)+1; g:=y->exp(y)-1; :=f x +( )ln x 1 :=g y -ey 1 > h:=f+g: h(z); +( )ln z ez > h:=f*g: h(z); ( )+( )ln z 1 ( )-ez 1 > h:=f@g: h(z); +( )ln -ez 1 1 > h:=g@f: h(z); -e ( )+( )ln z 1 1 > simplify(%); -z e 1 > (f@@4)(z); #ekvivalent k f(f(f(f(z)))) +( )ln +( )ln +( )ln +( )ln z 1 1 1 1 Anonymni funkce > map(x->x^2, a+b+c); + +a2 b2 c2 > map(x->x+2, [1,2,3]); [ ], ,3 4 5 Reseni rovnic > eqn:=(x-1)*(x^2+x+1); :=eqn ( )-x 1 ( )+ +x2 x 1 > sol:=solve(eqn,x); :=sol , ,1 - + 1 2 1 2 I 3 - - 1 2 1 2 I 3 > subs(x=sol[2], eqn); - + 3 2 1 2 I 3 + + - + 1 2 1 2 I 3 2 1 2 1 2 I 3 > expand(%); 0 > eval(eqn, x=sol[3]); - - 3 2 1 2 I 3 + - - - 1 2 1 2 I 3 2 1 2 1 2 I 3 > expand(%); 0 > eqn:=x^3+2*a*x^2+a*x=1; :=eqn =+ +x3 2 a x2 a x 1 > solve(eqn, x); ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 6 6 - 1 3 a 4 9 a2 ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 2 a 3 - - , ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 12 - 3 - 1 3 a 4 9 a2 ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 2 a 3 1 2 I 3 + - + ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 6 6 - 1 3 a 4 9 a2 ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 + , ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 12 - 3 - 1 3 a 4 9 a2 ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 2 a 3 1 2 I 3 + - ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 6 6 - 1 3 a 4 9 a2 ( )+ - +72 a2 108 64 a3 12 - - + +84 a3 12 a4 108 a2 81 ( )/1 3 + > > solve({x+2*y=3, y+1/x=1}, {x,y}); ,{ },=x -1 =y 2 { },=x 2 =y 1 2 > eqns:={x+2*y=3, y+1/x=1}; :=eqns { },=+x 2 y 3 =+y 1 x 1 > soln:=solve(eqns, {x,y}); :=soln ,{ },=x -1 =y 2 { },=x 2 =y 1 2 > soln[1]; { },=x -1 =y 2 > soln[2]; { },=x 2 =y 1 2 > eval(eqns, soln[1]); { },=1 1 =3 3 > solve({x^2=y^2}, {x,y}); ,{ },=x -y =y y { },=x y =y y Reseni je mozne omezit specifikaci omezujicich nerovnic > solve({x^2=y^2, x<>y},{x,y}); { },=x -y =y y > solve({y^2+1=x, x+2=y},{x,y}); ,=y ( )RootOf ,+ -_Z2 3 _Z =label _L1 =x - +2 ( )RootOf ,+ -_Z2 3 _Z =label _L1{ } > allvalues(%); ,{ },=y + 1 2 1 2 I 11 =x - + 3 2 1 2 I 11 { },=y - 1 2 1 2 I 11 =x - - 3 2 1 2 I 11 Nerovnosti > solve(x^3+4*x^2+2*x-1>0, x); , RealRange , Open - - 3 2 13 2 ( )Open -1 RealRange , Open - + 3 2 13 2 > solve(x^3+4*x^2+2*x-1>0, {x}); ,{ },<- - 3 2 13 2 x restart; Maple nevraci vsechna reseni: > solve(sin(x)=1/2,x); 6 > _EnvAllSolutions := true: > solve(sin(x)=1/2, x); + + 1 6 2 3 _B1~ 2 _Z1~ > map(about,indets(%, name)): Pi: is assumed to be: Pi Originally _Z1, renamed _Z1~: is assumed to be: integer Originally _B1, renamed _B1~: is assumed to be: OrProp(0,1) > indets(%%); { },_Z1~ _B1~ > eqn := product(x-k,k=1..110); eqn ( )-x 1 ( )-x 2 ( )-x 3 ( )-x 4 ( )-x 5 ( )-x 6 ( )-x 7 ( )-x 8 ( )-x 9 ( )-x 10:= ( )-x 11 ( )-x 12 ( )-x 13 ( )-x 14 ( )-x 15 ( )-x 16 ( )-x 17 ( )-x 18 ( )-x 19 ( )-x 20 ( )-x 21 ( )-x 22 ( )-x 23 ( )-x 24 ( )-x 25 ( )-x 26 ( )-x 27 ( )-x 28 ( )-x 29 ( )-x 30 ( )-x 31 ( )-x 32 ( )-x 33 ( )-x 34 ( )-x 35 ( )-x 36 ( )-x 37 ( )-x 38 ( )-x 39 ( )-x 40 ( )-x 41 ( )-x 42 ( )-x 43 ( )-x 44 ( )-x 45 ( )-x 46 ( )-x 47 ( )-x 48 ( )-x 49 ( )-x 50 ( )-x 51 ( )-x 52 ( )-x 53 ( )-x 54 ( )-x 55 ( )-x 56 ( )-x 57 ( )-x 58 ( )-x 59 ( )-x 60 ( )-x 61 ( )-x 62 ( )-x 63 ( )-x 64 ( )-x 65 ( )-x 66 ( )-x 67 ( )-x 68 ( )-x 69 ( )-x 70 ( )-x 71 ( )-x 72 ( )-x 73 ( )-x 74 ( )-x 75 ( )-x 76 ( )-x 77 ( )-x 78 ( )-x 79 ( )-x 80 ( )-x 81 ( )-x 82 ( )-x 83 ( )-x 84 ( )-x 85 ( )-x 86 ( )-x 87 ( )-x 88 ( )-x 89 ( )-x 90 ( )-x 91 ( )-x 92 ( )-x 93 ( )-x 94 ( )-x 95 ( )-x 96 ( )-x 97 ( )-x 98 ( )-x 99 ( )-x 100 ( )-x 101 ( )-x 102 ( )-x 103 ( )-x 104 ( )-x 105 ( )-x 106 ( )-x 107 ( )-x 108 ( )-x 109 ( )-x 110 > nops({solve(eqn,x)}); 110 > _MaxSols:=100; :=_MaxSols 100 > nops({solve(eqn,x)}); 100 > _MaxSols:=200; :=_MaxSols 200 > nops({solve(eqn,x)}); 110 > eqn:=x+x^(1/3)=-2; :=eqn =+x x ( )/1 3 -2 > solve(eqn, x); > infolevel[solve]:=2; :=infolevelsolve 2 > solve(eqn, x); solve: Warning: no solutions found Realne reseni x=-1 nebylo nalezeno. > restart; > solve(sin(x)=3*x/Pi, x); ( )RootOf -3 _Z ( )sin _Z > evalf(%); 0. > plot(sin(x)-3*x/Pi, x=-Pi/4..Pi/4); ­0.04 ­0.02 0.02 0.04 ­0.6 ­0.4 ­0.2 0.2 0.4 0.6 x Prilis mnoho reseni > eqn := sin(x)^3 -13/2*sin(x)^2 + 11*sin(x) = 4; :=eqn =- +( )sin x 3 13 2 ( )sin x 2 11 ( )sin x 4 > solve({eqn},{x}); , ,{ }=x 6 { }=x ( )arcsin 2 { }=x ( )arcsin 4 > solve(eqn,sin(x)); , , 1 2 2 4 > solve(sin(x)=1/2,x); 6 > rl:=(x-1)^2/(x^2-1)=0; :=rl = ( )-x 1 2 -x2 1 0 > solve(rl); 1 > subs(x=1, rl); Error, numeric exception: division by zero K hledani numerickeho reseni pouzivame prikazu fsolve. > r:=x^7-2*x^6-4*x^5-x^3+x^2+6*x+4; :=r - - - + + +x7 2 x6 4 x5 x3 x2 6 x 4 > fsolve(r); , ,-1.236067977 1.167303978 3.236067977 > fsolve(r, x, complex); -1.236067977 --0.7648844336 0.3524715460 I +-0.7648844336 0.3524715460 I, , , -0.1812324445 1.083954101 I +0.1812324445 1.083954101 I 1.167303978, , , 3.236067977 > fsolve(r, x, 0..2); 1.167303978 Procedura realroot(p, sirka) najde otevrene intervaly pro realne koreny celociselneho polynomu, procedura sturm vraci pocet realnych korenu polynomu na sturm zadanem intervalu. > realroot(r); [ ], ,[ ],0 2 [ ],2 4 [ ],-2 -1 > realroot(r, 1/100); , , , 149 128 75 64 , 207 64 415 128 , -159 128 -79 64 > sturm(r,x, -infinity, infinity); 3 > sturm(r, x, 2,4); 1 Pro polynomialni rovnice vraci fsolve vetsinou vsechna realna reseni, s volbou complex vsechna komplexni reseni. Pro vsechny ostatni rovnice fsolve vetsinou vraci jen jedno reseni. Standardne fsolve uziva pro vypocty mensi pocet cislic, nez je predepsano promennou Digits (vzhledem k uspore casu a pameti). Parametr fulldigits zpusobi dodrzeni pozadovaneho poctu platnych cislic uvedeneho v promenne Digits. Parametr maxsols=n urcuje maximalni pocet reseni. > eqn:=sin(x)=x/2; :=eqn =( )sin x x 2 > fsolve(eqn, x); 0. > fsolve(eqn, x, avoid={x=0}); -1.895494267 > fsolve(eqn, x, avoid={x=0, x=%}); 1.895494267 > fsolve(eqn, x, avoid={x=0, x=%%, x=%}); fsolve , ,=( )sin x x 2 x =avoid { }, ,=x 0 =x 1.895494267 =x -1.895494267 To je signalem, ze Maple uz nenachazi dalsi reseni. > fsolve(eqn, x, 0.1..infinity); 1.895494267 > fsolve(eqn, x, -0.1..0.1); 0. > fsolve(eqn, x, -infinity..-0.1); -1.895494267 Prikaz fsolve je zalozen na (vicedimensionalni) Newtonove metode a (pokud tato selze) na (vicedimensionalni) metode secen. Muzeme tedy urcit pocatecni aproximaci. > fsolve(sin(x), x); 0. > fsolve(sin(x), x=3); 3.141592654 > >