Upload
scheiber
View
221
Download
0
Embed Size (px)
Citation preview
8/17/2019 Calcul Stiintific Java
1/210
Ernest SCHEIBER
JAVA ÎNCALCULUL ŞTIINŢIFIC
Bra̧sov
2016
8/17/2019 Calcul Stiintific Java
2/210
2
8/17/2019 Calcul Stiintific Java
3/210
Cuprins
I Programarea aplicaţiilor numerice ı̂n Java 9
1 Aplicaţii numerice simple 11
1.1 Pseudocodul unui algoritm iterativ . . . . . . . . . . . . . . . . . . . . . . 111.2 Metode numerice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Probleme conexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
1.3.1 Jurnalizare . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1.3.2 Verificarea rezultatelor cu junit . . . . . . . . . . . . . . . . . . . . 16
1.3.3 Unealta de dezvoltare apache-ant . . . . . . . . . . . . . . . . . . . 17
1.3.4 Gestiunea proiectelor cu apache-maven . . . . . . . . . . . . . . . . 20
1.4 O mini-bibliotecă numerică . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
1.5 Formatarea rezultatetor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
1.6 Rezolvarea problemelor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.7 Dezvoltarea mini-bibliotecii cu apache-maven . . . . . . . . . . . . . . . . 36
1.8 Utilizare prin OSGi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39
2 Accesarea ı̂n Java a unor produse matematice 47
2.1 Java cu Mathematica . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.2 Java cu Maple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.3 Java cu Scilab . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
3 Pachete Java de calcul numeric 65
3.1 apache commons-math . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653.2 Jama . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71
4 Calcul simbolic ı̂n Java 73
4.1 Calcul simbolic prin Mathematica . . . . . . . . . . . . . . . . . . . . . . . 73
4.2 Calcul simbolic prin Maple . . . . . . . . . . . . . . . . . . . . . . . . . . 74
4.3 Symja - Java Computer Algebra Library . . . . . . . . . . . . . . . . . . . 75
5 Expresie de calcul dată ca String 77
5.1 Java Expression Parser - JEP . . . . . . . . . . . . . . . . . . . . . . . . . 77
5.2 MathEclipse-Parser . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 80
3
8/17/2019 Calcul Stiintific Java
4/210
4 CUPRINS
6 Aplicaţii cu interfaţă grafică 836.1 Rezolvarea unei ecuaţii algebrice . . . . . . . . . . . . . . . . . . . . . . . . 83
6.1.1 Interfaţa grafică bazată pe JavaFX . . . . . . . . . . . . . . . . . . 846.2 Rezolvarea unui sistem algebric de ecuaţii liniare . . . . . . . . . . . . . . . 866.2.1 Interfaţa grafică bazată pe Swing . . . . . . . . . . . . . . . . . . . 86
7 Generarea reprezentărilor grafice 917.1 PtPlot . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 917.2 jfreechart . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 957.3 VisAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1007.4 Vizualizarea funcţiilor complexe . . . . . . . . . . . . . . . . . . . . . . . . 108
8 Aplicaţii Web 125
8.1 Servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1278.1.1 Codul unui servlet . . . . . . . . . . . . . . . . . . . . . . . . . . . 1288.1.2 Program client al unui servlet . . . . . . . . . . . . . . . . . . . . . 1328.1.3 Dezvoltarea unui servlet prin maven . . . . . . . . . . . . . . . . . 1338.1.4 Servlet ca modul OSGi . . . . . . . . . . . . . . . . . . . . . . . . . 135
8.2 WebSocket . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1388.2.1 Interfaţa de programare HTML5 de client WebSocket . . . . . . . . 1 3 88.2.2 WebSocket ı̂n Java . . . . . . . . . . . . . . . . . . . . . . . . . . . 1408.2.3 Client Java pentru WebSocket . . . . . . . . . . . . . . . . . . . . . 144
8.3 Google Web Toolkit (GWT) . . . . . . . . . . . . . . . . . . . . . . . . . . 145
8.3.1 Dezvoltarea unei aplicaţii cu GWT . . . . . . . . . . . . . . . . . . 1468.4 Desf̆aşurarea ı̂n nor . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
9 Încărcarea unui fişier - upload 1599.1 Preluarea unei matrice prin funcţii Javascript . . . . . . . . . . . . . . . . 1599.2 FileUpload . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
10 Servicii Web 16710.1 Descrierea unui serviciu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16810.2 Modelul JAX-WS prin Metro . . . . . . . . . . . . . . . . . . . . . . . . . 168
10.2.1 Serviciu JAX-WS ca servlet . . . . . . . . . . . . . . . . . . . . . . 169
10.3 Modelul JAX-RS prin jersey . . . . . . . . . . . . . . . . . . . . . . . . . . 172
II Programare paralelă ı̂n Java 179
11 Introducere ı̂n programarea concurentă 18111.1 Procese paralele . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18111.2 Probleme specifice calculului paralel . . . . . . . . . . . . . . . . . . . . . . 18411.3 Eficienţa programelor paralele . . . . . . . . . . . . . . . . . . . . . . . . . 18611.4 Programare paralelă ı̂n Java . . . . . . . . . . . . . . . . . . . . . . . . . . 189
11.5 Metode numerice paralele . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
8/17/2019 Calcul Stiintific Java
5/210
CUPRINS 5
12 Algoritm paralel şi iterativ 19312.1 Algoritm paralel şi iterativ asincron . . . . . . . . . . . . . . . . . . . . . . 194
13 OpenCL prin Aparapi 19713.1 Aparapi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19713.2 Programare ı̂n aparapi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19813.3 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
Bibliografie 209
8/17/2019 Calcul Stiintific Java
6/210
6 CUPRINS
8/17/2019 Calcul Stiintific Java
7/210
Prefaţă
Lucrarea de faţă are ca obiectiv problematica legată de implementarea ı̂n Java aaplicaţiilor de calcul ştiinţific şi este o versiune actualizată a lucrării noastre, [10].
Din partea cititorului vom presupune existenţa unor abilităţi de programare ı̂n Javaşi binêınţeles, cunoştinţe elementare de calcul numeric. Anumite părţi din lucrare cercititorului familiarizarea cu un anumit produs informatic. Pentru fiecare produs utilizat,Internetul oferă o mulţime de informaţii privind instalarea, utilizarea, exemple, interfaţade programare, răspunsuri la ı̂ntrebări frecvente, etc.
Implementarea unei metode de calcul numeric bazat pe un algoritm iterativ este e-xemplificată prin crearea unei mini-biblioteci de programe numerice care este folosit peparcursul lucrări. Pentru configurarea şi executarea sarcinilor se va utiliza cu precădereapache-ant.
Vom pune ı̂n evidenţă posibilitatea utilizării ı̂n Java a resurselor oferite de produselematematice Mathematica, Maple şi Scilab.
Utilizarea limbajului de programare Java ı̂n calculul ştiinţific este reprezentată prin
biblioteci de clase pentru rezolvarea unor probleme specifice domeniului. Lucrarea exem-plifică doar folosirea pachetele apache commons-math şi Jama.
O evidenţă şi observaţii comparative a resurselor de calcul ştiinţific se găsesc pe In-ternet [13, 14].
Utilizarea unei funcţii definită printr-un şir de caractere este o problemă de programarespecifică unei aplicaţii de calcul numeric care se doreşte utilizată prin intermediul uneiinterfeţe grafice sau ı̂n mediu distribuit.
Interfeţele grafice şi aspecte privind vizualizarea unor obiecte matematice sunt deasemenea atinse. Este dat un exemplu de interfaţă grafică programată ı̂n JavaFX, pachetdezvoltat ı̂n ultimii ani, parte din distribuţia Java Development Kit - JDK. Se prezintă
soluţii pentru vizualizarea graficului unei funcţii, prin intermediul unor produse special-izate, integrabile ı̂n aplicaţii Java.
Tipurile de aplicaţii distribuite tratate ı̂n lucrare sunt aplicaţiile Web bazate pe servletşi serviciile Web dezvoltate pe modelul apelului de procedură la distanţă (Remote Proce-dure Call) dar şi serviciile REST. Exemplificările utilizează pachetele metro şi respectiv, jersey. Prin utilizarea pachetului apache commons-fileupload este dată o soluţie pentruı̂ncărcarea unui fişier.
În prezent calculatoarele uzuale permit efectuarea de calcule ı̂n paralel prin unitateade procesare grafică (GPU). Exemplificăm tehnica de programare ı̂n Java prin produsulAparapi, bazat pe OpenCL.
Codurile tuturor programelor din lucrare pot fi descărcate de la adresa
7
8/17/2019 Calcul Stiintific Java
8/210
8 CUPRINS
https://github.com/e-scheiber/Scientific_Computing_and_Java.git.
https://github.com/e-scheiber/Scientific_Computing_and_Java.githttps://github.com/e-scheiber/Scientific_Computing_and_Java.githttps://github.com/e-scheiber/Scientific_Computing_and_Java.git
8/17/2019 Calcul Stiintific Java
9/210
Partea I
Programarea aplicaţiilor numerice ı̂nJava
9
8/17/2019 Calcul Stiintific Java
10/210
8/17/2019 Calcul Stiintific Java
11/210
Capitolul 1
Aplicaţii numerice simple
Scopul acestui capitol este prezentarea unui mod de implementare ı̂n limbajul de pro-gramare Java a unor metode numerice. Se vor utiliza mai multe produse informaticeajutătoare dar nu vom face apel la un mediu integrat de dezvoltare (Integrated Develop-ment Environment - IDE). Motivaţia acestei opţiuni este simplă: un mediu integrat dedezvoltare acoperă (ascunde, face transparentă) multe din activităţile care se ı̂ntreprind.În plus, din punct de vedere educativ, nu dorim să promovăm un anumit mediu integratde dezvoltare ı̂n dauna altuia.
Pentru ı̂nceput ne propunem să calculăm:
1. Soluţia negativă a ecuaţiei 2x − x2 = 0.
Ecuaţia are 3 soluţii x1 ≈ −0.7666647 ∈ (−1, −1
2 ), x2 = 2, x3 = 4;
2. Integrala π
4
0 ln(1 + tan x)dx = π
8 ln 2 ≈ 0.2721983;
probleme pentru care se vor realiza programe simple. Apoi aceste programe vor fi dez-voltate pentru a putea trata un caz general şi pentru a putea fi utilizate ı̂n mediu distribuit.
Rezolvarea numerică a unei probleme de calcul numeric conduce de multe ori la con-struirea unui şir (xk)k∈N, despre care se arată că converge ı̂ntr-un sens către soluţia prob-lemei. Rezultate privind evaluarea erorii, a vitezei de convergenţă, a complexităţii unuialgoritm sunt factori care prezintă importanţă ı̂n alegerea metodei de rezolvare numericăa unei probleme.
Aspectele care ne interesează privesc implementarea metodelor de rezolvare numericăutilizând limbajul de programare Java.
1.1 Pseudocodul unui algoritm iterativ
Una dintre proprietăţile unui algoritm este finitudinea. Pentru aceasta este nevoie deo regulă de oprire. Spre exemplificare, ı̂n cadrul unei probleme numerice, o regulă deoprire simplă este:
Dacă eroarea relativă (absolută) a aproximaţiei xk+1 = Y pentru xk = X este mai
mică decât un număr pozitiv eps, sau dacă numărul de iteraţii executate ni este egal cu
11
8/17/2019 Calcul Stiintific Java
12/210
12 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
numărul maxim admis de iteraţii nmi atunci programul se opreşte; altfel se trece la onouă iteraţie.
După oprirea calculelor, se poziţionează un indicator de răspuns ind pe 0, dacă eroarearelativă este mai mică decât eps, iar ı̂n caz contrar pe 1.
Numărul eps este denumit toleranţă de calcul sau test de precizie.
Natura problemei poate impune şi alte condiţii pentru terminarea procesului de calculiar valoarea parametrului ind va preciza felul ı̂n care a avut loc oprirea calculului.
Pseudocodul algoritmului metodei iterative este
Algorithm 1 Pseudocodul metodei iterative
1: procedure metoda iterativă2: generarea aproximaţiei iniţiale Y
3: ni ← 04: do5: ni ← ni + 16: X ← Y 7: generarea aproximaţiei următoare Y 8: d ← Y −X X 9: while (d ≥ eps) şi (ni < nmi)
10: if d < eps then11: ind ← 012: else13: ind
← 1
14: end if 15: return Y 16: end procedure
În Java există posibilitatea ca ı̂n locul limitării numărului maxim admis de iteraţiisă fie fixată durata maximă admisă de timp de calcul [9]. Această abordare utilizeazăprogramare concurentă prin fire de execuţie, tematică ce nu face obiectul acestei lucrări.
1.2 Metode numerice pentru rezolvarea problemelorCalculul soluţiei negative a ecuaţiei 2x − x2 = 0
Determinarea soluţie negative a ecuaţei f (x) := 2x−x2 = 0 se va face utilizând metodatangentei [5, 3]:
xk+1 = xk − f (xk)f (xk)
. (1.1)
Dacă aproximaţia iniţială x0 este aleasă ı̂ntr-o vecinătate convenabil˘ a a unei soluţii, atuncişirul (1.1) converge către aceea soluţie.
Aproximaţia iniţială o vom alege x0 = −0.5.
8/17/2019 Calcul Stiintific Java
13/210
1.2. METODE NUMERICE 13
Derivata f (x) a funcţiei date de membrul stâng al ecuaţiei, ı̂ntr-un punct, va fi calcu-lată numeric utilizând extrapolarea Richardson, [3]. Se construieşte tabloul subdiagonal
D0,0D1,0 D1,1
... ...
. . .
Dm,0 Dm,1 . . . Dm,m
folosind formulele de recurenţă
Dk,0 = f (x + h
2k) − f (x − h
2k)
h2k
k = 0, 1 . . . , m;
Dk,j = 4 j
4 j − 1Dk,j−1 − 1
4 j − 1Dk−1,j−1 j = 1, 2, . . . , m;k = j, j + 1, . . . , m .
Aproximaţia derivatei va fi Dm,m.
Datele de intrare pe care utilizatorul - clientul - trebuie să le furnizeze sunt:
• expresia lui f (x);• aproximaţia iniţială;
• toleranţa;
• numărul maxim admis de iteraţii.Datele de ieşire pe care le aşteptăm să le primim de la programul de calcul sunt:
• indicatorul de răspuns al programului;• aproximaţia soluţiei obţinute;• valoarea membrului stâng al ecuaţiei calculată ı̂n soluţia aproximativă obţinută;
• numărul iteraţiilor efectuate.
De multe ori prezintă interes urmărirea evoluţiei rezultatelor intermediare. Accesul laaceste date va fi o cerinţă a programelor ce vor fi dezvoltate.
Calculul integralei π
4
0 ln(1 + tan x)dx
Pentru calculul integralei se va utiliza o schemă adaptivă bazată pe metoda lui Simpson[11]
b
a
f (x)dx = b − a
6m
[f (a) + 2m−1
i=1
f (a2i) + 4m−1
i=0
f (a2i+1) + f (b)]
− (1.2)
8/17/2019 Calcul Stiintific Java
14/210
14 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
−(b − a)5
2880m4f (4)(ξ ),
unde ai = a + i
b
−a
2m , i ∈ {0, 1, . . . , 2m}.Practic, integrala se aproximează prin
J m = b − a
6m [f (a) + 2
m−1i=1
f (a2i) + 4m−1i=0
f (a2i+1) + f (b)]
ultimul termen din (1.2), denumit rest, se neglijează. Astfel apare o eroare de metodă carese suprapune peste erorile de rotunjire datorate reprezentării numerelor reale ı̂n virgulămobilă din memoria unui calculator şi calculului aritmetic corespunzător.
Schema adaptivă constă din calculul unui şir (J mk)k. Elementele şirului se calculeazăpână la ı̂ndeplinirea unei condiţii din regula de oprire. Şirul (mk)k∈N il vom defini prin
formula de recurenţă mk+1 = 2mk.În acest fel, dacă notăm prin S pm, S im sumele
S pm =m−1i=1
f (a2i) şi S im =
m−1i=0
f (a2i+1)
atunci S pm+1 = S pm + S
im. La fiecare nouă iteraţie va trebui calculată doar suma S
im+1.
Datele de intrare pe care clientul trebuie să le furnizeze sunt:
• expresia de integrat f (x);
• limitele de integrare;• toleranţa;• numărul maxim admis de iteraţii.Datele de ieşire pe care le aşteptăm să le primim de la programul de calcul sunt:
• indicatorul de răspuns al programului;• aproximaţia integralei;
• numărul iteraţiilor efectuate.
1.3 Probleme conexe
La elaborarea şi dezvoltarea programelor suntem confruntaţi cu problemele:
• Jurnalizarea adică afişarea / reţinerea rezultatelor sau evenimentelor ı̂ntr-un fişier.Deseori prezintă interes evoluţia procesului de calcul prin prisma unor rezultate in-termediare. În acest sens se pot utiliza pachetele / produsele: java.util.loggingdin jdk, apache-log4j (The Apache Software Foundation ) - www.apache.org,slf4j (Simple Logging Facade for Java ) - www.QOS.ch, Quality of Open Software,
logback - logback.qos.ch.
http://www.apache.org/http://www.apache.org/http://www.qos.ch/http://localhost/var/www/apps/conversion/tmp/scratch_1/logback.qos.chhttp://localhost/var/www/apps/conversion/tmp/scratch_1/logback.qos.chhttp://localhost/var/www/apps/conversion/tmp/scratch_1/logback.qos.chhttp://www.qos.ch/http://www.apache.org/
8/17/2019 Calcul Stiintific Java
15/210
1.3. PROBLEME CONEXE 15
• Verificarea rezultatelor obţinute. Fiind dat rezultatul, fiecare dintre problemele pro-puse este o problemă de test. Rolul unei probleme de test este verificarea funcţionăriiprogramului de rezolvare, depistarea unor greşeli. În acest sens vom utiliza produsul junit.
Alt produs cu acelaşi scop este TestNG.
• Dezvoltarea aplicaţiei, ı̂n sensul simplificării operaţiilor de compilare, arhivare, ru-larea problemelor de test, etc. Vom arăta modul de folosire pentru
– apache-ant. Se presupune că toate resursele utilizate, cuprinse uzual ı̂n fişierecu extensia jar ( j ava ar hive) sunt disponibile pe calculatorul local. Dacăcalculatorul este conectat la Internet, atunci, folosind suplimentar apache-ivy,resursele publice pot fi descărcate ı̂mpreună cu toate dependinţele şi utilizate
prin apache-ant .– apache-maven 1 este un alt cadru de dezvoltare şi gestiune a proiectelor (Project
management framework). Calculatorul pe care se dezvoltă proiectul / aplicaţiatrebuie să fie conectat la Internet. Resursele necesare ı̂ndeplinirii diferitelorsarcini (maven artifacts ) sunt preluate din Internet şi depuse ı̂ntr-un depozitlocal maven (local repository ). În prezent sunt ı̂ntreţinute depozite publicede resurse soft necesare dezvoltării de aplicaţii cu maven 2 iar dezvoltatorii deinstrumente soft au posibilitatea de a-şi promova produsele prin depunereaı̂ntr-un depozit maven . Dintr-un asemenea depozit public resursele necesaresunt descărcate ı̂n depozitul local.
1.3.1 Jurnalizare
Jurnalizare prin java.util.logging
Şablonul de programare cu afişarea mesajelor pe ecranul monitorului este
1 import j a v a . u t i l . l o g g i n g . L o g g er ;
3 p ub l ic c l a s s Exemplu{4 s t a t i c L o g g er l o g g e r = L o g g er . g e t L o g g e r ( E xe mp lu . c l a s s . getName () ) ;
6 p u bl i c s t a t i c vo id m ai n ( S t r i n g a r g s [ ] ) {7 lo gg e r . s e v e re (”SEVERE : He ll o” );
8 lo gg er . warning (”WARNING : Hel lo ” ) ;9 l o g g e r . i n f o ( ” INFO : H e l l o ” ) ;10 }11 }
Programul afişează
Jan 23, 2013 2:34:40 PM Exemplu main
SEVERE: SEVERE : HelloJan 23, 2013 2:34:40 PM Exemplu main
WARNING: WARNING : Hello
Jan 23, 2013 2:34:40 PM Exemplu main
INFO: INFO : Hello
1Maven – acumulator de cunoştinţe (Idiş).2
De exemplu repo1.maven.org/maven2.
http://localhost/var/www/apps/conversion/tmp/scratch_1/repo1.maven.%20org/maven2http://localhost/var/www/apps/conversion/tmp/scratch_1/repo1.maven.%20org/maven2
8/17/2019 Calcul Stiintific Java
16/210
16 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Dacă dorim ca rezultatele să fie ı̂nscrise ı̂ntr-un fişier, de exemplu logging.txt atunci clasade mai sus se modifică ı̂n
1 import j a v a . u t i l . l o g g i n g . L o g g er ;2 import j a v a . u t i l . l o g g i n g . F i l e H a n d l e r ;3 import j a v a . u t i l . l o g g i n g . S i m p l eF o r m a t te r ;4 import jav a . io . IOExceptio n ;
6 p ub l ic c l a s s Exemplu{7 s t a t i c L o g g er l o g g e r = L o g g er . g e t L o g g e r ( E xe mp lu . c l a s s . getName () ) ;
9 p u bl i c s t a t i c vo id m ai n ( S t r i n g [ ] a r g s ) {10 tr y{11 F i le H an d le r l o g g i n g F i l e = new F i l e H a n d l e r ( ” l o g g i n g . t x t ” ) ;12 l o g g i n g F i l e . s e t F o rm a t t e r (new S i m p l eF o r m a t te r ( ) ) ;13 l o g g e r . a d d Ha n dl e r ( l o g g i n g F i l e ) ;14 }15 catch ( I O E x ce p ti o n e ) {16 Syste m . out . pr in tl n ( e . ge tMe s s age ( ) ) ;
17 }18 lo gg e r . s e v e re (”SEVERE : He l lo ” );19 lo gg er . warning (”WARNING : He ll o ” ) ;20 l o g g e r . i n f o ( ” INFO : H e l l o ” ) ;21 }22 }
1.3.2 Verificarea rezultatelor cu junit
junit permite verificarea automată a rezultatelor furnizate de un program, pentru omulţime de date de test.
Utilizarea produsului necesită declararea ı̂n variabila de sistem classpath a fişierelor junit-*.jar, hamcrest-core-*.jar.
Utilizarea produsului ı̂ntr-un program Java constă din:
1. Declararea resurselor pachetului junit prinimport org.junit.*;
import static org.junit.Assert.*;
2. Declararea clasei cu testele junit - uzual ı̂n metoda main.org.junit.runner.JUnitCore.main("AppClass ");
3. Eventuale operaţii necesare ı̂nainte sau după efectuarea testelor se precizează re-spectiv, ı̂n câte o metodă care a fost declarată cu adnotarea @org.junit.Before şirespectiv, @org.junit.After.
4. Testele se definesc ı̂n metode declarate cu adnotarea @org.junit.Test.
Clasa Assert posedă metodele de verificare ale unui rezultat:
• static void assertEquals(Tip aşteptat , Tip actual )unde Tip poate fi double, int, long, Object.
• static void assertEquals(double aşteptat, double actual, double delta )Testul reuşeşte dacă |aşteptat-actual | < delta.
8/17/2019 Calcul Stiintific Java
17/210
1.3. PROBLEME CONEXE 17
• static void assertArrayEquals(Tip[ ] aşteptat , Tip[ ] actual )unde Tip poate fi byte, char, int, long, short, Object.
• static void assertTrue(boolean condit ̧ie )• static void assertFalse(boolean condit ̧ie )• static void assertNull(Object object )• static void assertNotNull(Object object )
În cazul exemplului
1 import o r g . j u n i t . ∗ ;2 im po rt s t a t i c o r g . j u n i t . A s s e r t .∗ ;
4 p ub l ic c l a s s Exemplu{5 public double r e z u l t a t = 1 . 0 ;6 public double eps=1e−6;
8 double ge tValue () {9 return 1 . 0 0 0 0 0 0 1 ;10 }
12 @Test13 p u b l ic vo id t e s t ( ){14 a s s e r t E q u a l s ( r e z u l t a t , g e t V a l u e ( ) , e p s ) ;15 }
17 p u bl i c s t a t i c vo id m ai n ( S t r i n g [ ] a r g s ){18 org . ju ni t . runne r . JUnitCore . main( ”Exemplu” ) ;19 }20 }
se obţine
JUnit version 4.5
.
Time: 0.03
OK (1 test)
1.3.3 Unealta de dezvoltare apache-ant
Începem această secţiune prin a introduce câteva elemente privind sintaxa ı̂ntr-undocument xml pentru că apache-ant face apel la un fişier xml.
XML
Extensible Markup Language (XML) reprezintă un limbaj pentru definirea marcajelorde semantică, care ı̂mpart un document ı̂n părţi identificabile ı̂n document.
Totodată XML este un meta-limbaj pentru definirea sintaxei de utilizat ı̂n alte domenii.XML descrie structura şi semantica şi nu formatarea.Structura unui document XML este
corpul documentului alcatuit din elemente
8/17/2019 Calcul Stiintific Java
18/210
18 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Prima linie reprezintă declaraţia de document XML.Corpul documentului este alcătuit din elemente. Începutul unui element este indicat
printr-un marcaj. Textul marcajului constituie denumirea elementului. Elementele pot ficu corp, alcătuit din alte elemente, având sintaxa
corpul elementului
sau fără corp, caz ı̂n care sintaxa este
Un marcaj poate avea atribute date prin sintaxa
numeAtribut="valoareAtribut"
Valoarea unui atribut este cuprinsă ı̂ntre ghilimele (””).
corpul elementului
Există un singur element rădăcină. Elementele unui document XML formează unarbore. Fiecărui marcaj de ı̂nceput al unui element trebuie să-i corespundă un marcaj de
sfârşit. Caracterele mari şi mici din denumirea unui element sunt distincte (case sensitive ).Elementele ı̂ncuibărite (nested )- incluse ı̂ntr-un alt element - nu se pot amesteca, adicăun marcaj de sfârşit corespunde ultimului marca j de ı̂nceput.
Un comentariu se indică prin
Exemplul 1.3.1 Fi̧sier XML - denumirile elementelor şi cont ̧inutul lor permit ı̂nt ̧elegerea simpl˘ a a semanticii introduse ı̂n document.
1 2 3 < d i s c i p l i n a f e l =” o b l i g a t o r i u ”>4 A n a l i z a n u m er i c a 5 6 2 7 1 8 1 9 10 11 < d i s c i p l i n a f e l =” o b l i g a t o r i u ”>12 P ro gr am ar e d i s t r i b u i t a 13 14 2
15 0
8/17/2019 Calcul Stiintific Java
19/210
1.3. PROBLEME CONEXE 19
16 2 17 18 19 < d i s c i p l i n a f e l =” o b l i g a t o r i u ”>20 S o f t m a te m at i c 21 22 2 23 0 24 1 25 26 27
Amintim faptul că reprezentarea obiectelor matematice prin elemente XML consti-tuie subiectul a două proiecte MathML şi OpenMath. Obiectivul limbajului MathML estereprezentarea unui text matematic ı̂ntr-un document HTML, ı̂n timp ce obiectivul proiec-tului OpenMath este reprezentarea semantică a datelor matematice pentru realizarea de
aplicaţii cooperante ı̂ntre sisteme de calcul simbolic - CAS (Computer Algebra System ).
apache-ant
Utilitarul apache-ant asigură executarea unui şir de comenzi de operare. Acestecomenzi se ı̂nregistrează ı̂ntr-un fişier de tip xml, cu denumirea build.xml. Astfel,apache-ant se substituie unui fişier de comenzi bat ı̂n Windows sau unui script shelldin Linux/Unix. Avantajul obţinut constă ı̂n independenţa faţă de platforma de calcul(Windows, Linux).
Instalarea constă ı̂n dezarhivarea fişierului descărcat din Internet.Lansarea ı̂n execuţie necesită fixarea variabilei de mediu JAVA HOME, ce conţine
calea la distribuţia Java. Lansarea se poate face prin următorul fişier de comenzi
set JAVA_HOME=. . .
set ANT_HOME=. . .
%ANT_HOME%\bin\ant.bat %1
Parametrul %1 acestui fişier de comenzi reprezintă obiectivul care se doreşte a fi atins.Dacă se modifică denumirea sau locaţia fişierului build.xml atunci fişierul de comenzi seinvocă cu opţiunea -buildfile.
Un fişier build.xml corespunde unui proiect (project), alcătuit din unul sau mai multeobiective (target). Atingerea fiecarărui obiectiv constă din ı̂ndeplinirea uneia sau maimultor sarcini (task). Apache-ant conţine o familie predefinită de sarcini. Programatorulare datoria fixării atributelor sarcinilor. Manualul din documentaţia produsului conţinedescrierea atributelor cât şi exemple. În general, o sarcină reprezintă o operaţie executatăuzual ı̂n linia de comandă.
Atributele se dau, respectând sintaxa XML
numeAtribut = ”valoareAtribut”
Astfel, un proiect apare sub forma
8/17/2019 Calcul Stiintific Java
20/210
20 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
sarcini
. . . . . . .
Dacă la apelarea lui Apache-ant lipseşte parametrul opţional atunci se va executaobiectivul default.
Într-un proiect se pot defini variabile prin elementul
O variabilă definită se va utiliza cu sintaxa ${numeVariabila}.
1.3.4 Gestiunea proiectelor cu apache-maven
Instalarea produsului constă ı̂n dezarhivarea fişierului descărcat din Internet ı̂ntr-uncatalog a cărei cale este fixată ı̂n variabila de mediu MAVEN HOME.
Utilizarea produsului necesită
• Completarea variabilei de sistem PATH cu calea MAVEN HOME
\bin.
• Declararea variabilei JAVA HOME având ca valoare calea către distribuţia jdk folosită.În mod obişnuit depozitul local maven este
C:\Documents and Settings\client \.m2\repositoryLocaţia depozitului local se poate modifica, introducând elementul
volum:/cale/catalog_depozit
ı̂n fişierul MAVEN HOME
\conf
\settings.xml.
Potrivit principiului separării preocupărilor (Separation of Conserns), un proiect maven produce o singură ieşire.
Declararea unui proiect se face printr-un fişier pom.xml (Project Object Model). Estesarcina programatorului să completeze fişierul pom.xml, creat la generarea structurii decataloage ale proiectului, cu specificarea resurselor suplimentare sau a condiţionărilor ı̂nefectuarea unor operaţii (de exemplu, prezenţa adnotărilor necesită utilizarea unei versiuniJava mai mare dacât 1.5).
Dezvoltarea unei aplicaţii / proiect prin maven presupune generarea unei structuri decataloage (Standard directory layout for projects). Această structură de cataloage estespecifică tipului / şablonului de aplicaţie (archetype, ı̂n limbajul maven ).
Şabloane uzuale de aplicaţii:
8/17/2019 Calcul Stiintific Java
21/210
1.3. PROBLEME CONEXE 21
Nume ̧sablon Semnificaţia
maven-archetype-quickstart aplicaţie simplă
(şablonul implicit) maven-archetype-webapp aplicaţie Web
Îndeplinirea diferitelor obiective (generarea unui proiect, compilare, arhivare, testare,etc) se obţin prin comenzi maven .
Comenzile maven sunt de două tipuri:
• Comenzi pentru gestiunea ciclului de viaţă al unui proiect (lifecycle commands):
Comanda maven Semnificaţia
mvn -version afişează versiunea lui maven (utilă pentru verificarea funcţionării lui maven )
mvn clean şterge fişierele maven generate mvn compile compilează sursele Java mvn test-compile compilează sursele Java care
realizează testele junit mvn test execută testul junit mvn package crează o arhivă jar sau war mvn install depune arhiva jar sau war ı̂n depozitul local
• Comenzi de operare inserate (plugin commands):
8/17/2019 Calcul Stiintific Java
22/210
22 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Comanda maven Semnificaţia
mvn -B archetype:generate generează structura de cataloage a proiectului
Opţiunea -B are ca efect generareaneinteractivă. mvn -B archetype:generate \
-DgroupId=numelePachetuluiAplicat ̧iei \-DartifactId=numeleProiectului \-DarchetypeArtifactId= numeŞablon \-Dversion=versiuneaProiectului
mvn clean:clean şterge fişierele generate ı̂n urma compilării mvn compiler:compile compilează sursele Java
mvn surefire:test execută testul junit mvn jar:jar
crează o arhivă jar mvn install:install-file depune o arhivă jar ı̂n depozitul local mvn install:install-file \
-Dfile=numeFişier \-DgroupId=numePachet \-DartifactId=numeProiect \-Dversion=versiunea \-Dpackaging=tipArhiv˘ a
mvn exec:java execută metoda main a unei clase mvn exec:java \
-Dexec.mainClass=”clasaMetodeiMain” mvn dependency:copy-dependencies descarcă ı̂n catalogul target resursele
declarate ı̂n dependencies.
Astfel comanda
mvn -B archetype:generate -DgroupId=unitbv.cs.calcul -DartifactId=hello -Dversion=1.0
generează arborescenţa
hello
|--> src
| |--> main| | |--> java
| | | |--> unitbv
| | | | |--> cs| | | | | |--> calcul
| | | | | | | App.java
| |--> test
| | |--> java| | | |--> unitbv
| | | | |--> cs
| | | | | |--> calcul| | | | | | | AppTest.java
| pom.xml
Descrierea proiectului este dată ı̂n fişierul pom.xml generat
1
8/17/2019 Calcul Stiintific Java
23/210
1.3. PROBLEME CONEXE 23
4 ht tp : //maven . apache . org /maven−v 4 0 0 . x s d ”>5 4 . 0 . 06 u n i t b v . c s . c a l c u l 7 < a r t i f a c t I d> h e l l o8
j a r9 1 . 010 h e l l o11 ht tp : //maven . apache . org12 13 14 j u n i t15 < a r t i f a c t I d> j u n i t16 3 . 8 . 117 t e s t18 19 20
App.java este programul Java HelloWorld iar AppTest.java este un program de veri-ficare bazat pe junit.
Pentru testarea aplicaţiei, din catalogul hello, se execută comenzile
mvn compile mvn test
Execuţia programului se poate lansa prin intermediul unui profil (profile ) mvn exec:java -PnumeProfil
În prealabil ı̂n fişierul pom.xml se introduce secvenţa
numeProfil
clasaCuMetodaMain
org.codehaus.mojo
exec-maven-plugin
${target.main.class}
false
Această variantă este avantajoasă ı̂n cazul ı̂n care proiectul include mai multe clase cumetoda main.
Sarcina programatorul este acela de a ı̂nlocui aceste programe cu cele care rezolvăsarcinile proiectului. Pentru orice prelucrare toate dependinţele trebuie să se găseascăı̂n depozitul local maven . Dacă o dependinţă (resursă jar) nu se găseşte ı̂n depozitullocal atunci resursa este căutată ı̂ntr-un depozit global şi este descărcată ı̂n depozitulglobal. Este sarcina programatorului să declare toate dependinţele necesare unei aplicaţii.Declararea se face ı̂ntr-un element . Dacă resursa este inaccesibilă atunci
maven termină prelucrarea.
8/17/2019 Calcul Stiintific Java
24/210
24 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Programatorul are posibilitatea să specifice depozite globale unde să se găsească resurselenecesare, de exemplu
java.net-promoted
https://maven.java.net/content/groups/promoted/
Se pot defini variabile ı̂n elementul
valoare
. . .
O variabilă se indică la fel ca ı̂n apache-ant, prin $ {nume.proprietate }.În maven se pot integra sarcini apache-ant pentru orice etapă al evoluţiei unei aplicaţii.
Utilizarea constă ı̂n completarea fişierului pom.xml cu
org.apache.maven.plugins
maven-antrun-plugin
run
În elementul se definesc sarcinile ant care se doresc executate la comanda cores-punzătoare prelucrării etapei din evoluţia proiectului maven - compile, package, install,
test, etc.
8/17/2019 Calcul Stiintific Java
25/210
1.4. O MINI-BIBLIOTECĂ NUMERICĂ 25
1.4 O mini-bibliotecă numerică
Programele corespunzătoare metodelor de calcul (metoda tangentei şi metoda Simp-son) le vom include ı̂ntr-o mini-bibliotecă. Această bibliotecă va fi valorificată ı̂n capi-tolele următoare, prin dezvoltarea de programe client cu interfeţe grafice prietenoase şiprin apelarea resurselor mini-bibliotecii de la distanţă.
În timpul programării apare problema transmiterii datelor către câmpurile claselor saucătre parametrii metodelor. Probleme apar şi ı̂n cazul rezultatelor returnate de metode.Deseori printre date se află expresii ale unor funcţii matematice.
Semnalăm următoarele posibilităţi de programare a transmiterii datelor:
• Datele - mai puţin funcţiile - se transmit ca şi parametri iar o funcţie se poate definiı̂ntr-o clasă care eventual implementează o interfaţă predefinită. O instanţă a uneiasemenea clase se transmite de asemenea ca parametru. Această soluţie corespundemodului de programare din Fortran sau C [7].
• Prin clase acoperitoare a datelor şi respectiv, a rezultatelor.Varianta ı̂n care o funcţie este dată prin expresia ei de calcul fixată printr-un şir decaractere (string) va fi tratată ı̂n Cap. 5.
În continuare, varianta adoptată va fi cea ı̂n care datele se transmit prin clase acoperi-toare. Avantajul acestei soluţii este dat de flexibilitatea oferită de paradigma programăriiorientate pe obiecte, iar dezavantajul constă ı̂n cerinţa ca un utilizator (client) să aibăcunoştinţe de programare orientată pe obiecte.
Pentru fiecare tip de problemă, mini-biblioteca va conţine:• o interfaţă ı̂n care se declară metodele disponibile;• o implementare a interfeţei.
Astfel, se oferă posibilitatea dezvoltării şi utilizării mai multor implementări ale aceleiaşimetode.
Clasele Java prin care se transmitit datele de intrare (DataIn ) şi cele de ieşire (DataOut )sunt incluse ı̂n pachetele interfeţelor corespunzătoare. Aceste clase sunt componente Java(bean ).
Desfăşurarea mini-bibliotecii mathlib cu programele sursă estelib
| log4j-*.jarsrc
|--> mathlib
| |--> client
| | |--> ecalg| | | |--> impl
| | | | | MetodaTangentei.java // implementeaza interfata
| | | | IMetodaTangentei.java // interfata| | | | DataIn.java
| | | | DataOut.java
| | |--> cvadra| | | |--> impl
| | | | | MetodaSimpson.java / / implementeaza interfata
| | | | IMetodaSimpson.java // interfata
| | | | DataIn.java
| | | | DataOut.java
8/17/2019 Calcul Stiintific Java
26/210
26 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Utilizarea mini-bibliotecii ca un modul Google Web Toolkit impune intercalarea catalogu-lui client.
Codurile claselor / interfeţelor sunt:
1. Clasa mathlib.client.ecalg.IMetodaTangentei
1 p a c ka g e m a t h l i b . c l i e n t . e c a l g ;2 /∗∗3 ∗ I n t e r f a t a m et od ei t a n g e n t e i .4 ∗/5 p u b l i c i n t e r f a c e I M et o da T an g en t ei{6 /∗∗7 ∗ M e to da t a n g e n t e i .8 ∗/9 p u b l i c D at aO ut m e t od a T an g e nt e i ( D a ta I n d i n ) ;10 }
2. Clasa mathlib.client.ecalg.DataIn 1 package m a t h l i b . c l i e n t . e c a l g ;2 / ∗∗3 ∗ C la sa a c o pe r it o a re a d a t e l o r n e c es ar e r e z o l v a r i i 4 ∗ u ne i e c u a t i i a l g e br i c e 5 ∗/ 6 p ub l ic a b st r ac t c l a s s DataIn{7 private double x ; // ap ro xi ma ti a i n i t i a l a 8 private double eps ; / / t o l e r a n t a a dmi sa 9 p r iv a te i n t nmi; / / numar maxim a dm is de i t e r a t i i
11 / ∗∗12 ∗ F un ct ia c o r e s p un z a t io a r e m emb ru lu i s t a ng a l e c u a t i e i f c t ( x ) =0 .13 ∗/ 14 p u b l ic a b s t r a c t d ou bl e f c t ( double x ) ;
16 / ∗∗17 ∗ F i xe a za a p ro x i ma t ia s o l u t i e i .18 ∗/ 19 p u b l ic vo id s e t X ( double x ){20 t h i s . x=x ;21 }22 / ∗∗23 ∗ F ix ea za e x t re m it a t ea i n f e r i o a ra a i n t e r v a l u l u i d e i n t e g ra r e 24 ∗/ 25 public double g e t X ( ){26 return x ;27 }
29 / ∗∗30
∗ F i xe a za t o l e r a n t a .
31 ∗/ 32 p u b l ic vo id setE ps ( double e p s ){33 t h i s . eps=eps ;34 }35 / ∗∗36 ∗ R e tu r ne a za t o l e r a n t a .37 ∗/ 38 public double getEps () {39 return eps ;40 }
42 / ∗∗43 ∗ F i x ea z a n um ar ul m axim a d mi s d e i t e r a t i i .44 ∗/ 45 p u b l ic vo id s e tNmi( i n t nmi){46 t h i s . nmi=nmi ;
8/17/2019 Calcul Stiintific Java
27/210
1.4. O MINI-BIBLIOTECĂ NUMERICĂ 27
47 }48 / ∗∗49 ∗ R e t ur n e a za n um ar ul m axim a d m is d e i t e r a t i i .50
∗/
51 p u bl ic i nt getNmi(){52 return nmi;53 }54 }
3. Clasa mathlib.client.ecalg.DataOut
1 package m a t h l i b . c l i e n t . e c a l g ;2 / ∗∗3 ∗ C la sa a c o pe r it o a re a r e z u l t a t e l o r o b t i nu t e 4 ∗ l a r e zo l va r ea u ne i e c u a t i i a l g e br i c e 5 ∗/ 6 p ub l ic c l a s s DataOut {7 private double x ; // a pr ox im at ia c a l c u l a t a a s o l u t i e i
8 p r iv a te i n t ind ; // i n d i c a t o r u l d e r a sp u ns a l p r o gr a mu l ui 9 private double f ; // v a lo ar ea e x p r es i e i s t an g i a e c u a t ie i i n x 10 p r iv a te i n t n i ; // numa rul i t e r a t i i l o r e f e c t u a t e
12 / ∗∗13 ∗ R et ur ne az a a p ro x im a ti a s o l u t i e i .14 ∗/ 15 public double g e t X ( ){16 return x ;17 }18 / ∗∗19 ∗ F i xe a za a p ro x i ma t ia s o l u t i e i .20 ∗/ 21 p u b l ic vo id s e t X ( double x ){22 t h i s . x=x ;23
}25 / ∗∗26 ∗ R et ur ne az a v a l o a r e a m em br ul ui s t a ng a l e c u a t i e i c a l c u l a t a 27 ∗ i n a p ro xi ma ti a f i x a t a a s o l u t i e i e c u a ti e i .28 ∗/ 29 public double getF () {30 return f ;31 }32 / ∗∗33 ∗ F i xe a za v a l o a re a m e mb ru lu i s t a ng a l e c u a t i e i c a l c u l a t a 34 ∗ i n a pr ox im at ia c a l c ul a t a a s o l u t i e i e c u a ti e i .35 ∗/ 36 p u b l ic vo id setF ( double f ) {37 t h i s . f=f ;38 }
40 / ∗∗41 ∗ R e tu r ne a za i n d i c a t o r u l d e r a s p u n s .42 ∗43 ∗ 0 − s u c c e s ;44 ∗ 1 − i n s u c c e s .45 ∗ 2 − s i n g u l a r i t a t e d e p is t a ta i n t im pu l c a l c u l u l u i .46 ∗/ 47 p u bl ic i nt ge tIn d () {48 return ind ;49 }50 / ∗∗51 ∗ F i xe a za i n d i c a t o r u l d e r a s pu ns .52 ∗/ 53 p u b l ic vo id s e t I n d ( i n t ind ){54 t h i s . ind=ind ;
55 }
8/17/2019 Calcul Stiintific Java
28/210
28 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
57 / ∗∗58 ∗ R et ur ne az a n um aru l i t e r a t i i l o r e f e c t u a t e .59
∗/
60 p u bl ic i nt ge tNi () {61 return n i ;62 }63 / ∗∗64 ∗ F ix ea za numarul i t e r a t i i l o r e f e c t u a t e .65 ∗/ 66 p u b l ic vo id s e tN i ( i n t n i ){67 t h i s . ni=ni ;68 }69 }
4. Clasa mathlib.client.ecalg.impl.MetodaTangentei
1 package m a t h l i b . c l i e n t . e c a l g . i m p l ;
2 import j a v a . u t i l . l o g g i n g . L o g g e r ;3 import j a v a . u t i l . l o g g i n g . F i l e H a n d l e r ;4 import j a v a . u t i l . l o g g i n g . S i m p l eF o r m a t t er ;5 import mathlib . c l ie nt . e c al g . DataIn ;6 import m a t h l i b . c l i e n t . e c a l g . D at aO ut ;7 import mathlib . c l ie nt . e c al g . IMe todaT ange ntei ;8 import jav a . io . IOExcepti on ;
10 / ∗∗11 ∗ I m p l em e nt a r ea m e t o de i t a n g e n t e i .12 ∗ V ar ia nt a cu i n r e g i s t r a r e a r e z u l t a t e l o r i n te r me d ia r e ( l o g ) .13 ∗/ 14 p ub l ic c l a s s MetodaTangentei implements IMe todaT ange nte i{15 s t a t i c L o g g e r l o g g e r = L o g g e r . g e t L o g g e r ( M e t o d aT a ng e nt e i . c l a s s . getName () ) ;
17 public MetodaTangentei ()
{18 tr y{19 F i le H an d le r l o g g i n g F i l e = new F i l e H a n d l e r ( ” r e s u l t s E c a l g . l o g ” ) ;20 l o g g i n g F i l e . s e t F o r ma t t e r (new S i m p l eF o r m a t t er ( ) ) ;21 l o g g e r . a d dH a n dl e r ( l o g g i n g F i l e ) ;22 }23 catch ( I O E x ce p ti o n e ) {24 Syste m . out . pr in tl n ( e . ge tMe s s age ( ) ) ;25 }26 }
28 / ∗∗29 ∗ Metoda t a n ge n t ei a p l i c a t a d a t e l o r f i x a t e i n o b i e c t u l d in .30 ∗/ 31 public DataOut me todaT ange nte i( DataIn din ){32 double x , y=din . getX () , d , f , df , eps=din . getEps ( ) ;33 i n t nmi=din . getNmi ( ) ;34 DataOut dout=new DataOut ( ) ;35 i n t n i = 0 ;36 do{37 ni++;38 x=y ;39 f =din . f c t (x );40 df=dfc t (x , din ) ;41 y=x−f / d f ;42 i f ( ( y==Doub le . NaN ) | | ( Math. ab s ( y)==Doubl e .POSITIVE INFINITY) ){43 d o ut . s e t I n d ( 2 ) ;44 dout . s e tX( y );45 dout . setF ( Double .NaN) ;46 dout . set Ni ( ni ) ;47 return dout ;48 }49 d=Math. abs ( ( y−x ) ) ;
8/17/2019 Calcul Stiintific Java
29/210
1.4. O MINI-BIBLIOTECĂ NUMERICĂ 29
50 S t r i n g m e sa j=” i t e r = ”+ n i+” s o l u t i a = ”+x+” e r o a r e a = ”+d ;51 l o g g e r . i n f o ( m e sa j ) ;52 }53 while ( ( d>=eps ) && ( ni
8/17/2019 Calcul Stiintific Java
30/210
30 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
14 ∗ F u nc t i a i n t e g r a t a .15 ∗/ 16 p u b l ic a b s t r a c t d ou bl e f c t ( double x ) ;
18 / ∗∗19 ∗ R et ur ne az a e x t re m it a t ea i n f e r i o ar a a i n t e r v a l u l u i de i n t e gr a r e .20 ∗/ 21 public double g e t A ( ){22 return a ;23 }24 / ∗∗25 ∗ F ix ea za e x t re m it a t ea i n f e r i o a ra a i n t e r v a l u l u i d e i n t e g r a re .26 ∗/ 27 p u b l ic vo id s e t A ( double a ){28 t h i s . a=a ;29 }
31 / ∗∗32 ∗ R et ur ne az a e x t r e m i t a t e a s u p e ri o a r a a i n t e r v a l u l u i d e i n t e g r a r e .33
∗/ 34 public double g e t B ( ){35 return b ;36 }37 / ∗∗38 ∗ F ix ea za e x t re m it a t ea s u pe r io r a a i n t e r v a l u l u i de i n t e gr a r e .39 ∗/ 40 p u b l ic vo id s e t B ( double b ){41 t h i s . b=b ;42 }
44 / ∗∗45 ∗ F i xe z a t o l e r a n t a .46 ∗/ 47 p u b l ic vo id setE ps ( double e p s ){48 t h i s . eps=eps ;
49 }50 / ∗∗51 ∗ R e tu r ne a za t o l e r a n t a .52 ∗/ 53 public double getEps () {54 return eps ;55 }
57 / ∗∗58 ∗ F i x ea z a n um ar ul m axim a d mi s d e i t e r a t i i .59 ∗/ 60 p u b l ic vo id s e tNmi( i n t nmi){61 t h i s . nmi=nmi ;62 }63 / ∗∗64
∗ R e t ur n e a za n um ar ul m axim a d m is d e i t e r a t i i .
65 ∗/ 66 p u bl ic i nt getNmi(){67 return nmi;68 }69 }
7. Clasa mathlib.client.cvadra.DataOut
1 package mathlib . c l ie nt . c vadra ;2 / ∗∗3 ∗ C la sa a c o pe r it o a re a r e z u l t a t e l o r o b t i nu t e 4 ∗ l a c a l c u l u l u ne i i n t e gr a l e .5 ∗/ 6 p ub l ic c l a s s DataOut{7 private double i n t e g r a l a ; // i n t e g r a l a
8/17/2019 Calcul Stiintific Java
31/210
1.4. O MINI-BIBLIOTECĂ NUMERICĂ 31
8 p r iv a te i n t ind ; // i n d i c a t o r u l d e r a sp u ns a l p r og ra m ul u i 9 p r iv a te i n t n i ; // numa rul i t e r a t i i l o r e f e c t u a t e
11 / ∗∗12 ∗ R et ur ne az a v a l o ar e a i n t e g r a l e i .
13 ∗/ 14 public double g e t I n t e g r a l a ( ){15 return i n t e g r a l a ;16 }17 / ∗∗18 ∗ F ix ea za v a lo a re a i n t e g r a l e i .19 ∗/ 20 p u b l ic vo id s e t I n t e g r a l a ( double i n t e g r a l a ){21 t h i s . i n t e g r a l a = i n t e g r a l a ;22 }
24 / ∗∗25 ∗ R e tu r ne a za i n d i c a t o r u l d e r a s p u n s .26 ∗27
∗ 0 − s u c c e s ;28 ∗ 1 − i n s u c c e s .29 ∗/ 30 p u bl ic i nt ge tIn d () {31 return ind ;32 }33 / ∗∗34 ∗ F i xe a za i n d i c a t o r u l d e r a s pu ns .35 ∗/ 36 p u b l ic vo id s e t I n d ( i n t ind ){37 t h i s . ind=ind ;38 }
40 / ∗∗41 ∗ R et ur ne az a n um aru l i t e r a t i i l o r e f e c t u a t e .42
∗/
43 p u bl ic i nt ge tNi () {44 return n i ;45 }46 / ∗∗47 ∗ F ix ea za numarul i t e r a t i i l o r e f e c t u a t e .48 ∗/ 49 p u b l ic vo id s e tN i ( i n t n i ){50 t h i s . ni=ni ;51 }52 }
8. Clasa mathlib.client.cvadra.impl.MetodaSimpson
1 package mathlib . c l ie nt . c vadra . impl ;2 import j a v a . u t i l . l o g g i n g . L o g g e r ;3 import j a v a . u t i l . l o g g i n g . F i l e H a n d l e r ;4 import j a v a . u t i l . l o g g i n g . S i m p l eF o r m a t t er ;5 import mathlib . c l i e n t . c vadra . DataIn ;6 import mathlib . c l ie nt . c vadra . DataOut ;7 import mathl ib . cl i e nt . cvadra . IMetodaSimpson ;8 import jav a . io . IOExcepti on ;9 / ∗∗10 ∗ Im plem en t ar ea m et odei S imps on .11 ∗ V ar ia nt a cu i n r e g i s t r a r e a r e z u l t a t e l o r i n te r me d ia r e ( l o g ) .12 ∗/ 13 p ub l ic c l a s s MetodaSimpson implements IMetodaSimpson{14 private double s=Double .NaN;15 s t a t i c Logge r lo gg e r = Logge r . ge tLog ge r (Me todaSimpson . c l a s s . getName () ) ;
17 public MetodaSimpson(){18 tr y{
8/17/2019 Calcul Stiintific Java
32/210
32 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
19 F i le H an d le r l o g g i n g F i l e = new F i l e H a n d l e r ( ” r e s u l t s I n t e g . l o g ” ) ;20 l o g g i n g F i l e . s e t F o r ma t t e r (new S i m p l eF o r m a t t er ( ) ) ;21 l o g g e r . a d dH a n dl e r ( l o g g i n g F i l e ) ;22
}23 catch ( I O E x ce p ti o n e ) {24 Syste m . out . pr in tl n ( e . ge tMe s s age ( ) ) ;25 }26 }
28 / ∗29 ∗ Fo rm ul a S im ps on d e a p l i c a r e p r a c t i c a c u 30 ∗ p ar am et ru d e d i s c r e t i z a r e f i x a t .31 ∗ La pr im a ape l ar e s=Doubl e .NaN ! 32 ∗/ 33 private double s imps on( i n t m, DataIn din ){34 double a=din . getA ( ) ,b=din . getB ( ) ;35 double h=0.5∗( b−a)/m;36 double sp=0, s i =0;37 i f ( Double . isNaN( s )){38
f o r ( i n t i =1;i
8/17/2019 Calcul Stiintific Java
33/210
1.5. FORMATAREA REZULTATETOR 33
1 2
4
6 7 8 9
11 12 < f i l e s e t dir=”${ l i b . d i r }”>13 14 15 16
18 19 20
21 22
24 25 28 29 30
32 33 34
36 37 38 39 40 41
Arhiva mathlib.jar care rezultă, va fi utilizată de programele client. În urma oricăreimodificări efectuată ı̂n mini-bibliotecă trebuie recreată arhiva mathlib.jar.
Ori de câte ori se folosesc resursele mini-bibliotecii, variabila de sistem classpathtrebuie să localizeze fişierul mathlib.jar.
1.5 Formatarea rezultatetorEste un deziderat ca afişarea valorii unei variabile - de obicei un număr reprezentat ı̂n
virgulă mobilă - să conţină doar cifrele ei semnificative, adică cele care nu sunt influenţatede erorile de rotunjire, care apar ı̂n urma reprezentării şi calculelor ı̂n virgulă mobilă, darşi de eroarea de metodă.
Afişarea valorii variabilei - de exemplu r - prin System.out.println(r) se face cuun număr de zecimale, iar de la o anumită poziţie cifrele sunt influenţate de erorile derotunjire şi de roarea de metodă.
Astfel apare cerinţa ca programatorul să specifice numărul de zecimale care să fie
afişat, cu alte cuvinte să formateze rezultatul.
8/17/2019 Calcul Stiintific Java
34/210
34 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Atunci când afişarea are loc de un program desktop, formatarea se face cu metodaprintf a clasei PrintWriter. Formate uzuale sunt %m.nX unde
• m - este numărul caracterelor;• n - este numărul zecimalelor;• X ∈ {e, f , g}; e - reprezentare ştiinţifică; f - reprezentare zecimală; g combinaţie
ı̂ntre reprezentare ştiinţifică şi zecimală.
Dacă rezultatul apare prin intermediul unui program navigator, atunci se pot utiliza
• şablonulimport java.text.DecimalFormat;
. . .
DecimalFormat df=new DecimalFormat("0.00001");
out.println(df.format(r));. . .
unde out este fluxul de ieşire.
• metoda format(String format,Object . . . args ) a clasei java.io.PrintWriter. Odescriere amănunţită a modului de formatare este dată ı̂n documentaţia ce ı̂nsoţeştedistribuţia jdk. Prezentăm doar cazul unei variabile numerice r de tip float saudouble care se afişează pe l = 12 poziţii cu d = 6 cifre zecimale. Codul Java este
import java.io.PrintWriter;
. . .
PrintWriter out=. . .out.format("r = %1$12.6f",r);
. . .
1.6 Rezolvarea problemelor
Deoarece clasele de tip DataIn ale mini-bibliotecii nu conţin codul funcţiei specificeunei probleme concrete, ele au fost declarate clase abstract. Un client trebuie să extindăo asemenea clasă specificând metoda double fct(double x).
Calculul soluţiei negative a ecuaţiei 2x − x2 = 0Aplicaţia client conţine clasele SimpluEcAlgDataIn - cu fixarea funcţiei - şi TestEcAlg
- cu metoda main - având respectiv codurile1 import mathlib . c l ie nt . e c al g . DataIn ;2 p ub l ic c l a s s SimpluEcAlgDataIn extends DataIn{
4 / / membrul s t a n g a l e c u a t i e i 5 SimpluEcAlgDataIn () {6 setX ( −0 . 5 ) ; // a p ro x im at ia i n i t i a l a 7 s e tEps (1e −8); / / t o l e r a n t a ad mi sa 8 s e tNmi (5 0) ; / / numar maxim a dm is d e i t e r a t i i 9 }
11 public double f c t ( double x ){12 return Math. exp( x∗Math. log (2))−x∗x ;13 }14
}
8/17/2019 Calcul Stiintific Java
35/210
1.6. REZOLVAREA PROBLEMELOR 35
şi
1 import o r g . j u n i t . ∗ ;2 im po rt s t a t i c o r g . j u n i t . A s s e r t .
∗;
3 import m a t h l i b . c l i e n t . e c a l g .∗ ;4 import m a t h l i b . c l i e n t . e c a l g . i m p l . ∗ ;
6 p ub l ic c l a s s TestEcAlg{7 // r e z u l t a t u l c un os cu t a l e c u a ti e i 8 private double r e z u l t a t =−0.7666647;9 private DataIn din ;10 private DataOut dout ;
12 @Before13 p u b l ic vo id i n i t i a l i z a r e ( ){14 din=new SimpluEc AlgDataIn ( ) ;15 IMe todaT ange nte i obj =new Me todaT ange nte i ( ) ;16 dout=obj . metodaTangentei ( din ) ;17 }
19 @Test20 p u b l ic vo id t e s t ( ){21 as s e rt Equ als ( re z ul ta t , dout . ge tX () , din . ge tEps ( ) ) ;22 }
24 @After25 p u b l ic vo id a f i s a r e ( ){26 Syste m . out . pr in tl n (” \ n I n d i c a t o r u l d e r a s pu n s : ”+d ou t . g e t I n d ( ) ) ;27 S ys te m . o u t . p r i n t f ( ” S o l u t i a e c u a t i e i : % 16 .8 f \n” ,dout . ge tX () ) ;28 Sy st em . o ut . p r i n t f ( ” V a l oa r ea f u n c t i e i i n s o l u t i e : % 16 .8 e\n” ,dout . getF () ) ;29 Syste m . out . pr in tl n (”Numarul i t e r a t i i l o r e f e c tu at e : ”+dout . ge tNi () ) ;30 }
32 p u bl i c s t a t i c vo id m ai n ( S t r i n g [ ] a r g s ){33 org . ju ni t . runne r . JUnitCore . main( ”TestEcAlg” ) ;
34 }35 }
Se utilizează junit pentru verificarea rezultatului furnizat de aplicaţie cu soluţia cunoscută.Rezultatele afişate sunt
Indicatorul de raspuns : 0
Solutia ecuatiei : -0.76666470Valoarea functiei in solutie : -5.14033260e-14
Numarul iteratiilor efectuate : 5
Time: 0.13
OK (1 test)
Calculul integralei
π
4
0 ln(1 + tan x)dx
În mod asemănător aplicaţia client este alcătuită din clasele
1 import mathlib . c l i e n t . c vadra . DataIn ;2 p ub l ic c l a s s SimpluCvadraDataIn extends DataIn{3 SimpluCvadraDataIn () {4 s e tA ( 0 ) ; / / e x t r e m it a t e a s t an g a 5 s e t B ( 0 . 2 5∗Math. PI ) ; / / e x t r e m it a t e a d r ea p t a 6 s e tEps (1e −12); / / t o l e r a n t a a dm is a 7 s e tNmi (5 0) ; / / numar maxim a dm is d e i t e r a t i i 8 }
10 // f u n c ti a de i n t e g r a t
11 public double f c t ( double x ){
8/17/2019 Calcul Stiintific Java
36/210
36 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
12 return Math. log (1+Math . tan (x )) ;13 }14 }
şi1 import o r g . j u n i t . ∗ ;2 im po rt s t a t i c o r g . j u n i t . A s s e r t .∗ ;3 import m a t h l i b . c l i e n t . c v a d r a . ∗ ;4 import mathlib . c l ie nt . c vadra . impl . ∗ ;
6 p ub l ic c l a s s T e s t I n t e g r a l a {7 // r e z u l t a t u l c un os cu t a l i n t e g r a l e i 8 private double r e z u l t a t = 0 .1 2 5∗Math . PI∗Math. lo g (2 );9 private DataIn din ;10 private DataOut dout ;
12 @Before13 p u b l ic vo id i n i t i a l i z a r e ( ){14 din=new SimpluCvadraDataIn ();15 IMetodaSimpson obj=new MetodaSimpson ();16 dout=obj . metodaSimpson( din ) ;17 }
19 @Test20 p u b l ic vo id t e s t ( ){21 a s s e r t E q u a l s ( r e z u l t a t , d o ut . g e t I n t e g r a l a ( ) , d i n . g e t E ps ( ) ) ;22 }
24 @After25 p u b l ic vo id a f i s a r e ( ){26 Syste m . out . pr in tl n (” \ n I n d i c a t o r u l d e r a s pu n s : ”+d ou t . g e t I n d ( ) ) ;27 S ys te m . o u t . p r i n t f ( ” I n t e g r a l a : % 16 .8 f \n ” , d o u t . g e t I n t e g r a l a ( ) ) ;28 Syste m . out . pr in tl n (”Numarul i t e r a t i i l o r e f e c tu at e : ”+dout . ge tNi () ) ;29 }
31 p u bl i c s t a t i c vo id m ai n ( S t r i n g [ ] a r g s ){32 org . j u ni t . runne r . JUnitC ore . main(” T e s tI nte gr ala ” );33 }34 }
Rezultatele obţinute sunt
Indicatorul de raspuns : 0
Integrala : 0.27219826Numarul iteratiilor efectuate : 1
Time: 0.1
OK (1 test)
1.7 Dezvoltarea mini-bibliotecii cu apache-maven
Arătăm o modalitate de dezvoltare a mini-bibliotecii mathlib prin apache-maven.Deoarece un proiect maven produce o singură ieşire, este nevoie de 4 proiecte maven : douăcorespunzătoare celor două interfeţe (cu ieşirile mathlib.client.ecalg, mathlib.client.cvadra )şi alte două pentru implementarea lor (cu ieşirile mathlib.client.ecalg.impl, mathlib.client.cvadra.impl ).
Clasele dezvoltate ı̂n §1.4 se utilizează nemodificate.În prealabil arhivele jep-2.4.1.jar şi matheclipse-parser-0.0.10.jar pe care le utilizăm
trebuie depuse ı̂n depozitul local
8/17/2019 Calcul Stiintific Java
37/210
1.7. DEZVOLTAREA MINI-BIBLIOTECII CU APACHE-MAVEN 37
set HOME=locatia_curenta
start mvn install:install-file
-Dfile=%HOME%\jep-2.4.1.jar-DgroupId=jep
-DartifactId=jep
-Dversion=2.4.1
-Dpackaging=jarstart mvn install:install-file
-Dfile=%HOME%\matheclipse-parser-0.0.10.jar
-DgroupId=org.matheclipse-DartifactId=matheclipse-parser
-Dversion=0.0.10
-Dpackaging=jar
Proiectul interfaţei pentru rezolvarea unei ecuaţii algebrice se generează prin
set GroupId=mathlib.client.ecalg
set ArtifactId=iecalgset Version=1.0
set ArchetypeArtifactId=maven-archetype-quickstart mvn -B archetype:generate-DgroupId=%GroupId%
-DartifactId=%ArtifactId%
-Dversion=%Version%
-DarchetypeArtifactId=%ArchetypeArtifactId%
După inserarea fişierelor java, desfăşurarea aplicaţiei devine
iecalg
|--> src| |--> main
| | |--> java
| | | |--> mathlib| | | | |--> client
| | | | | |--> ecalg
| | | | | | | DataIn.java| | | | | | | DataOut.java
| | | | | | | IMetodaTangentei.java
| pom.xml
Prelucrările necesare sunt: mvn clean install care ı̂nglobează ştergerea fişierelor gen-erate anterior de maven , compilarea, arhivarea şi depunerea proiectului ı̂n depozitul localmaven.
Generăm proiectul pentru implementarea interfeţei definită mai sus.
set GroupId=mathlib.client.ecalg.impl
set ArtifactId=ecalgimpl
set Version=1.0set ArchetypeArtifactId=maven-archetype-quickstart
mvn -B archetype:generate-DgroupId=%GroupId%-DartifactId=%ArtifactId%
-Dversion=%Version%
-DarchetypeArtifactId=%ArchetypeArtifactId%
Partea de test se completează cu clasele utilizate ı̂n §1.5 pentru calculul soluţiei negativea ecuaţiei 2x − x2 = 0. În final, desfăşurarea proiectului esteecalgimpl
|--> src| |--> main
| | |--> java
| | | |--> mathlib
| | | | |--> client
| | | | | |--> ecalg
8/17/2019 Calcul Stiintific Java
38/210
38 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
| | | | | | |--> impl
| | | | | | | | MetodaTangentei.java
| |--> test| | |--> java
| | | |--> mathlib
| | | | |--> client
| | | | | |--> ecalg| | | | | | |--> impl
| | | | | | | SimpluEcAlgDataIn.java
| | | | | | | TestEcAlg.java| pom.xml
Fişierul pom.xml trebuie completat cu dependinţa pentru iecalg . Codul fişierului pom.xmldevine
1 5 4 . 0 . 06 m a t h l i b . c l i e n t . e c a l g . im p l7 < a r t i f a c t I d>e c a l g i m p l8
j a r9 1 . 010 e c a l g i m p l11 ht tp : //maven . apache . org12 13 14 j u n i t15 < a r t i f a c t I d> j u n i t16 4 . 1 217 t e s t18 19 20 m a t h l i b . c l i e n t . e c a l g
21 < a r t i f a c t I d> i e c a l g22 1 . 023 24 25
Se pot face următoarele prelucrări: mvn clean testPartea referitoare la formula de integrare numerică se tratează analog.Odată dezvoltate, cele 4 proiecte pot fi asamblate ı̂ntr-un singur proiect maven, având
structura
mathlib
|--> iecalg
| |--> . . .
|--> ecalgimpl| |--> . . .
|--> icvadra
| |--> . . .|--> cvadraimpl
| |--> . . .
| pom.xml
cu fişierul pom.xml
1 2
7 4 . 0 . 0
8/17/2019 Calcul Stiintific Java
39/210
1.8. UTILIZARE PRIN OSGI 39
8 Maven mathl ib 9 mathlib10 1 . 011 < a r t i f a c t I d>mathlib12
pom
14 15 i e c a l g16 e c a l g i m p l17 i c v a d r a18 c vadraimpl19 20
Oricare din comenzile maven va acţiona asupra fiecărui modul (modulul este denumireadată unui proiect inclus).
Compilarea şi testarea se obţine cu comanda mvn clean test.
Compilarea, testarea, arhivarea şi copierea ı̂n depozitul local se obţine cu comanda mvn clean install.
1.8 Utilizare prin OSGi
OSGi - Open Sourse Gateway initiative, 1999, (semnificaţia numelui fiind astăzi depăşi-tă) a dezvoltat un model de cadru de lucru privind:
• gestiunea ciclului de viaţă a unei aplicaţii (application life cycle management);
• registru de servicii;• mediu de execuţie;
• module.
Pe această bază au fost dezvoltate interfeţe de programare (API), servicii, extensii OSGi(OSGi layers).
Cadrul de lucru conţine un model specific de aplicaţie sub formă de componentă saumodul OSGi (bundle for deployment). O asemenea componentă poate pune la dispoziţiaaltor componente funcţionalităţi, comportându-se ca un serviciu (ofertant de servicii) sau
poate executa o acţiune punctuală. O componentă OSGi se prezintă sub forma unei arhivejar.
În esenţă, scopul unui cadru de lucru OSGi este oferirea unui mediu pentru crearea şiintegrarea uniformă de unităţi (module, componente) de soft.
O componentă OSGi se poate instala, lansa ı̂n execuţie, opri, actualiza şi dezinstala.Cadrul de lucru conţine un registru de servicii care permite unei componente OSGi
să sesizeze existenţa, apariţia sau dispariţia unor servicii.Programarea unei aplicaţii (serviciu) OSGi se poate face ı̂n mod
• imperativ prin existenţa unei clase activator ce implementează interfaţa org.osgi.framework.BundleActivator.
8/17/2019 Calcul Stiintific Java
40/210
8/17/2019 Calcul Stiintific Java
41/210
1.8. UTILIZARE PRIN OSGI 41
• public void stop(BundleContext ctx )Fixează activităţile executate la oprirea modulului OSGi.
Această clasă poate lipsi ı̂n cazul declarării unei interfaţe.
2. Un fişier text manifest .mf de proprietăţi (nume: valoare) ale modulului OSGi, cuextensia mf. Dintre proprietăţi menţionăm:
• Bundle-Name: numele componentei OSGi• Bundele-Description: descrierea componentei OSGi• Bundle-Version: 1.0.0• Bundle-Activator: clasa care implementează interfaţa
BundleActivator
• Bundle-Classpath: variabila classpath utilizată de componenta OSGi. Uzual,primul element, indicat prin ”.” (punct) va desemna catalogul curent.
• Import-Package: Lista pachetelor utilizate, furnizate de alte componenteOSGi.
• Export-Package: Lista pachetelor cuprinse ı̂n modulul OSGi.Fiecărui pachet trebuie să i se atribuie o versiune, de exemplu
Export-Package: mathlib.client.cvadra;version="1.0.0",mathlib.client.ecalg;
version="1.0.0"
Ultima linie din fişierul manifest .mf este o linie vidă. În liste, separatorul este
virgula.
Rezolvarea problemelor prin module OSGi
Considerăm clasa TestEcAlg
1 import m a t h l i b . c l i e n t . e c a l g .∗ ;2 import m a t h l i b . c l i e n t . e c a l g . i m p l . ∗ ;3 import org . osg i . framework . ∗ ;
5 p ub l ic c l a s s A c t i v a t o r implements B u n d l e A c t i v a t o r {6 p u b l ic vo id s t a r t ( B u n d l eC o nt e xt c o n t e x t ){7 DataIn din=new SimpluEc AlgDataIn ( ) ;8 IMe todaT ange nte i obj =new Me todaT ange nte i ( ) ;9 DataOut dout=obj . metodaTangentei ( din ) ;10 Syste m . out . pr in tl n (” \ n I n d i c a t o r u l d e r a s pu n s : ”+d ou t . g e t I n d ( ) ) ;11 S ys te m . o u t . p r i n t l n ( ” S o l u t i a e c u a t i e i : ”+d ou t . g et X ( ) ) ;12 S ys te m . o u t . p r i n t l n ( ” V a l o a r ea f u n c t i e i i n s o l u t i e : ”+d ou t . g e tF ( ) ) ;13 Syste m . out . pr in tl n (”Numarul i t e r a t i i l o r e f e c tu at e : ”+dout . ge tNi () ) ;14 }
16 p u b l ic vo id s top ( B undleC onte xt c ont e xt ) {}17 }
şi după compilare, arhivăm cu jar cfvm testecalg.jar manifest.mf ... ansamblul
|--> lib
| | mathlib.jar
| Activator.class
| SimpluEcAlgDataIn.class
8/17/2019 Calcul Stiintific Java
42/210
42 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Fişierul manifest.mf este
1 Bundle−Name: TestEcAlg2 Bundle
−D e s c r i p t i o n : T es t E cA lg
3 Bundle−V e rs i on : 1 . 0 . 04 Bundle−A c t i v a t o r : A c t i v a t o r5 Bundle−C l a s s p a t h : . , l i b / m a t h l i b . j a r6 Import−Pac kage : org . os gi . f ramew ork
După lansarea cadrului OSGi ı̂n execuţie, instalăm componenta OSGi astfel creată şi olansăm ı̂n lucru:
g! start file: . . .\testecalg.jar
Indicatorul de raspuns : 0
Solutia ecuatiei : -0.766664695962095
Valoarea functiei in solutie : 1.1102230246251565E-16Numarul iteratiilor efectuate : 5
Pentru a relua execuţia trebuie să aflăm codul atribuit de cadrul de lucru OSGi compo-nentei testecalg.jar
g! lbID|State |Level|Name
. . .
5|Active | 1|TestEcAlg(1.0.0)|1.0.0
după care componenta trebuie oprită
g! stop 5
Dezinstalarea componentei de cadrul de lucru OSGi se obţine prin
g! uninstall 5
O altă variantă de programare constă ı̂n utilizarea serviciilor OSGi. În cele ce urmeazăvom pleca de la mini-biblioteca mathlib realizată şi arhivată ı̂n fişierul mathlib.jar.
Se va crea o componentă OSGi care va ı̂nregistra câte un serviciu pentru fiecareinterfeţă IMetodaTangentei şi IMetodaSimpson. Totodată, componenta OSGi, corespunză-toare interfeţelor, va exporta pachetelemathlib.client.cvadra;version=”1.0.0”,mathlib.client. ecalg;version=”1.0.0”.
Înregistrarea unui serviciu se face prin intermediul metodei
ServiceRegistration registerService(String, Object, Properties)a clasei BundleContext, unde corespunzător variabilei de tip
• String se află numele interfeţei, care fixează astfel numele serviciului;
• Object se află o instanţă a clasei care implementează interfaţa;
• Properties se află elemente pentru identificarea serviciului, ı̂n cazul ı̂n care maimulte componente OSGi generează servicii aceleiaşi interfeţe.
ˆIn cazul exemplului, codul clasei Activator.java este
8/17/2019 Calcul Stiintific Java
43/210
1.8. UTILIZARE PRIN OSGI 43
1 import m a t h l i b . c l i e n t . c v a d r a . ∗ ;2 import m a t h l i b . c l i e n t . e c a l g .∗ ;3 import mathlib . c l ie nt . c vadra . impl .
∗;
4 import m a t h l i b . c l i e n t . e c a l g . i m p l . ∗ ;5 import org . osg i . framework . ∗ ;
7 p ub l ic c l a s s A c t i v a t o r implements B u n d l e A c t i v a t o r {8 S e r v i c e R e g i s t r a t i o n m e to d aS i mp s on S er v ic e ;9 S e r v i c e R e g i s t r a t i o n m e t o da T a n ge n t e iS e r v ic e ;10 p u b l ic vo id s t a r t ( B u n d l eC o nt e xt c o n t e x t ){11 me todaSimps onSe rvic e =12 c o n t e x t . r e g i s t e r S e r v i c e ( I M e to d aS im p so n . c l a s s . getName () ,13 new MetodaSimpson ( ) , n u l l ) ;14 S ys te m . o u t . p r i n t l n ( ” R e g i s t e r i n g M et od aS im ps on s e r v i c e . ” ) ;15 m e t o d a T a n g e n t e i S e r v i c e =16 c o n t e x t . r e g i s t e r S e r v i c e ( I M e t od a Ta n ge nt e i . c l a s s . getName () ,17 new MetodaTangentei () , n u l l ) ;18 S ys te m . o u t . p r i n t l n ( ” R e g i s t e r i n g M e to d a Ta n ge n te i s e r v i c e . ” ) ;19
}21 p u b l ic vo id s top ( B undleC onte xt c ont e xt ) {22 m e t o da S i m p so n S e r vi c e . u n r e g i s t e r ( ) ;23 m e t o d a T a n g e n t e i S e r v i c e . u n r e g i s t e r ( ) ;24 }25 }
iar fişierul manifest.mf este
1 Bundle−Name : M a t h l i b S e r v i c e2 Bundle−D e s c r i p t io n : M at hl ib S e r v i c e3 Bundle−V e rs i on : 1 . 0 . 04 Bundle−A c t i v a t o r : A c t i v a t o r5 Bundle−C l a s s p a t h : . , l i b / m a t h l i b . j a r , l i b / l o g 4 j − 1 . 2 . 1 5 . j a r6 Import−Pac kage : org . os gi . f ramew ork7 Export−Pac kage : mathlib . c l ie nt . c vadra ; ve rs io n=” 1. 0. 0 ” ,8 m a t h l i b . c l i e n t . e c a l g ; v e r s i o n =” 1 . 0 . 0 ”
Desfăşurarea resurselor ı̂n vederea arhivării este
|--> lib
| | mathlib.jar| Activator.class
Rezolvarea fiecărei probleme se obţine ı̂n câte un modul OSGi. Vom reutiliza claseleSimpleEcAlgDataIn şi SimpluCvadraDataIn , la care se adaugă câte o clasă care imple-mentează interfaţa BundleActivator.
Calculul soluţiei negative a ecuaţiei 2x − x2 = 0Un obiect care implementează interfaţa se obţine ı̂n doi paşi:
1. Se găseşte o referinţa a serviciului cu metoda
ServiceReference getServiceReference(String)
a clasei BundleContext. Variabila String reprezintă numele serviciului, adică nu-mele interfeţei.
2. Se obţine o instanţă a clasei ce implementează interfaţa cu metoda
Object getService(ServiceReference)
8/17/2019 Calcul Stiintific Java
44/210
44 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
Codul clasei Activator.java este
1 import m a t h l i b . c l i e n t . e c a l g .∗ ;2 import org . osg i . framework .
∗;
4 p ub l ic c l a s s A c t i v a t o r implements B u n d l e A c t i v a t o r {5 S e r v i c e R e f e r e n c e m e t o d a S i m p s o n S e r v i c e R e fe r e n c e ;6 p u b l ic vo id s t a r t ( B u n d l eC o nt e xt c o n t e x t ){7 tr y{8 me todaSimps onSe rvic e R e f e re nc e =9 c o n t e x t . g e t S e r v i c e R e f e r e n c e ( I M e t o d a Ta n g e nt e i . c l a s s . getName ( ) ) ;10 i f ( me todaSimps onSe rvic e R e f e re nc e != n u l l ){11 DataIn din=new SimpluEc AlgDataIn () ;12 IMe todaT ange nte i obj =13 ( I M e t o d a Ta n g e nt e i ) c o n t e x t . g e t S e r v i c e ( m e t o d a S i m p s o n Se r v i c e R e f e r en c e ) ;14 DataOut dout=obj . metodaTangentei ( din ) ;15 Syste m . out . pr in tl n (” \ n I n d i c a t o r u l d e r a s pu n s : ”+d ou t . g e t I n d ( ) ) ;16 S ys te m . o u t . p r i n t l n ( ” S o l u t i a e c u a t i e i : ”+d o ut . g et X ( ) ) ;17 S ys te m . o u t . p r i n t l n ( ” V a l o a r ea f u n c t i e i i n s o l u t i e : ”+d ou t . g e tF ( ) ) ;18 Syste m . out . pr in tl n (”Numarul i t e r a t i i l o r e f e c tu at e : ”+dout . ge tNi ( ) ) ;19 }20 }21 catch ( E x c e p t i o n e ) {22 Syste m . out . pr in tl n (”App Exc e ption : ”+e . ge tMe s s age ( ) ) ;23 }24 }
26 p u b l ic vo id s top ( B undleC onte xt c ont e xt ){27 i f ( me todaSimps onSe rvic e R e f e re nc e != n u l l ){28 c o n t e x t . u n g e t S e r v i c e ( m e t o d a S i m p s o nS e r v i c e R e f e r en c e ) ;29 }30 }31 }
Fişierul manifest.mf corespunzător este
1 Bundle−Name: AppEcAlg2 Bundle−D e s cr i p ti o n : R ez ol va re a u ne i e c u a t i i a l g e b r i c e3 Bundle−V e rs i on : 1 . 0 . 04 Bundle−A c t i v a t o r : A c t i v a t o r5 Import−Pac kage : org . os gi . f rame w ork , mathlib . c l ie nt . e c a lg
Dacă service.jar şi appecalg.jar sunt arhivele corespunzătoare componentelor OSGiMathlibService şi respectiv AppEcAlg (după valoarea atributului Bundle-Name) atuncicomenzile OSGi pentru rularea aplicaţiei sunt
g! start file: . . .\service.jar
Registering MetodaSimpson service.Registering MetodaTangentei service.
g! start file: . . .\appecalg.jar
Calculul integralei π
4
0 ln(1 + tan x)dx
În mod asemănător, dar folosind altă modalitate de programare OSGi, utilizăm
Clasa Activator.java
1 import m a t h l i b . c l i e n t . c v a d r a . ∗ ;2 import org . osg i . framework . ∗ ;3 import o r g . o s g i . u t i l . t r a c k e r . S e r v i c e T r a c k e r ;
5 p ub l ic c l a s s A c t i v a t o r implements B u n d l e A c t i v a t o r {6 S e r v i c e T r a c k e r m e t o d a S im p s o n Se r v i c e Tr a c k e r ;
7 p u b l ic vo id s t a r t ( B u n d l eC o nt e xt c o n t e x t ){
8/17/2019 Calcul Stiintific Java
45/210
1.8. UTILIZARE PRIN OSGI 45
8 me todaSimps onSe rvic e T rac ke r=new S e r v i c e T r a c k e r ( c o n t e x t ,9 IMetodaSimpson . c l a s s . getName () , n u l l ) ;10 me todaSimps onSe rvic e T rac ke r . open ( ) ;11 DataIn din=new SimpluCvadraDataIn ();12 IMetodaSimpson obj=13 (IMe todaSimps on) me todaSimps onSe rvic e T rac ke r . ge tS e r vi c e ( ) ;14 DataOut dout=obj . metodaSimpson( din ) ;15 Syste m . out . pr in tl n (” \ n I n d i c a t o r u l d e r a s pu n s : ”+d ou t . g e t I n d ( ) ) ;16 S ys te m . o u t . p r i n t l n ( ” I n t e g r a l a : ”+d ou t . g e t I n t e g r a l a ( ) ) ;17 Syste m . out . pr in tl n (”Numarul i t e r a t i i l o r e f e c tu at e : ”+dout . ge tNi () ) ;18 }
20 p u b l ic vo id s top ( B undleC onte xt c ont e xt ){21 m e t o d a Si m p s o n Se r v i c e Tr a c k e r . c l o s e ( ) ;22 }23 }
ı̂mpreună cu manifest.mf
1 Bundle−Name : AppInte grala2 Bundle−D e s cr i p ti o n : C a lc u l ul u ne i i n t e g r a l e3 Bundle−V e rs i on : 1 . 0 . 04 Bundle−A c t i v a t o r : A c t i v a t o r5 Import−Pac kage : org . os gi . f rame w ork , org . os gi . ut i l . tra c ke r ,6 m a t h l i b . c l i e n t . c v a d r a
8/17/2019 Calcul Stiintific Java
46/210
46 CAPITOLUL 1. APLICAŢII NUMERICE SIMPLE
8/17/2019 Calcul Stiintific Java
47/210
Capitolul 2
Accesarea ı̂n Java a unor produsematematice
Multe pachete de programe matematice oferă posibilitatea apelării lor din clase Java.Ne vom limita numai la produse distribuite gratuit. Vom prezenta utilizarea ı̂n Java aproduselor Mathematica, Maple, Scilab.
Ca motivaţii pentru un asemenea interes este posibilitatea elaborării unei aplicaţiiJava care utilizează funcţionalităţi ale softurilor amintite.
2.1 Java cu Mathematica
Mathematica este unul din produsele de vârf de matematică cu facilităţi de calculsimbolic şi numeric, de grafică şi de dezvoltare - programare proprie. Mathematica esteun produs comercial realizat de Wolfram Research.
Legătura dintre Mathematica şi Java este asigurată de componenta JLink a produsu-lui. JLink permite utilizarea unei clase Java ı̂ntr-o sesiune Mathematica şi a resurselorMathematica ı̂ntr-o clasă Java. Această din urmă posibilitate va fi prezentată ı̂n conti-nuare.
Compilarea ca şi execuţia presupune declararea ı̂n variabila classpath a fişieruluiJLink.jar din distribuţia Mathematica.
Într-o clasă Java, JLink se declară prin
import com.wolfram.jlink.*;
Accesarea resurselor Mathematica se face prin intermediul unui obiect de tip KernelLink,a cărei instanţiere poate fi
KernelLink ml=null;
try{
String[] mlArgs = {"-linkmode", "launch", "-linkname", args[0]};
ml=MathLinkFactory.createKernelLink(mlArgs);
ml.discardAnswer();
}
47
8/17/2019 Calcul Stiintific Java
48/210
48 CAPITOLUL 2. ACCESAREA ÎN JAVA A UNOR PRODUSE MATEMATICE
catch(MathLinkException e){
System.out.println("Fatal opening link error : "+e.getMessage());
System.exit(1);
}
Ultimul element al şirului mlArgs fixează locaţia nucleului MathKernel.exe, fiind transmisca argument al programului Java.
Şablonul de prelucrare al unei expresii / comenzi Mathematica este
try{
// Evaluarea expresiei / comenzii reprezentata prin String-ul expr
String expr=". . .";
ml.evaluate(expr);
ml.waitForAnswer();
// Prelucrarea rezultatului}
catch(MathLinkException e){
System.out.println("MathLinkException : "+e.getMessage());
}
finally{
ml.close();
}
Alternativ, metoda evaluate poate avea ca parametru o variabilă de tip Expr.Funcţie de tipul rezultatului, acesta se obţ ine cu una din metodele clasei KernerLink:
Expr getExpr(), double getDouble(), int getInteger(), boolean getBoolean().
Exemplul 2.1.1 S˘ a se rezolve ecuat ̧ia 2x − x2 = 0.1 import com. w olf ram . j l in k . ∗ ;2 p ub l ic c l a s s NSolve{3 p u bl i c s t a t i c vo id m ai n ( S t r i n g [ ] a r g s ){4 Ke rne lLink ml=n u l l ;5 tr y{6 S t r i n g [ ] m l Ar gs = {”−l i n km o d e ” , ” l a u n c h ” , ”−l i nk n am e ” , a r g s [ 0 ] } ;7 ml = MathLinkFac tory . c re a te Ke rne l Lin k (mlArgs );8 }9 catch ( MathLinkExc eption e ){10 S ys te m . o u t . p r i n t l n ( ” F a t a l o p e ni n g l i n k e r r o r : ”+e . g e tM e ss a ge ( ) ) ;11 Syste m . e x it (1 );12 }13 tr y{14 m l . d i s c a r d A ns w e r ( ) ; / / f . i m p o rt a n t 15 m l . e v a l u a t e ( ” N S o l ve [ 2 ˆ x−xˆ2==0,x ] ” ) ;16 ml. w aitForAns we r ( ) ;17 E xp r r e s u l t =m l . g e t Ex p r ( ) ;18 S ys te m . o u t . p r i n t l n ( r e s u l t . t o S t r i n g ( ) ) ;19 }20 catch ( E x c e p t i o n e ) {21 Syste m . out . pr in tl n (” MathLinkExc e ption : ”+e . ge tMe s s age ( ) ) ;22 }23 f i n a l l y {24 ml . c l o s e ( ) ;25 }26 }27
}
8/17/2019 Calcul Stiintific Java
49/210
2.1. JAVA CU MATHEMATICA 49
Execuţia se comandă pr