Bevezetés a MuPAD használatához 1. Bevezetés A segédanyag a MuPAD Light 2.5.3 használatáról szól. (Az anyoghoz a MuPAD-ot Linux operációs rendszer alatt használtam.) A továbbiakban a MuPAD szó mindig erre utal. Indítsuk el a MuPAD-ot! A megjelenő ablakot a továbbiakban munkalapnak nevezem. Gépeljük be a kiszámítani kívánt kifejezést: >> sin(5*pi/3) A MuPAD nem képes a képernyőre formázott matematikai outputot írni az ASCII szinten felül. Az eredmény kijelzését a képernyőn kétféle módon lehet beállítani a View menüpontban. Ha a Pretty Print gomb be van nyomva, akkor egy viszonylag jól olvasható, több sorban nyomtatott kimenetet kapunk, ha pedig nincs benyomva, akkor egy nehezebben olvasható, de egysoros és így más programokba könnyebben átemelhető kimenetet kapunk. Például az előbb: -1/2*3^(1/2) Ebben a segédanyagban vagy az előbbi kimenet típust alkalmazom, vagy a könnyebb olvashatóság végett a kimenetet átírom L A TEX-be: 1/2 3 1/2 Egymás mellé több kifejezést is gépelhetünk, vesszővel, vagy pontosvesszővel elválasztva. (Próbáljuk ki, mi a különbség!) >> sin(pi/2),sin(pi/3) Ha a sort kettősponttal zárjuk (:), akkor az után a sor végrehajtódik, de az eredmény nem jelenik meg a képernyőn. A MuPAD-ban szigorú lineáris rendben lehet haladni fentről lefelé, egyszer már begépelt sort utólag nem lehet megváltoztatni. Ha korábban bevitt kifejezést újra be kell gépelnünk, akkor használjuk a Copy Paste módszert. A MuPAD megkülönbözteti a kis betűt és a nagy betűt, erre a gépelésnél vigyázni kell. Az előbbi példában láttuk, hogy a Ludolf-féle számot a PI gépelésével lehet elérni, azaz mindkét betű nagy. A rendszermagot a File menüben található Restart Kernel utasítással újraindíthatjuk, ekkor minden korábban bevitt anyag törlődik. Tanulmányozzuk a menüsorban található Help mezőt! Egy MuPAD parancsról rövid információt írhatunk ki a képernyőre az info paranccsal. PI 1
>> info(sin) info Részletes leírást (és példákat) is kaphatunk: >>?sin A megjelenő lapon kattintsunk rá a promt jelre (>>)! Ekkor az ott leírt parancs automatikusan megjelenik a saját MuPAD munkalapunkban.? 2. A MuPAD, mint számológép A kiszámítani kívánt kifejezést a zsebszámológépeknél megszokott módon kell bevinni. Természetes számokkal és közönséges tört alakban bevitt racionális számokkal az eredmény egzakt, vagy ha a Mupad az egzakt eredményt nem képes megadni, akkor visszakapjuk az inputot. A tizedes törteket tizedes ponttal kell bevinni. >> (1 + (5/2*3))/(1/7 + 7/9)^2 67473/6728 Matematikai konstansok: PI, E, I. >> sin(pi/9) PI, E, I sin(1/9*pi) Az eredményt most azért nem kaptuk meg, mert az egzakt értéket a MuPAD nem tudta. A közelítő értéket természetesen ilyenkor is megkaphatjuk: >> float(sin(pi/9)) float 0.3420201433 >> arcsin(-1) 1/2 π Ha nem definiált értéket akarunk kiszámítani, akkor hibaüzenetet kapunk: >> tan(pi/2) Error: singularity [tan] Faktoriális: >> 100!! 2
Az előbbi szám hány jegyű? >> length(100!) length Négyzetgyök: >> sqrt(24) sqrt 2 6 Hasonlítsuk össze: >> sqrt(24.0) 4.898979486>> a:=e Abszolút érték: >> abs(3+4*i) abs, I 5 Értékadás. Az a változónak az e(= exp(1)) értéket adjuk. Az értékadás jele :=. := >> a:=e: Ezután a az előbbi értéket jelenti: >> ln(a) 1 A változó értékét a delete paranccsal törölhetjük: delete >> delete(a) >> ln(a) ln(a) 1. Feladat. Írassuk ki a nevezetes szögek különféle szögfüggvényeinek pontos és közelítő értékét! Írassuk ki π/8 szögfüggvényeit is. 2. Feladat. Számítsuk ki 101 közelítő értékét 35 értékes jegy pontossággal! Az értékes jegyek számának beállításához olvassuk el a float helpjében a példákat. (Segítség a margón.) A feladat elvégzése után állítsuk vissza az értékes jegyek számát az alapértelmezésre. (delete(digits).) DIGITS 3
3. Adattípusok A MuPAD fontos adattípusai a (kifejezés)sorozat, a lista és a halmaz. A kifejezéssorozat MuPAD objektumok vesszővel elválasztott felsorolása: >> sorozat:=pi/2,pi/3,pi/4,pi/6 (A bal oldalon szereplő sorozat egy változó!) Egy függvényt alkalmazhatunk a sorozat minden elemére: >> sin(x)$ x in sorozat $ A dollár jel a MuPAD sorozatképző operátora. Ismerjük meg a használatát! A négyzetszámok 1-től 10-ig: >> i^2$i=1..10 Az előbbi sorozatot most eljelöljük F -nek: >> F:=i^2$i=1..10 A sorozat elemeire az elem sorszámával hivatkozhatunk: >> F[5] A sorozatból törölhetünk elemet: >> delete(f[5]): F A sorozat legnagyobb, legkisebb eleme és elemszáma: >> max(f),min(f),nops(f) max, min, nops A sorozat elemeinek összeadása: _plus(f) _plus 3. Feladat. Egy mértani sorozat első eleme 2, kvóciense 3. Írassuk ki a sorozat első 5 elemét a sorozatképző operátorral. Adjuk össze a sorozat elemeit. 4. Feladat. Írassuk ki sin(k π 4 ) értékét k=0-tól 8-ig a sorozatképző operátort használva! 5. Feladat. Adjuk össze a köbszámokat 1-től a 10. köbszámig! A kifejezéssorozat formálisan abban különbözik a listától, hogy a MuPAD elemek vesszővel ellátott felsorolását még szögletes zárójelbe tesszük. >> sorozat:=i^2$i=1..10:lista:=[sorozat] A lista elemeire hasonlóan hivatkozhatunk, mint a sorozat elemeire, ugyanúgy adjuk meg a sorozat elemszámát is. (Próbáljuk ki.) A contains paranccsal eldönthetjük, hogy egy elem benne van-e egy sorozatban, s ha igen, hányadik eleme annak: contains >> contains(lista,23) Az eredmény 0 lesz, ami azt jelenti, hogy a 23 az előbbi sorozatban nincs benne. A map parancs segítségével egy függvény értékeit számíthatjuk ki egy listán: map 4
>> map(lista,sqrt) Az op parancs a listát kifejezéssorozattá konvertálja: >> op(lista) op A halmazokat a MuPAD a szó matematikai értelmében kezeli. 6. Feladat. Keressük meg a MuPAD beépített Tutorial Sets fejezetét (4.7). Hajtsuk végre a példákat (kattintsunk a promt jelekre), magyarázzuk meg az eredményeket. 4. Elemi számelmélet div, ifactor, igcd, ilcm, isprime, ithprime, nextprime 7. Feladat. Keressük ki az előbbi parancsokat a helpben. Tanulmányozzuk a példákat! (Végezzük el a behelyettesítést.) Használatukról készítsünk rövid feljegyzést. A MuPAD indításakor nem minden parancs áll rögtön a rendelkezésünkre. Bizonyos parancsok úgynevezett könyvtárakban vannak. Ilyen könyvtár például a numlib, amely különböző számelméleti függvényeket tartalmaz. A könyvtárban elhelyezett parancsokról az alábbiak szerint kaphatunk információt: >> info(numlib)?numlib -re bejön a Tutorial megfelelő oldala. A könyvtár által tartalmazott parancsok elérése: >> numlib::numdivisors(6746328388800) :: Azaz könyvtárnév::parancs módon. numdivisors(n) megadja n pozitív osztóinak számát. 8. Feladat. Adjuk meg az előbbi szám prímosztóit. primedivisors 5. Algebrai kifejezések Helyettesítsünk be x = 4-et az f = 3 x 2 + 8 kifejezésbe! >> f:=3*x^2+8; subs(f,x=4) subs A subs parancs kifejezésekkel is működik. Helyettesítsünk az alőbbi f kifejezésbe x = 5 + 2 u-t: >> f1:=subs(f,x=5+2*u) Az expand paranccsal felbonthatjuk a zárójelet: >> expand(f1) A subs paranccsal egyenletekbe is behelyettesíthetünk: >> eq:=x^3-5*x^2+7*x-12=0;subs(eq,x=4) expand 9. Feladat. Helyettesítsük be 10-től 10-ig az egész számokat az x 3 5x 2 + 7x 12 algebrai kifejezésbe. (Használjuk a sorozatképző operátort!) 5
Polinomok szorzattá alakítására a factor parancsot használhatjuk: factor 10. Feladat. Alakítsuk szorzattá az előző feladatban szereplő harmadfokú polinomot! Ha a factor parancsot törtkifejezésre alkalmazzuk, akkor a számláló és a nevező szorzattá alakítása után a MuPAD még a lehetséges helyettesítéseket is elvégzi: >> A:=x^10-1; B:=x^2-1; factor(a); factor(b); factor(a/b) A simplify paranccsal nagyon rugalmasan tudunk kifejezéseket egyszerűbb alakra hozni. Például az előző tört esetében: simplify >> simplify(a/b) 6. Egyenletek A solve parancs a Maple-hoz nagyon hasonlóan, ugyanakkor különbségekkel működik. solve 11. Feladat. Vessük össze a Maple és a MuPAD eredményeit az alábbi egyenletek megoldásában: x 3 11x 2 + 7x + 147 = 0, sin(x) = 1/2, x 3 11x 2 + 7x + 10 = 0. Az utóbbi egyenletnél a MuPAD látszólag nem ad eredményt. Tegyük azonban a következőt: >> N:=solve(x^3-11*x^2+7*x+10=0,x): float(n) Numerikus megoldás keresésénél a numeric::solve parancsot kell alkalmazni. numeric::solve 12. Feladat. Oldjuk meg numerikusan a sin(x) = 0.3x egyenletet. Útmutatás: Az intervallumok kereséséhez a plotfunc2d paranccsal először kirajzoljuk a függvény grafikonját: plotfunc2d >> plotfunc2d(sin(x),0.3*x, x=0..5) 7. Határérték Sorozat határértéke Számítsuk ki a lim n ( n n 1) határértéket! >> limit(sqrt(n)-sqrt(n-1),n=infinity) limit 13. Feladat. Számítsuk ki MuPAD-dal a következő határértékeket: lim n 1 n n! A következő határértékkel első nekifutásra a MuPAD nem boldogul: n k lim n a n. (Próbáljuk ki!) A paraméterekre feltételeket kell adnunk: >> assume(k,type::posint):assume(a>1): 6
Ezek után: >> limit(n^k/a^n,n=infinity) Tisztítsuk a változókat! 14. Feladat. Számítsuk ki lim n n q n értékét, ha 0 < q < 1. Útmutatás. A q-ra előírt feltétel: >> assume(q<1),assume(-1<q,_and) 15. Feladat. Állítsuk elő a mértani sor összegképletét! Számítsuk ki: n i=1 1 i(i + 1) és 1 i(i + 1) értékét! i=1 >> sum(1/(i*(i+1)),i=1..n), limit(sum(1/(i*(i+1)),i=1..n),n=infinity) Vagy az utóbbi határérték röviden: >> sum(1/(i*(i+1)),i=1..infinity) 16. Feladat. Számítsuk ki: lim n [ 1 2 + 3 2 2 + 2n 1 2 n Függvény határértéke. Határozzuk meg az f: R \ {3} R, f(x) = x + 3 x 3 függvény határértékét az értelmezési tartomány határpontjaiban. Figyeljük meg a függvény definícióját, mely a Maple-höz hasonló: >> f:=x->(x+3)/(x-3) A szemléletesség kedvéért vázoljuk a függvényt: >> plotfunc2d(f(x),x=-1..7) >> limit(f(x),x=-infinity); limit(f(x),x=3,left);limit(f(x),x=3, Right); limit(f(x),x=infinity) Természetesen x = 3-ra: >> limit(f(x),x=3) undefined Felsőbb éveseknek: az előbbi függvény teljes függvényvizsgálata. (Magyarázzunk meg és értelmezzünk minden lépést!) A függvény első és második deriváltja: >> f1:=diff(f,x); f2:=diff(f,x$2); Növekedés fogyás: ]. 7
>> solve(f1>0,x);solve(f1<0,x) Lokális szélsőérték: >> X:=solve(f1=0,x); >> subs(f2,x=x[1]); subs(f2,x=x[2]) >> subs(f,x=x[1]); subs(f,x=x[2]) Görbület: >> solve(f2>0,x);solve(f2<0,x) Vázoljuk a grafikont! (Először magunk, majd:) >> plotfunc2d(f,x=-4..4,y=-3..3) 17. Feladat. Számítsuk ki a következő függvények határértékét az értelmezési tartomány határpontjaiban. Készítsünk a függvényekről vázlatot is. f: R \ {0} R, f(x) = g: R \ {0} R, g(x) = x2 1 x 3 Számítsuk ki a lim x 0 sin(1/x) határértéket! >> limit(sin(1/x),x=0) [-1, 1] 1 1 + exp(1/x) ; A függvény a 0 bármely környezetében a [ 1, 1] intervallumból minden értéket felvesz. Rajzoljuk meg a grafikont: >> plotfunc2d(sin(1/x),x=-1.5..1.5,grid=5000) 8. Mátrixok, determinánsok, lineáris egyenletrendszerek Mátrixok A mátrixok megadása lehetséges a sorvektorokkal: >> A := matrix([[1, 5], [2, 3]]) ( 1 5 2 3 ) Hivatkozás egy mátrixelemre: 8
>> A[2,1] 2 Megadhatjuk az i-edik sor j-edik elemét függvénnyel: >> matrix(2, 2, (i, j) -> 1/(i+j)) ( 1/2 1/3 1/3 1/4 ) 18. Feladat. Állítsuk elő a 3 3 típusú egységmátrixot az előbbi módon. Útmutatás: A Kronecker delta definíciója: >> f:=(i,j)->(if i=j then 1 else 0 end_if) Diagonális mátrixot a főátlóban lévő elemek felsorolásával is megadhatunk: >> matrix(3, 3, [1, 2, 3], Diagonal) 1 0 0 0 2 0 0 0 3 Állítsuk elő a 2 2 típusú forgatási mátrixot: >> A:=matrix([[cos(x),-sin(x)],[sin(x),cos(x)]]) ( cos(x) sin(x) ) sin(x) cos(x) A subs operátor közvetlen használata nem ad megfelelő eredményt: >> B:=subs(A,x=PI/2) ( cos(0) sin(0) ) sin(0) cos(0) Igazi behelyettesítést a következő módon kapunk: >> map(b,eval) ( 0 1 1 0 ) 9
A mátrixműveletek operátorai a számok műveleti operátoraival megegyeznek. 19. Feladat. Képezzük a tér z tengely körüli π/3 szögű elforgatásának mátrixát! Forgassuk el az (1, 1, 1) t vektort a z tengely körül π/3 szöggel. Képezzük az előző mátrix inverzét, négyzetét! 20. Feladat. Tanulmányozzuk a linalg könyvtár helpjében az alábbi parancsokat linalg::det, linalg::matdim, linalg::rank, linalg::gausselim 21. Feladat. Oldjuk meg t-re az alábbi egyenletet: 1 2 3 4 5 t 2 2 3 4 2 3 5 t 2 1 = 0. 2 3 4 1 Lineáris egyenletrendszerek megoldása Oldjuk meg az alábbi lineáris egyenletrendszert: x + y + 2z + w = 1 3x 4y + z + w = 2 4x 3y + 3z + 2w = 3 Az alapmátrix: >> A:=matrix([[1,1,2,1],[3,-4,1,1],[4,-3,3,2]]) A jobb oldali konstansok: >> B:=matrix(3,1,[1,2,3]) A kibővített alapmátrix: >> C:=linalg::concatMatrix(A,B) A megoldhatóság vizsgálata: >> linalg::rank(a), linalg::rank(c) Mindkét mátrix rangja 2, tehát az egyenletrendszer megoldható, s a megoldástér két dimenziós. A megoldás: >> sol:=linalg::matlinsolve(a,b) A behelyettesítés eredménye egy vektor és egy vektorpár. (Nem írom le, mert Murphy szerint úgysem azt fogja kapni, amit én.) A vektor a lineáris egyenletrendszer egy partikuláris megoldása: >> A*sol[1] A B-t kellett megkapnia. A másik két vektor az iránytér bázisát adja, azaz ezek a vektorok az alapmátrixszal képezett homogén lineáris egyenletrendszer megoldásai: >> A*sol[2][1], A*sol[2][1] Mindkétszer nullvektort kapott. Tehát egy tetszőleges megoldás: mo:=sol[1]+lambda*sol[2][1]+mu*sol[2][2], A*mo 22. Feladat. Oldjuk meg a Maple-ös segédanyagban szereplő lineáris egyenletrendszereket! 10
9. MuPAD programozás 9.1. Ciklusok A hosszú input sorok) gépelésénél a sort Shift Enter-rel törjük. (Az Enter és a Shift Enter szerepét a View menüpontban fel lehet cserélni. A ciklusok szervezésének szokásos módjai a MuPAD-ban is lehetségesek: for ciklus >> for i from 101 to 110 do print(i=ifactor(i)) end_for 23. Feladat. Szervezzük meg az előbbi ciklust a sorozatképző operátorral is ($). 24. Feladat. Tanulmányozzuk a for használatát:?for. while ciklus Emlékeztetőül, a while ciklusban a ciklusmag végrehajtása előtt vizsgáljuk a leállási feltételt. >> i:=1;while i*i<50 do print(i*i);i:=i+1; end_while: 9.2. Feltételvizsgálat Az if then else konstrukciót egy szakaszonként definiált függvény megadásán keresztül illusztráljuk: >> f:=x->(if x<0 then x^2; else if x=0 then 1; else x end_if end_if) Helyettesítsünk be különböző számértékeket, ábrázoljuk a függvényt. 9.3. Eljárások Hasonlítsuk össz az alábbi half eljárást az analóg Maple eljárással: >> Half:=proc(n)/*comment: n/2*/ begin float(n/2) end_proc; proc Half(n)... end >> Half(2/3) 0.3333333333 Az eljárás kezdő sora megegyezik a Maple eljáráséval: megadjuk az eljárás nevét, maga az eljárás a proc és az end_proc közé kerül. A MuPAD parancsok sorozata itt a begin és az end_proc közé kerül 11
A változó típusa Kérjünk információt a változók MuPAD álatl ismert típusairól:?type Módosítsuk az előző eljárást úgy, hogy numerikus n változónál írja ki n/2 numerikus értékét, egyébként pedig formálisan n/2-t. >> Half:=proc(n)/*comment: n/2*/ begin if testtype(x,type::numeric) then return(float(x/2)) else print(n/2) end_if end_proc; (Próbáljuk ki az eljárásunkat!) Rekurzió A rekurzió szervezése is a Maple-höz hasonló. Figyeljük meg az remember opció helyét a következő (már jól ismert) példában: >> Fibo:=proc(n) option remember; begin if n<2 then n; else Fibo(n-2)+Fibo(n-1); end_if end_proc 25. Feladat. írassuk ki az első 30 Fibonacci számot! (Próbáljuk ki a remember opció nélkül is.) 26. Feladat. Írjunk eljárást az n n típusú egységmátrix definiálására. 27. Feladat. Írjunk eljárást, mely egy véletlen n n típusú invertálható mátrixot generál. 28. Feladat. Írjunk eljárást, mely egy listából olyan diagonális mátrixot képez, amely főátlója a lista elemeiből áll. 29. Feladat. Írjunk eljárást, mely az (a 1, a 2,..., a n elemek által generált Vandermond determinánst adja meg, azaz a következő determinánst: 1 a 1 a 2 1 a n 1 1 1 a 2 a 2 2 a n 1 2 1 a n a 2 n a n 1 n 12