Polynomy a racionalni funkce Polynomy a racionalni funkce > restart; > p1:=-3*x+7*x^2-3*x^3+7*x^4;#col lected form :=p1 - + - +3 x 7 x2 3 x3 7 x4 > type(p1, 'polynom'); true > whattype(p1); + > ved:=lcoeff(p1); :=ved 7 > stupen:=degree(p1); :=stupen 4 Scitani a nasobeni polynomu > p2:=5*x^5+3*x^3+x^2-2*x+1;#expa nded canonical form :=p2 + + - +5 x5 3 x3 x2 2 x 1 > 2*p1-3*p2+3; - + -11 x2 15 x3 14 x4 15 x5 > p1*p2; ( )- + - +3 x 7 x2 3 x3 7 x4 ( )+ + - +5 x5 3 x3 x2 2 x 1 > v1:=expand(%); v1 17 x6 11 x4 20 x3 13 x2 3 x- + - + -:= 56 x7 4 x5 15 x8 35 x9 + + - + Maple neprovadi automaticky roznasobeni, coz vypada jako nevyhoda, ale ve skutecnosti neni. > (3*x+5)^10; ( )+3 x 5 10 > expand((3*x+5)^10); 59049 x10 984150 x9 7381125 x8 + + 32805000 x7 95681250 x6 + + 191362500 x5 265781250 x4 + + 253125000 x3 158203125 x2 + + 58593750 x 9765625+ + Cleny polynomu nejsou automaticky usporadany (z pametovych duvodu). Usporadani provedeme pomoci procedury sort (sestupne vzhledem ke stupni polynomu). > sort(v1); 35 x9 15 x8 56 x7 17 x6 4 x5 11 x4 - + - + + 20 x3 13 x2 3 x- + Sort meni interni datovou strukturu. > restart; > p:=1+x+x^3+x^2; :=p + + +1 x x3 x2 > x^3+x^2+x+1; + + +1 x x3 x2 > q:=(x-1)*(x^3+x^2+x+1); :=q ( )-x 1 ( )+ + +1 x x3 x2 > sort(p); + + +x3 x2 x 1 > q; ( )-x 1 ( )+ + +x3 x2 x 1 > ?sort Urcovani koeficientu. > p1:=-3*x+7*x^2-3*x^3+7*x^4;p2:= 5*x^5+3*x^3+x^2-2*x+1; :=p1 - + - +3 x 7 x2 3 x3 7 x4 :=p2 + + - +5 x5 3 x3 x2 2 x 1 > coeff(p2,x^3); 3 > coeffs(p2, x, 'pow');pow; , , , ,1 5 3 1 -2 , , , ,1 x5 x3 x2 x > coeff(x^2-x*(x-1), x); 1 Prikaz coeffs pozaduje polynom v roznasobenem tvaru (collected form). > ?coeffs > p:=x^3-(x-3)*(x^2+x)+1; :=p - +x3 ( )-x 3 ( )+x2 x 1 > coeffs(p); Error, invalid arguments to coeffs > coeffs(expand(p)); , ,1 2 3 Jednou ze zakladnich operaci pro polynomy je deleni se zbytkem. Maple ma k tomuto ucelu dve procedury: quo a rem. > q:=quo(p2,p1,x, 'r'); :=q + 5 x 7 15 49 > r; - + -1 53 49 x3 x2 53 49 x > testeq(p2=(q*p1+r)); true > rem(p2,p1,x,'q'); - + -1 53 49 x3 x2 53 49 x > q; + 5 x 7 15 49 > gcd(p1,p2); #nejvetsi spolecny delitel polynomu p1 a p2 +x2 1 > pol:=expand(p1*p2); pol 17 x6 11 x4 20 x3 13 x2 3 x- + - + -:= 56 x7 4 x5 15 x8 35 x9 + + - + > expand(sqrt(2+x)*sqrt(3+x)); +2 x +3 x > expand(combine(sqrt(2+x)*sqrt(3 +x), symbolic)); + +6 x2 5 x Komplikovanejsi jsou algoritmy pro rozklad polynomu na soucin. Procedura factor zapisuje polynom s racionalnimi koeficienty ve tvaru soucinu ireducibilnich polynomu nad Q. > factor(pol); x ( )-7 x 3 ( )- +5 x3 2 x 1 ( )+x2 1 2 Zapis factor(polynom, pole) provadi rozklad nad algebraickym polem. > factor(pol, I); x ( )- +5 x3 2 x 1 ( )-7 x 3 ( )-x I 2 ( )+x I 2 > p:=x^2+1; :=p +x2 1 > factor(p); +x2 1 > irreduc(p); true > factor(p,I); ( )-x I ( )+x I > irreduc(p,I); false Silnejsim nastrojem pro rozklady je procedura split z knihovny polytools. > pol:=8*x^3-12*x; :=pol -8 x3 12 x > factor(pol); 4 x ( )-2 x2 3 > polytools[split](pol,x); 8 +x 1 2 ( )RootOf -_Z2 6 x -x 1 2 ( )RootOf -_Z2 6 > convert(%,'radical'); 8 +x 6 2 x -x 6 2 > polytools[split](x^2+1,x); ( )-x ( )RootOf +_Z2 1 ( )+x ( )RootOf +_Z2 1 > convert(%,'radical'); ( )-x I ( )+x I Polynomy vice promennych > pol:=6*x*y^5+12*y^4+14*y^3*x^3 -15*x^2*y^3 + 9*x^3*y^2 - 30*x*y^2 - 35*x^4*y + 18*y*x^2 +21*x^5; pol 6 x y5 12 y4 14 y3 x3 15 x2 y3 + + -:= 9 x3 y2 30 x y2 35 x4 y 18 y x2 21 x5 + - - + + > sort(pol, [x,y], 'plex'); #Pure LEXicographic ordering 21 x5 35 x4 y 14 x3 y3 9 x3 y2 15 x2 y3 - + + - 18 x2 y 6 x y5 30 x y2 12 y4 + + - + > sort(pol, [y,x], 'plex'); #Pure LEXicographic ordering 6 y5 x 12 y4 14 y3 x3 15 y3 x2 9 y2 x3 + + - + 30 y2 x 35 y x4 18 y x2 21 x5 - - + + > sort(pol, [x,y]); #total degree term ordering 14 x3 y3 6 x y5 21 x5 35 x4 y 9 x3 y2 + + - + 15 x2 y3 12 y4 18 x2 y 30 x y2 - + + Nebo se muzeme na predchazejici polynom divat jako na polynom v promenne x, polynomy v y jsou pak koeficienty. > collect(pol, x); 21 x5 35 x4 y ( )+14 y3 9 y2 x3 - + ( )-18 y 15 y3 x2 ( )- +30 y2 6 y5 x 12 y4 + + + A obracene: > collect(pol, y); 6 x y5 12 y4 ( )- +15 x2 14 x3 y3 + + ( )-9 x3 30 x y2 ( )- +35 x4 18 x2 y 21 x5 + + + Priklady na praci s polynomy vice promennych. > coeff(pol, x^3); +14 y3 9 y2 > coeffs(pol, x, 'powers'); powers; 12 y4 -35 y 21 +14 y3 9 y2 -18 y 15 y3 , , , , , - +30 y2 6 y5 , , , , ,1 x4 x5 x3 x2 x > settime:=time(): > factor(pol); ( )- +3 x2 5 x y 2 y3 ( )+ +7 x3 6 y 3 x y2 > cpu_time:=time()-settime; :=cpu_time 0.016 Racionalni funkce > r:=(x^2+3*x+2)/ (x^2+5*x+6); :=r + +x2 3 x 2 + +6 x2 5 x > type(r, 'ratpoly'); true > whattype(r); * > numer(r), denom(r); #citatel a jmenovatel ,+ +x2 3 x 2 + +6 x2 5 x Narozdil od racionalnich cisel Maple neprovadi automaticke zjednoduseni. Zjednoduseni provedeme prikazem normal (tak, ze gcd(citatel, jmenovatel)=1). > r; + +x2 3 x 2 + +6 x2 5 x > normal(r); +x 1 +3 x Zjednoduseni se provede automaticky pouze v pripade, ze Maple okamzite pozna spolecne cleny. > ff:=(x-1)*numer(r); :=ff ( )-x 1 ( )+ +x2 3 x 2 > gg:=(x-1)*denom(r); :=gg ( )-x 1 ( )+ +6 x2 5 x > ff/gg; + +x2 3 x 2 + +6 x2 5 x > expand(ff)/gg; + - -x3 2 x2 x 2 ( )-x 1 ( )+ +6 x2 5 x > (x^(100)-1)/(x-1); -x100 1 -x 1 > normal(%); 1 x4 x5 x3 x2 x x6 x7 x8 x9 + + + + + + + + + x87 x86 x85 x90 x89 x88 x96 x95 + + + + + + + + x93 x84 x83 x82 x92 x91 x94 x99 + + + + + + + + x97 x98 x81 x79 x78 x77 x80 x76 + + + + + + + + x74 x73 x72 x71 x70 x75 x69 x67 + + + + + + + + x66 x65 x64 x63 x62 x61 x60 x68 + + + + + + + + x59 x57 x56 x55 x54 x53 x52 x51 + + + + + + + + x50 x49 x48 x47 x46 x58 x45 x43 + + + + + + + + x42 x41 x40 x39 x38 x37 x36 x35 + + + + + + + + x34 x33 x32 x31 x30 x29 x28 x27 + + + + + + + + x26 x44 x25 x23 x22 x21 x20 x19 + + + + + + + + x18 x17 x16 x15 x14 x13 x12 x11 + + + + + + + + x10 x24 + + > f:=161*y^3+333*x*y^2+184*y^2+16 2*x^2*y+144*x*y+77*y+99*x+88: > g:=49*y^2+28*x^2*y+63*x*y+147*y +36*x^3+32*x^2+117*x+104: > racfce:=f/g; racfce 161 y3 333 x y2 184 y2 + +(:= 162 x2 y 144 x y 77 y 99 x 88+ + + + + ) ( 49 y2 28 x2 y 63 x y 147 y 36 x3 32 x2 + + + + + 117 x 104+ + ) > normal(racfce); + +18 x y 23 y2 11 + +4 x2 7 y 13 Rozklad na parcialni zlomky > q:=(x^3+x^2-x+1)/p1; :=q + - +x3 x2 x 1 - + - +3 x 7 x2 3 x3 7 x4 > convert(q, 'parfrac', x); - + + 1 3 x 143 87 ( )-7 x 3 +7 x 3 29 ( )+x2 1 > convert(q,'parfrac',x,real); 0.2348111658 -x 0.4285714286 +0.1034482759 0.2413793105 x +x2 1. + 0.3333333334 x > convert(%, rational); + - 143 609 -x 3 7 + 7 x 29 3 29 +x2 1 1 3 x > convert(q,'parfrac',x,I); + - + + 7 58 3 58 I +x I - 7 58 3 58 I -x I 1 3 x 143 87 ( )-7 x 3 > convert(q, 'fullparfrac', x); 1 3 x 143 609 -x 3 7 - + =_ ( )RootOf +_Z 2 1 - + 3 _ 58 7 58 -x _ + > convert(%, radical); - + + + 1 3 x 143 609 -x 3 7 - 7 58 3 58 I -x I + 7 58 3 58 I +x I > 1/(x^4-5*x^2+6); 1 - +x4 5 x2 6 > convert(%,parfrac,x); - 1 -x2 3 1 -x2 2 > convert(%,parfrac,x,sqrt(2)); + - 2 4 ( )+x 2 1 -x2 3 2 4 ( )-x 2 > convert(%,parfrac,x,{sqrt(2),sq rt(3)}); 2 4 ( )+x 2 3 6 ( )+x 3 2 4 ( )-x 2 - - 3 6 ( )-x 3 + > ratfun:=(x-a)/(x^5+b*x^4-c*x^2- b*c*x); :=ratfun -x a + - -x5 b x4 c x2 b c x > convert(ratfun, 'parfrac', x); - - - + +c x2 x2 b2 a b c x x c a b2 c a b c ( )-x3 c ( )+b3 c c - -b a ( )+x b b ( )+b3 c a x b c + + Usmerneni: > 2/(2-sqrt(2)); 2 -2 2 > rationalize(%); +2 2 > z/(1+sqrt(x)); z +1 x > rationalize(%); z ( )- +1 x -x 1 Poznamky k manipulaci s polynomy a racionalnimi funkcemi > souc:=(x^2-x)*(x^2+2*x+1); :=souc ( )-x2 x ( )+ +x2 2 x 1 > expform:=expand(souc); :=expform + - -x4 x3 x2 x > soucin:=(a+b)*(c+d); :=soucin ( )+b a ( )+c d > expand(soucin); + + +b c b d c a a d Pokud nechceme roznasobovat (c+d), musime to Maplu sdelit uvedenim parametru v procedure expand. > expform:=expand(soucin, c+d); :=expform +( )+c d b ( )+c d a > (x+1)^3; ( )+x 1 3 > expand(%); + + +x3 3 x2 3 x 1 > power:=(x+1)^(-2); :=power 1 ( )+x 1 2 > expand(power); 1 ( )+x 1 2 Zaporne mocniny Maple neexpanduje. Musime provest umocneni jmenovatele zvlast. > numer(power)/expand(denom(power )); 1 + +x2 2 x 1 > (x+1)^2/((x^2+x)*x); ( )+x 1 2 ( )+x2 x x Vsimneme si efektu pouziti expand na racionalni lomenou funkci. > expand(%); + + x +x2 x 2 +x2 x 1 ( )+x2 x x > expand(numer(%%))/expand(denom( %%)); + +x2 2 x 1 +x3 x2 FACTOR Factor provadi rozklad polynomu na soucin korenovych cinitelu nad racionalnimi cisly. Zapis factor(polynom, pole) provadi rozklad nad algebraickym polem. > q:=x^2+9/25; :=q +x2 9 25 > factor(q,I); ( )-5 x 3 I ( )+5 x 3 I 25 > pol:=8*x^3-12*x; :=pol -8 x3 12 x Silnejsim nastrojem je procedura split (z knihovny polytools): > polytools[split](pol,x); 8 +x 1 2 ( )RootOf -_Z2 6 x -x 1 2 ( )RootOf -_Z2 6 > convert(%,'radical'); 8 +x 6 2 x -x 6 2 > factor(pol,sqrt(6)); 2 x ( )+2 x 6 ( )-2 x 6 > polytools[split](x^2+1,x); ( )-x ( )RootOf +_Z2 1 ( )+x ( )RootOf +_Z2 1 > convert(%,'radical'); ( )-x I ( )+x I NORMAL > (x-1)*(x+2)/((x+1)*x)+(x-1)/(1+ x)^2; + ( )-x 1 ( )+2 x x ( )+x 1 -x 1 ( )+x 1 2 Vykraceni spolecnych clenu z citatele a jmenovatele, prevod na spolecneho jmenovatele: > normal(%); ( )-x 1 ( )+ +2 4 x x2 x ( )+x 1 2 > normal(%, expanded); - + + -2 x 3 x2 x3 2 + +x3 2 x2 x > racfce:=(x^4+x^3-4*x^2-4*x)/(x^ 3+x^2-x-1); :=racfce + - -x4 x3 4 x2 4 x + - -x3 x2 x 1 Vsimnete si efektu pouziti prikazu expand, normal, factor v nasledujici posloupnosti prikazu: > factor(racfce); x ( )-x 2 ( )+2 x ( )-x 1 ( )+x 1 > factor(numer(racfce))/sort(expa nd(denom(racfce))); x ( )-x 2 ( )+2 x ( )+x 1 + - -x3 x2 x 1 > sort(expand(numer(racfce)))/fac tor(denom(racfce)); + - -x4 x3 4 x2 4 x ( )-x 1 ( )+x 1 2 > sort(normal(racfce, 'expanded')); -x3 4 x -x2 1 Nekolik poznamek k praci se systemem > restart; Vice informaci o tom, jak system pracuje, dosahneme nastavenim promenne printlevel. Default nastaveni je 1. Zaporna hodnota znamena bez doplnujicich komentaru. > integrate(1/(sin(x)^2+1), x=0..Pi); 2 2 > printlevel; 1 > printlevel:=100; :=printlevel 100 > integrate(1/(sin(x)^2+1), x=0..Pi); value remembered (at top level): sin(x) -> sin(x) {--> enter int, args = 1/(sin(x)^2+1), x = 0 .. Pi value remembered (in int): int/int([1/(sin(x)^2+1), x = 0 .. Pi], 10, _EnvCauchyPrincipalValue, _EnvAllSolutions, _EnvContinuous) -> 1/2*Pi*2^(1/2) :=answer 2 2 2 2 <-- exit int (now at top level) = 1/2*Pi*2^(1/2)} 2 2 > printlevel:=1; :=printlevel 1 > interface(prettyprint=false): > solve(a*x^2+b*x+c, x); 1/2/a*(-b+(b^2-4*a*c)^(1/2)), -1/2*(b+(b^2-4*a*c)^(1/2))/a > interface(prettyprint=true):#im plicitni nastaveni > interface(prettyprint=1): > solve(a*x^2+b*x+c, x); 2 1/2 2 1/2 -b + (b - 4 a c) b + (b - 4 a c) --------------------, - ------------------- 2 a 2 a > interface(prettyprint=2): > solve(a*x^2+b*x+c, x); , - +b -b2 4 a c 2 a +b -b2 4 a c 2 a > sol:=solve(a*x^2+b*x+c, x): > print(sol); , - +b -b2 4 a c 2 a +b -b2 4 a c 2 a > lprint(sol); 1/2/a*(-b+(b^2-4*a*c)^(1/2)), -1/2*(b+(b^2-4*a*c)^(1/2))/a > interface(verboseproc=2): > print(unassign); nomproc( ) "remove an assignment from a\description n assigned expression" ... end proc Nacteni knihovny > with(student); D Diff Doubleint Int Limit Lineint, , , , , ,[ Product Sum Tripleint changevar, , , , completesquare distance equate integrand, , , , intercept intparts leftbox leftsum makeproc, , , , , middlebox middlesum midpoint powsubs, , , , rightbox rightsum showtangent simpson, , , , slope summand trapezoid, , ] Pokud chceme pouzit pouze jednu konkretni funkci z dane knihovny, muzeme provest jeji volani takto: > student[distance]([1,1],[3,4]); 13 Seznam knihoven ziskame prikazem > ?index[packages]; Napovedu ke konkretni knihovne prikazem > ?student; Definice synonym (pouzivame, kdyz se chceme vyhnout dlouhym jmenum): > restart; > alias(D = student[distance]); D > D([1,1],[3,4]); 13 > alias(D=D); #odstrani alias Definice zkratek: > macro(D = student[distance]); D > D([1,1],[3,4]); 13 > macro(D=D); Alias ovlivnuje vstup i vystup, zatimco makro pouze vstup. > alias(c=a^2+b^2); c > c; c > 1/(a^2+b^2);c; 1 c c > a^2+b^2; c > alias(c=c); > macro(c=a^2+b^2); c > 1/(a^2+b^2); 1 +a2 b2 > a^2+b^2; +a2 b2 > c; +a2 b2 > macro(c=c); > restart; Ukladani a nacitani dat Save - uklada ve formatu, ktery se da pozdeji opetne nacist do mapleovskeho zapisniku. Muzeme ukladat v internim formatu Maplu (.m) nebo v textovem formatu: > pol:=x^2+2*x+1; `cislo ctyri` :=4; :=pol + +x2 2 x 1 :=cislo ctyri 4 > save pol, `cislo ctyri`, `datafile.m`; #nutne uzavreni do levych apostrofu! > save pol, `cislo ctyri`, datafile; > restart; > pol; pol > read datafile; :=pol + +x2 2 x 1 :=cislo ctyri 4 > pol; + +x2 2 x 1 > restart; > read `datafile.m`; > pol; + +x2 2 x 1 V pripade nacteni souboru datafile jsou instrukce opet zobrazeny, v pripade nacteni souboru datafile.m tomu tak neni (nacitani souboru datafile.m je efektivnejsi). Maple po startu hleda soubor .mapleinit ve Vasem domovskem adresari - zde muzeme zadat prikazy, ktere chceme provadet pri kazdem startu Maplu- napriklad nacteni casto pouzivanych knihoven. Adresare, ve kterych Maple hleda nacitane knihovny, jsou urcovany promennou libname. > libname; "/usr/local/maple95/lib" > libname:=`/home_zam/plch/maple` ,libname; libname "/home_zam/plch/maple",:= "/usr/local/maple95/lib" > libname; "/home_zam/plch/maple", "/usr/local/maple95/lib" Procedura latex generuje zdrojovy kod LaTeXu pro zadany vzorec (vzorce): > latex((x^2+y^2)/(x^2-y^2)); {\frac {{x}^{2}+{y}^{2}}{{x}^{2}-{y}^{2}}} > (x^2+y^2)/(x^2-y^2); +x2 y2 -x2 y2 > latex(%, `vzorec1.tex`); > polyeq:=x^3-a*x=1; :=polyeq =-x3 a x 1 > sols:=solve(polyeq,x); sols ( )+108 12 - +12 a3 81 ( )/1 3 6 := 2 a ( )+108 12 - +12 a3 81 ( )/1 3 + , ( )+108 12 - +12 a3 81 ( )/1 3 12 - a ( )+108 12 - +12 a3 81 ( )/1 3 1 2 I 3 - + ( )+108 12 - +12 a3 81 ( )/1 3 6 2 a ( )+108 12 - +12 a3 81 ( )/1 3 - , ( )+108 12 - +12 a3 81 ( )/1 3 12 - a ( )+108 12 - +12 a3 81 ( )/1 3 1 2 I 3 - ( )+108 12 - +12 a3 81 ( )/1 3 6 2 a ( )+108 12 - +12 a3 81 ( )/1 3 - > sol1:=sols[1]; sol1 ( )+108 12 - +12 a3 81 ( )/1 3 6 := 2 a ( )+108 12 - +12 a3 81 ( )/1 3 + > CodeGeneration[C](sol1); cg0 = pow(0.108e3 + 0.12e2 * sqrt(-0.12e2 * pow(a, 0.3e1) + 0.81e2), 0.1e1 / 0. 3e1) / 0.6e1 + 0.2e1 * a * pow(0.108e3 + 0.12e2 * sqrt(-0.12e2 * pow(a, 0.3e1) + 0.81e2), -0.1e1 / 0.3e1); > codegen[C](sol1, filename=`vystup.c`); > with(CodeGeneration); C Fortran IntermediateCode Java, , , ,[ LanguageDefinition Matlab Names Save, , , , Translate VisualBasic, ] > Java(sol1); cg2 = Math.pow(0.108e3 + 0.12e2 * Math.sqrt(-0.12e2 * Math.pow(a, 0.3e1) + 0.81 e2), 0.1e1 / 0.3e1) / 0.6e1 + 0.2e1 * a * Math.pow(0.108e3 + 0.12e2 * Math.sqrt (-0.12e2 * Math.pow(a, 0.3e1) + 0.81e2), -0.1e1 / 0.3e1); > Matlab(sol1); cg3 = (0.108e3 + 0.12e2 * sqrt((-12 * a ^ 3 + 81))) ^ (0.1e1 / 0.3e1) / 0.6e1 + 0.2e1 * a * (0.108e3 + 0.12e2 * sqrt((-12 * a ^ 3 + 81))) ^ (-0.1e1 / 0.3e1); >