Calcul Stiintific Java

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