Sunteți pe pagina 1din 36

Biblioteci

Maple dispune de un numar impresionant de functii (cteva mii, n continua


crestere cu ecare noua versiune), dar la nceperea sesiunii doar un numar
mic dintre acestea sunt prezente n memorie, restul ramn n biblioteca sistem
aata pe disc. Maple dispune de un mecanism simplu prin care denitia unei
proceduri (de fapt denitia oricarei variabile) devine accesibila functiilor aate
deja n memorie precum si utilizatorului, prin aducerea acesteia n memorie.
Instructiunea Maple care realizeaza acest lucru este read. Multe functii sistem
apeleaza ele nsele aceasta instructiune pentru ncarcarea altor denitii de care
au nevoie. Instructiunea save permite utilizatorului sa creeze propriile siere
cu denitii.
Instructiunea read foloseste att ncarcarii denitiilor aate n biblioteci (n
particular n biblioteca sistem), ct si a celor aate n siere individuale; pentru
ncarcarea din biblioteci este nsa de preferat utilizarea mecanismului de citire
automata descris n continuare. Motivul pentru care Maple utilizeaza biblioteci
n locul unor siere individuale este datorat, pe de o parte, faptului ca n felul
acesta spatiul ocupat pe disc este mult redus, iar pe de alta parte multe sisteme
de operare nu accepta nume de siere de forma celor continute n biblioteci (ca
de exemplu eval/piecewise.m), sau nu disting caracterele majuscule de
cele minuscule.
O biblioteca Maple (sub Windows) consta din doua siere denumite nume.lib si
nume.ind. Primul sier contine informatia propriu zisa (cu siere .m arhivate),
iar cel de-al doilea contine un sistem de indexare pentru rapiditatea accesului;
n plus, majoritatea bibliotecilor sunt nsotite de un sier nume.hdb continnd
subiectele de help organizate ntr-o baza de date. ntr-un director pot exista
mai multe biblioteci Maple (In versiunile mai vechi, ntr-un director putea ex-
ista o singura biblioteca si numele acesteia trebuia sa e maple).. ntretinerea
unei biblioteci (creare, actualizare etc) se face cu comanda march (n versiu-
nile mai vechi, era utilizat un program extern march.exe n acest scop);
nu se recomanda utilizarea acesteia asupra bibliotecii sistem, ci doar asupra
bibliotecilor create de utilizator. Informatii privind utilizarea comenzii march
se obtin cu ?march; aici mentionam doar ca, pentru crearea unei biblioteci
se foloseste comanda march(create,nume, dimensiune) , unde nume este
numele complet al bibliotecii (inclusiv calea dar fara extensia .lib; directorul
trebuie sa existe n momentul apelului; nume poate nsa numele unui director
existent, n acest caz numele bibliotecii ind implicit maple), iar dimensiune
este numarul (aproximativ) de functii pe care le va contine biblioteca (cu pre-
cizarea ca un sier .m poate contine mai multe proceduri Maple, iar n cazul
unui modul trebuie numarate toate elementele exportate de acesta).
Nota: Exista o interfata graca (maplet) pentru comanda march ce poate
lansata cu comanda LibraryTools[Browse](). Parametrii bibliotecilor pot
astfel inspectati si modicati pe cale vizuala.
Variabila globala libname contine secventa tuturor numelor bibliotecilor Maple
(sub forma de string sau symbol) cunoscute sistemului (o biblioteca Maple al
carei nume nu gureaza n libname nu va n general accesata); n libname
n locul unui nume de biblioteca (sier cu extensia .lib) poate sa apara numele
unui director, situatie n care sunt avute n vedere toate bibliotecile existente n
acest director. De exemplu,
> libname;
c:/mymaple/mylib1, "C:\\Program Files\\Maple 8/update",
"C:\\Program Files\\Maple 8/lib", C:\\MVx/share
Se observa ca n acest exemplu apar numai nume de directoare: primul contine o
biblioteca personala, al doilea o biblioteca update continnd corectii furnizate
de producator pentru biblioteca sistem, al treilea contine bibliotecile sistem, iar
ultimul director contine biblioteca share continnd contributii ale utilizato-
rilor; de notat ca este acceptat ca separator de directoare att \ (care trebuie
nsa dublat datorita interpretarii acestui caracter de catre Maple), ct si / (ca
n Unix).
Revenim acum asupra instructiunilor read si save preciznd modul n care sunt
accesate bibliotecile.
Instructiunea read nume sier are urmatorul efect:
Se evalueaza nume sier, rezultatul trebuind sa e de tip string sau symbol,
reprezentnd un nume de sier;
Daca nume sier are extensie diferita de .m, atunci este considerat a
numele unui sier de format text care este ncarcat si executat, ca si
cnd ecare linie a sa ar introdusa de la tastatura (si terminata cu
Enter). Ecoul liniilor citite este conform variabilei de interfata echo, iar
daca sierul contine erori, reactia sistemului este conforma variabilei de
interfata errorbreak.
Daca nume sier are extensie .m, atunci este considerat a numele unui
sier de format binar (intern Maple). Daca sierul cu numele respectiv
este gasit, el este ncarcat si toate denitiile pe care le contine devin ac-
cesibile; nu se produce nici un fel de ecou. Daca sierul individual nu este
gasit, numele acestuia este cautat n acele biblioteci Maple care gureaza
n variabila globala libname, daca directorul bibliotecii poate interpre-
tat ca ind cale (path) pentru numesier. n caz ca exista, este ncarcat
sierul din prima biblioteca gasita, iar daca nu exista, este emis un mesaj
de eroare.
(Daca ntr-un director indicat de libname exista mai multe biblioteci
Maple, cautarea se face n ordine descrescatoare a numarului de prior-
itate asociat bibliotecilor prin comanda march, sau, n caz de egalitate,
n ordine alfabetica.)
De exemplu, daca libname contine
"c:/lib","c:/lib/slib","c:/mv/lib" atunci la instructiunea
> read "c:/lib/slib/test.m";
se va cauta n urmatoarea ordine:
1. sierul test.m din directorul c:/lib/slib
2. sierul slib/test.m din biblioteca aata n directorul c:/lib
3. sierul test.m din biblioteca aata n directorul c:/lib/slib
Instructiunea save v1,v2,...,vn,nume sier are urmatorul efect:
Sunt evaluati la un nume toti parametrii cu exceptia ultimului, care se evalueaza
complet, rezultatul trebuind sa e de tip string sau symbol, reprezentnd
un nume de sier;
Daca nume sier are extensie diferita de .m, atunci este considerat a
numele unui sier de format text n care sunt salvate denitiile variabilelor
v1,v2,...,vn sub forma a n atribuiri (n 1):
Daca nume sier are extensie .m, atunci este considerat a numele unui
sier de format binar (intern Maple). Daca unul dintre numele de directoare
aate n variabila globala libname coincide cu calea (path) a sierului
nume sier, atunci denitiile variabilelor v1,v2,...,vn sunt memorate ntr-un
sier care se depune n prima biblioteca Maple corespunzatoare gasita. n
caz contrar, va creat un sier individual cu numele nume sier continnd
denitiile variabilelor v1,v2,...,vn. (n variantele mai vechi de Maple, era
acceptat si cazul n = 0; situatie n care erau salvate denitiile tuturor
variabilelor asignate.)
Nota: Datorita modului de cautare n biblioteci, se recomanda evitarea prezentei
sierelor de extensie .m n directoare continnd biblioteci Maple. Nu se reco-
manda utilizarea instructiunii read pentru citirea sierelor bibliotecilor, deoarece
prin mecanismul de indexare, ncarcarea din bibliotecile ce gureaza n libname
are loc automat.
Salvarea variabilelor n biblioteci nu se face nsa n general cu instructiunea
save, ci cu comanda savelib(v1,v2,...,vn) : sunt evaluati la un nume toti
parametrii, dupa care are loc salvarea acestora n prima biblioteca gasita n
secventa aata n variabila globala savelibname; daca aceasta variabila glob-
ala nu este asignata sau nu contine nume de directoare valide cu biblioteci
Maple, sunt considerate bibliotecile aate n variabila globala libname; daca
nici aceasta nu contine biblioteci valide, apare o eroare. Se recomanda utilizarea
variabilei savelibname care sa contina numele unei singure biblioteci, pentru
a avea un control precis asupra salvarii.
Functiile (procedurile) de care dispune Maple pot clasicate n 3 categorii:
1. Functii din nucleu. Aceste functii se aa permanent n memorie si
sunt foarte eciente. Numarul acestora este relativ mic (mult sub o
zecime din numarul total), printre acestea amintim: ERROR, map, seq,
substring, iquo, max, min, coeff, degree, sort, diff, expand,
eval, evalf, evalhf, evaln, frontend, convert, op, subs, table,
alias. Aceste proceduri au optiunea builtin si nu pot listate (neind
scrise n limbajul Maple), dar n general nici nu este nevoie, ntruct nu
incumba algoritmi matematici, si sunt oricum putine
+
.
2. Functii uzuale. Acestea nu sunt ncarcate n memorie la nceputul sesiunii,
dupa cum s-a precizat mai sus. Din punct de vedere al utilizatorului,
nu exista nici o deosebire ntre aceste functii si cele din nucleu. Maple
dispune de un mecanism performant de ncarcare a functiilor din biblioteci:
pentru orice nume neasignat n momentul apelului, este consultat indexul
bibliotecilor pentru a preluata denitia sa (daca exista)
|
. Fiind vorba de
+
Secventa acestora poate obtinuta prin comanda anames(builtin);
|
Anterior versiunii Maple 6, nu toate functiile bibliotecii puteau obtinute att de transparent.
O parte a acestora (mai rar folosite) trebuiau ncarcate explicit de utilizator printr-o comanda
readlib (devenita actualmente inutila). De exemplu pentru a putea utilizata functia
log10, trebuia utilizat apelul readlib(log10). Daca o astfel de functie era apelata nainte
de readlib, rezulta un obiect de tip function; de exemplu log10(100) ramnea sub
aceeasi forma si dupa simplicare, dar n urma utilizarii readlib se simplica la 2:
functii aate n biblioteci, ele sunt scrise n limbajul Maple si utilizatorul are
posibilitatea sa le examineze. Pentru aceasta, este sucient sa se execute
comanda interface(verboseproc=2) si sa se evalueze (sau aseze cu
print) functia n cauza. O astfel de examinare a functiilor din biblioteca
Maple poate utila pentru utilizatorul care doreste sa vada modul de
implementare a unor algoritmi matematici, putndu-se astfel perfectiona
n programarea propriilor algoritmi. Maple este probabil singurul program
(comercial) de calcul simbolic care permite asa ceva. Mai exista nca un
motiv pentru care examinarea codului Maple este utila, si anume n cazurile
de functionare defectuoasa; programe de aceasta anvergura nu pot lipsite
de erori.
3. Functii aate n pachete. Unele functii Maple care trateaza o prob-
lema particulara sunt grupate ntr-un pachet. De exemplu n pachetul
orthopoly sunt grupate 6 functii destinate calculului unor tipuri de poli-
noame ortogonale, numele acestora ind G, H, L, P, T si U.
Pentru a putea utiliza functiile unui pachet exista variantele:
1. Se utilizeaza comanda with(numepachet) ; este ntoarsa o lista cu
numele tuturor functiilor aate n pachet, si toate devin accesibile. De
exemplu, cu with(orthopoly) se obtine lista [G; H; L; P; T; U], iar n
continuare H(3,x) va avea ca rezultat polinomul Hermite de grad 3 n x.
2. Cu comanda with(numepachet,f1,f2,...,fn) sunt ncarcate numai
functiile f1,f2,...,fn din pachet (daca nu toate gureaza n pachet, este
emis un mesaj de eroare) si este ntoarsa lista [f1,f2,...,fn]. De exemplu,
cu with(orthopoly,T,H); numai functiile T si H devin accesibile.
3. Orice functie f a unui pachet numepachet poate accesata utiliznd
numele sau lung si anume numepachet[f ]. De exemplu, orthopoly[H](3,x)
furnizeaza polinomul Hermite, chiar daca nici o functie din pachet nu este
ncarcata.
Multe dintre procedurile bibliotecii, care nu sunt destinate folosirii directe de
catre utilizatori, au nume de genul f/f1/f2. Astfel, de exemplu, procedura
simplify (destinata simplicarii expresiilor), apeleaza procedura simplify/exp
atunci cnd urmeaza sa simplice un apel al functiei exponentiale exp.
n felul acesta, integrarea n Maple a unor noi functionalitati este extrem
de simpla. Daca utilizatorul doreste ca functia myfunc pe care a denit-o
sa e prelucrata de simplify, va sucient sa scrie si o procedura nu-
mita simplify/myfunc; se poate inspira n acest scop din procedurile
simplify/xxx existente.
Exemple de proceduri ce pot extinse n acest mod sunt: abs, convert,
diff, evalf, expand, print, series, signum, type, value. Pentru
a le descoperi singuri, puteti examina numele procedurilor aate n memorie
(cu anames()), sau puteti inspecta direct biblioteca Maple cu comanda bib-
liotecar march. Maple este deci un sistem extensibil (Pentru amanunte si
modalitati mai recente de extindere a sistemului Maple, vezi ?extension).
Nota: Informatiile despre o functie f sunt deci localizate n sistem n mai
multe locuri; n afara de procedura f propriu-zisa, mai pot exista procedurile
simplify/f, expand/f etc. n plus, informatiile referitoare la inversa functiei f
sunt localizate n tabela invfunc, care pentru indicele f contine functia inversa
(de exemplu, invfunc[sin]=arcsin, invfunc[arcsin]=sin).
Exista nca o tabela cu numele Invfunc, continnd inverse multivoce pentru
functii neinversabile; de exemplu, Invfunc[sin](x) se simplica la
(1-2*_B1~)*arcsin(x)+Pi*(2*_Z1~+_B1~), variabilele _B1~, _Z1~ ind
cu valori binare, respectiv ntregi (asa cum apar n cadrul comenzii solve,
care de altfel utilizeaza tocmai aceasta tabela). Un utilizator poate completa
sau modica aceste tabele n mod uzual (ind obiecte de tip table). Daca
dorim ca o noua functie sa se integreze armonios n sistem, va trebui sa scriem
toate aceste proceduri si intrari de tabele.
Procedurile bibliotecii Maple pot chiar modicate de catre un utilizator cu
experienta. Este nsa recomandabil ca salvarea functiei modicate sa nu e
facuta n biblioteca Maple initiala (pentru ca o eventuala eroare sa nu mpiedice
functionarea programului si pentru a nu aparea diferente la rularea pe un alt
sistem Maple), ci ntr-o biblioteca proprie. Daca numele directorului n care
se aa biblioteca proprie va precede n variabila libname numele directorului
bibliotecii Maple, functia modicata va preluata din biblioteca proprie.
Pachete, construirea unui pachet Maple
Implementarea pachetelor n Maple este realizata prin doua metode.
Prima metoda este bazata pe tabele (tipul table): numele tabelei co-
incide cu numele pachetului, iar indicii tabelei sunt numele procedurilor
pachetului.
A doua metoda (mai recent introdusa) este bazata pe module; n acest caz,
numele modulului coincide cu numele pachetului, iar procedurile pachetului
sunt cele exportate de modul.
Indiferent de modul de implementare, apelul procedurii f din pachetul P se
poate face prin numele lung P[f ], n cazul implementarii prin module ind
posibila si sintaxa P:-f;
Dupa cum s-a precizat n sectiunea precedenta, comanda with permite uti-
lizarea numelor scurte pentru procedurile pachetului (Sunt executate automat
atribuiri de forma f:=P[f] ); pentru a efectiva, comanda with trebuie apelata
de la nivelul liniei de comanda (top level).
Lista pachetelor ncarcate (cu with) este furnizata de comanda packages() .
La ncarcare completa a pachetului P cu comanda with(P), sunt apelate (daca
exista) procedurile de initializare ale pachetului; n cazul modulelor, procedura
(exportata) de initializare este P:-ModuleLoad, iar n cazul tabelelor proce-
dura de initializare este P[init]. De notat faptul ca aceste proceduri de
initializare nu mai sunt executate a doua oara, chiar daca este reexecutata co-
manda with(P). Daca numele unei variabile globale g coincide cu un nume scurt
generat de with la ncarcarea pachetului, este emis un mesaj de avertisment,
dupa care vechea variabila g nu mai este accesibila (chiar daca era protejata)
n cazul pachetelor implementate prin tabele; n cazul celor implementate prin
module poate accesata prin apelativul :-g .
Pentru dezinstalarea unui pachet instalat anterior cu with se poate folosi co-
manda unwith(P) ; aceasta comanda nu functioneaza nsa dect n cazul pa-
chetelor implementate prin module. Majoritatea pachetelor actuale au fost
(re)implementate prin module astfel nct n versiunea 9.5 pachetele ramase
tabelare sunt: algcurves, combstruct, DEtools, dialg, diorms, Domains,
inttrans, liesymm, LRETools, Matlab, networks, PDEtools, plots, simplex, Slode,
stats, student, tensor
Pentru a testa daca pachetul P este implementat prin tabele sau prin module
pot folosite apelurile type(P, module) si/sau type(P, table) .
> type(linalg,module), type(plots,module), type(student,table);
true, false, true
Vom construi n continuare un pachet simplu destinat aritmeticii intervalelor.
Pachetul va contine doar doua functii: suma si prod care vor implementa
operatiile elementare de adunare si nmultire a intervalelor. Un interval (nchis)
[a; b] R va reprezentat prin functia inerta INT(a,b).
Suma a doua intervale [a; b] si [c; d] este prin denitie intervalul x +y : x
[a; b]; y [c; d]; si similar pentru produs.
Va implementat tipul Maple INT destinat recunoasterii intervalelor de forma
INT(a,b).
Vom construi doua variante ale pachetului pINT: prin tabele si prin module.
Metoda recomandata de construire a pachetelor este cea pe baza de module,
dar n biblioteca Maple exista nca pachete implementate prin tabele, astfel
nct cunoasterea modului de realizare a acestora este utila.
a) Implementare prin tabele
> pINT:=table();
> pINT[init]:=proc()
> global type/INT;
> type/INT:=INT(realcons,realcons)
> end;
> pINT[suma]:=proc(u::INT,v::INT)
> INT(op(1,u)+op(1,v),op(2,u)+op(2,v))
> end;
> pINT[prod]:=proc(u::INT,v::INT)
> local w;
> w:=op(1,u)*op(1,v),op(1,u)*op(2,v),op(2,u)*op(1,v),op(2,u)*op(2,v);
> INT(min(w),max(w))
> end;
Vom testa acum procedurile pachetului astfel denite;
> pINT[init](); #acum tipul INT este accesibil
> with(pINT);
[init, prod, suma]
> suma(INT(2,3),INT(10,20));
INT(12; 23)
> prod(INT(2,3),INT(-20,10));
INT(60; 30)
Procedurile functioneaza corect. Vom crea o biblioteca si vom salva pachetul
n aceasta.
> march(create, "c:/mylib", 100); #directorul trebuie s a existe!
> savelibname:="c:/mylib":
> savelib(pINT);
Pentru testarea nala, vom apela functiile direct din biblioteca, dupa reinitializarea
nucleului Maple:
> restart:
> libname:="c:/mylib",libname;
libname := "c:/mylib", "C:\\Program Files\\Maple 9.5/lib"
> with(pINT);
[init, prod, suma]
> suma(INT(2,3),INT(10,20));
INT(12; 23)
> prod(INT(-2,sqrt(3)),INT(10,20));
INT(40; 20
_
3)
Asadar, pachetul functioneaza corect. De remarcat faptul ca procedura init
este apelata de sistem n momentul ncarcarii pachetului cu comanda with, ceea
ce permite functionarea celorlalte proceduri din pachet care o utilizeaza. Pa-
chetul are nsa o mica slabiciune: nu pot utilizate numele lungi (pINT[suma],
pINT[prod]) fara a folosita comanda with. Acest lucru se ntmpla toc-
mai datorita faptului ca tipul INT denit n procedura init este necunoscut
sistemului nainte de with! Daca procedurile suma si prod nu ar recurs la
testarea argumentelor, totul ar decurge normal! Se va vedea n continuare ca
implementarea pachetelor bazata pe module nu pune astfel de probleme.
b) Implementarea aceluiasi pachet utiliznd modulele decurge astfel:
> pINT:=module()
> description "Pachet pentru adunarea si inmultirea intervalelor";
> export suma,prod;
> local setup;
> option package, load = setup;
>
> setup :=proc()
> global type/INT;
> type/INT:=INT(realcons,realcons)
> end;
>
> setup(); #se apeleaza acum!
>
> suma:=proc(u::INT,v::INT)
> INT(op(1,u)+op(1,v),op(2,u)+op(2,v))
> end;
>
> prod:=proc(u::INT,v::INT)
> local w;
> w:=op(1,u)*op(1,v),op(1,u)*op(2,v),op(2,u)*op(1,v),op(2,u)*op(2,v);
> INT(min(w),max(w))
> end;
>
> end module:
Pentru testare, procedam similar:
> with(pINT);
[prod, suma]
> suma(INT(2,3),INT(10,20));
INT(12; 23)
> prod(INT(2,3),INT(-20,10));
INT(60; 30)
> march( create, "c:/mylib", 100 );
Error, (in march) there is already an archive in "c:/mylib"
La crearea bibliotecii va aparea un mesaj de eroare daca aceasta exista deja.
Acest mesaj poate ignorat: n cazul nostru biblioteca a fost creata anterior si
intentionam sa nlocuim vechiul pachet cu cel nou bazat pe module.
> savelibname:="c:/mylib";
savelibname := "c:/mylib"
> savelib(pINT);
Testarea se face exact ca n cazul precedent. Acum vor putea utilizate si
nume lungi nainte de with, ntruct la apelul primei functii din pachet este
apelata procedura setup() care deneste tipul INT.
> restart:
> libname:="c:/mylib",libname;
libname := "c:/mylib", "C:\\Program Files\\Maple 10/lib"
> pINT[suma](INT(2,3),INT(20,30));
INT(22; 33)
> with(pINT);
[prod, suma]
> prod(INT(-2,sqrt(3)),INT(10,20));
INT(40; 20
_
3)
> type(INT(0,Pi),INT);
true
Nota: Pentru examinarea continutului bibliotecii nou create putem utiliza co-
manda march(list,"c:/mylib"); se va obtine o lista cu numele sierelor
continute n biblioteca, data crearii, adresa si dimensiunea acestora:
[[":-3.m", [2005, 9, 5, 22, 56, 34], 1415, 88],
["pINT.m", [2005, 9, 5, 22, 56, 34], 1024, 200],
[":-1.m", [2005, 9, 5, 22, 56, 34], 1503, 139],
[":-2.m", [2005, 9, 5, 22, 56, 34], 1224, 191]]
Se observa ca pe lnga sierul "pINT.m" sunt prezente nca 3 siere cu nume
numerice; acestea sunt create automat de Maple (n cazul modulelor) n
vederea uniformizarii interne a prelucrarilor.
Pentru a introduce o foaie de help (att n varianta table ct si n cea module)
se poate proceda astfel:
Se completeaza o foaie de calcul cu continutul dorit. n acest scop poate
preluata cu copy&paste o foaie de help dintre cele existente si se modica,
sau se tasteaza de la nivelul liniei de comanda ?examples/CommandTemplate
obtinndu-se astfel un schelet care contine si cteva recomandari de completare.
Dintre acestea, mentionam pastrarea paragrafelor: Calling Sequences, Parame-
ters, Description, Examples, See Also.
n nal este accesat meniul Help/Save to Database... si se completeaza
rubricile Topic, Parent, Aliases iar n cmpul Database este trecut numele
directorului sau al sierului ce va contine baza de date de help, n cazul nostru
"c:/mylib" sau "c:/mylib/maple.hdb".
Nota: Daca dorim ca functiile pachetului sa e accesibile chiar de la nceputul
sesiunii Maple, fara a trebui sa ncepem prin a actualiza variabila libname, se
poate introduce linia:
libname:="c:/mylib",libname;
n sierul "maple.ini" din unul din directoarele:
directorul curent, "Maple 10/Users" sau "Maple 10/Users/numeutilizator"
(n cazul configur arii Maple n modul multi-user).
(acest sier va trebui creat daca nu exista; Maple va prelua primul sier gasit
din directoarele mentionate).
Daca numele bibliotecii ar fost ales diferit de maple (si de restul bibliotecilor
sistemului), am putut pur si simplu plasa sierele .lib si .ind n directorul
c:\Program Files\Maple 10\lib.

S-ar putea să vă placă și