numerikus integráló programprog-mat.elte.hu/diplomamunka/szakdolgozat.pdf · 2008. 1. 13. · a...

41
Numerikus integráló program Programozó Matematikus Szak Esti tagozat készítette: Tarnai Tibor témavezető: Virágh Gábor Budapest, 2008

Upload: others

Post on 31-Jan-2021

2 views

Category:

Documents


0 download

TRANSCRIPT

  • Numerikus integráló program

    Programozó Matematikus SzakEsti tagozat

    készítette: Tarnai Tibor

    témavezető: Virágh Gábor

    Budapest, 2008

  •   Témabejelentő

  • TartalomjegyzékTémabejelentő............................................................................................................................................................................2

    Bevezetés...................................................................................................................................................................................4

    Felhasználói dokumentáció........................................................................................................................................................5

     1 A megoldott probléma.................................................................................................................................................................................5

    1.1. Működés.............................................................................................................................................................................................5

    1.2. Szükséges ismeretek..........................................................................................................................................................................5

     2 Felhasznált módszerek.................................................................................................................................................................................7

    2.1. A Hermite (Lagrange) interpolációs módszer....................................................................................................................................7

    2.2. A NewtonCotes módszer................................................................................................................................................................10

    2.3. A kompozit Simpson módszer ........................................................................................................................................................11

    2.4. A kompozit trapéz módszer ............................................................................................................................................................12

     3 A program használata................................................................................................................................................................................13

    3.1. Telepítés............................................................................................................................................................................................13

    3.2. Felhasználói felület (GUI)...............................................................................................................................................................13

    3.3. Megjegyzések, tanácsok a használathoz, hibajelzések....................................................................................................................14

    Fejlesztői dokumentáció...........................................................................................................................................................15

    1 A probléma részletes specifikációja............................................................................................................................................................16

    2 Felhasznált módszerek................................................................................................................................................................................16

    3 A program logikai szerkezete......................................................................................................................................................................16

    3.1 Asszociációs diagram (Association diagram)...................................................................................................................................17

    3.2 Osztálydiagram (class diagram)........................................................................................................................................................19

    3.3 A Parser............................................................................................................................................................................................20

    4 API dokumentáció......................................................................................................................................................................................26

    4.1 ComponentController........................................................................................................................................................................26

    4.2 ContextFactory..................................................................................................................................................................................26

    4.3 DrawArea..........................................................................................................................................................................................27

    4.4 Hermite.............................................................................................................................................................................................28

    4.5 IntegrationMethod............................................................................................................................................................................29

    4.6 Limit.................................................................................................................................................................................................29

    4.7 MainWindow....................................................................................................................................................................................29

    4.8 MethodList........................................................................................................................................................................................31

    4.9 MethodUser.......................................................................................................................................................................................31

    4.10 NewtonCotes....................................................................................................................................................................................31

    4.11 ParserController...............................................................................................................................................................................31

    4.12 Pmember.........................................................................................................................................................................................32

    4.13 Polynom..........................................................................................................................................................................................33

    4.14 Simpson...........................................................................................................................................................................................35

    4.15 Trapezium........................................................................................................................................................................................35

    5 Tesztelési terv, tesztelés eredmények..........................................................................................................................................................35

    5.1 Hibakezelés.......................................................................................................................................................................................35

    5.2 Helyes input melletti tesztek.............................................................................................................................................................35

    3

  •  

      Bevezetés

    A   program   a   numerikus   integrálási   módszereket,   a   közöttük   levő különbségeket   hivatott   bemutatni   szemléletes   módon,   azzal   a   céllal,   hogy   a felhasználó   a   lehető   legegyszerűbben   és   leggyorsabban   tudja   az   általa kiszámított   integrál   értékét   ellenőrizni,   illetve   az   integrálandó   függvény   egy egyszerű,   intuitív   grafikonját   megnézni.   Az   eredeti   feladatkiírásban   nem szerepelt   grafikus   felhasználói   felület,   de   azt   gondolom,   hogy   a   jelenlegi szoftverek   olyan   magas   szintűek,   és   a   felhasználóknak   olyan   magasak   az elvárásaik,   hogy   egy   parancssoros   eszközt   a   legtöbben   „fapados”nak bélyegeznének.   Az   eszköz   funkcionálisan   is   többet   tud   az   eredeti   kiíráshoz képest,   ugyanis   Gergó   Lajos   tanár   úr   tanácsát   megfogadva   nemcsak   egy integrálási módszer, hanem összesen négy algoritmust valósítottam meg, ezekről a tisztelt olvasó a felhasználói dokumentáció második részében kap részletesebb tájékoztatást.   A   fejlesztői   dokumentáció   első   részében   a   program   logikai szerkezetéről kaphatunk bővebb információt, ezután a parser által implementált grammatikába kaphatunk részletesebb betekintést. Az ezt követő részben kitérek az egyes objektumok struktúrájára és részletesen leírom, hogy melyik függvény pontosan   mikor   is   hívódik   fel   és   milyen   célt   szolgál.   Legvégül   a   program tesztelési tervét és a hozzá tartozó teszteredményeket mutatom be.

    4

  •   Felhasználói dokumentáció

     1  A megoldott probléma

    1.1. Működés

    A   program   alapvetően   az   egyváltozós   valós   függvények   határozott integrálját számítja ki. A problémát a következő könyvek részletesen is taglalják [1][2][3][4] . A megoldott probléma alapvetően három részre bontható. Az első rész egy megfelelő intuitív és egyszerű felhasználói felület   elkészítése   volt.   A   második   rész   a   feldolgozandó   függvény szemantikus elemzőjét foglalja magába. A harmadik rész a numerikus módszerek   megvalósítását   jelentette.   A   most   következő   szakaszban csak   a   harmadik   problémával   foglalkozunk,   az   első   kettő   rész részletesebb   kifejtését   a   fejlesztői   dokumentációban   találja   meg   a kedves felhasználó.

    1.2. Szükséges ismeretek

    A mostani rész bizonyos matematikai ismereteket tételez fel. Ezekről bővebben  [5]  ben   lehet   olvasni.   Most   pedig   lássunk   néhány elengedhetetlenül szükséges definíciót.

    D:  Legyen  f : I ℝ ekkor azt mondjuk, hogy  F∈D I az  ffüggvény primit ív függvényeinek a halmaza , ha  F '= f

    D: (felosztások)  ⊂[a ,b ] az  [a , b] intervallum egy felosztása , ha  véges és  a , b∈ . Jelölés:  ={x0 ,... , xn } .

    Itt megjegyezzük, hogy a program csak egyenletes felosztásokkal dolgozik.

    D: Az  f függvény  felosztásához tartozó alsó  közel ítő  

    összeg   ={x0 ,... , xn }s f ,=∑k=0

    n−1

    inf R f ∣[ x k , xk1 ]x k1−xk

    5

  • D: Az  f függvény  felosztásához tartozó felső  közel ítő  

    összeg   ={x0 ,... , xn }S f ,=∑k=0

    n−1

    supr R f ∣[ xk , x k1]xk1−x k

    D: Darboux féle alsó (felső) integrál. Legyen ∈ ,∀∈ : s f ,≤S f ,⇒supr s f , ≤inf S f ,

    I * f :=supr s f ,≤inf S f ,=: I* f

    D: Legyen  f : [a ,b]ℝ korlátos függvény, ekkor azt mondjuk, hogy f Riemann integrá lható , ha  I * f =I * f

    D: Riemann közelítő  összeg.  Legyen  f : [a , b]ℝ korlátos függvény,  ∈[ a , b ]={x0 , ... , x n}xk≤k≤xk1 ekkor 

    R f , ,=∑k=0

    n−1

    f k xk1− xk

    A   továbbiakban   tehát   csak   Riemann   integrálható   függvényekkel foglalkozunk. Az integrálhatósági feltételekkel kapcsolatos ismereteket a továbbiakban feltételezem. Bővebben ezekről  [5] ben lehet olvasni. A  lényeg  tehát,  hogy Riemann  integrálható   függvények esetében az alsó,  felső  és Riemann közelítő  összeg – ha a felosztás finomsága (azaz a  halmaz számossága) egyre nagyobb – a határozott integrál értékét egyre jobban közelíti. Fontos megjegyezni, hogy a numerikus módszereknek   nem   célja   a   primitív   függvény   megtalálása,   és   ez   a legnagyobb   előnye   is   egyben,   ugyanis   a   primitív   függvény megkeresése  még   tapasztalt  matematikusok,   sőt  még programoknak sem mindig triviális. A numerikus módszerek lényege, hogy az integrál értéke tetszőlegesen megközelíthető legyen, és az elkövetett hibára is tudjon   becslést   adni.Végül   pedig   következzen   a   tétel,   amelyik   a határozott és a határozatlan integrál között teremti meg a kapcsolatot.

    T:   f ∈R[a ,b]∧∃F : F '= f ⇒∫a

    b

    f =F b−F a

    ez a tétel az interpolációs módszernél bír igen nagy jelentőséggel.

    6

  •  2  Felhasznált módszerek

    A most következő módszerek közös vonása, hogy a függvényről csak az   osztópontok   és   az   osztópontokhoz   tartozó   függvényértékek ismeretét tételezi fel, más szóval ezek a módszerek olyan algoritmusok vagy ha tetszik függvények, melyek  ℝ

    2xnℝ  típusúak.

    2.1. A Hermite (Lagrange) interpolációs módszer

    Ez a módszer azon alapszik, hogy az integrálandó függvény helyett a függvény   interpolációs   polinomját   határozza   meg,   majd   ennek   a polinomnak   a   primitív   függvényét   kiszámítva   határozza   meg   a függvény határozott integrálját. Ehhez lássuk a következő definíciót:

    D: legyen  x0 ,... , xn az  [a , b] intervallum egyenletes felosztása. Ekkor azt mondjuk, hogy  p∈I [ x ]  az  f :ℝℝ függvény interpolációs polinomja, ha  ∀ i : px i= f x i∀ x i helyen.

    Egy   ilyen   polinom   azért   előnyös   számunkra,   mert   egyrészt   „jól” közelíti   az   eredeti   függvényt   (ez   nyílván   függ   az   intervallum felosztásának   finomságától   és   a   függvénytől),   másrészt   könnyű integrálni,   ugyanis   két   alapvető   integrálási   szabályt   kell   csak alkalmaznunk.

    D:  ∫ xn= xn1

    n1ami elég triviális, továbbá igaz a következő állítás:

    T:  ∫a

    b

    f g =∫a

    b

    f ∫a

    b

    g , ami annyit jelent, hogy összeget szabad 

    tagonként integrálni.

    Az   interpolációs   polinomot   osztott   differenciák   kiszámításával határozzuk   meg,   ezért   legelőször   is   lássuk   az   osztott   differencia definícióját.

    D:  f [ x , x ]:=lim x yf y − f x

    y−x= f ' x , ez az úgynevezett elsőrendű 

    osztott differencia. 

    7

  • Ebből   a   definícióból   következik   a   kadrendű   osztott   differencia definíciója:

    D:   f [ x , ... , x ]:= fk xk !

    Most már minden ismeretünk megvan az interpolációs polinom előállításához, lássuk tehát a módszert:

    Az osztott differencia táblázat felépítése:

    • Minden alappontot annyiszor veszünk fel egymás után, amennyi a multiplicitása, pl. x i  t  mi1 szer egymás után.

    • Beírjuk az   f x i értékeket és a megfelelő  f j xi

    j !értékeket az 

    x i alappontra   támaszkodó   j−1 edrendű   osztott   differenciák helyére ( f j x i ismeretében)

    • A táblázat   többi   részét   az  osztott  differencia   fogalom definíciója alapján töltjük ki.

    • Az interpolációs polinom felírása a táblázatból a szokásos módon történik,   a   táblázat   átlójában   szereplő   elemek,   mint   együtthatók segítségével.

    Itt megjegyezzük, hogy ha csak a függvényértékek ismertek, az első illetve   magasabb   rendű   deriváltak   viszont   nem,   a   Lagrange interpolációs polinomot kapjuk eredményül. Mivel a program csak egy formulát kap bemenetként, a deriváltak előállítását  formálisan illetve numerikusan   –   nem   valósítottam   meg.   A   módszer   érdekessége   és egyben hiányossága az úgynevezett  Runge anomália,  amit  az  alábbi példa is szemléltet: 

    8

  • Illustration 1: Runge anomália

    A piros vonal jelöli az interpolált függvényt, a kék jelöli az ötödfokú  interpolációs   polinomot,   a   zöld   pedig   a   kilencedfokú   interpolációs  polinomot. Az interpolációs pontokban az elkövetett hiba definícióból adódóan   0,   viszont   két   interpolációs   pont   között   a   kilencedfokú  polinomnál nagyobb mint az ötödfokúnál, ami enyhén szólva nem várt eredmény (lásd a függvényértékeket az intervallum két végpontjához  közeli helyeken). Más szóval ez azt jelenti, hogy a többi módszerrel  ellentétben a Hermite interpolációs módban az osztópontok számának növelése – a függvény tulajdonságaitól függően  egy bizonyos határ  felett nem növeli (akár csökkentheti)  az integrál értékének pontosságát.

    9

    Illustration 2: Hermite interpoláció

  • Fent   látható   egy   példafuttatása   a   programnak.  A   sin(x)   függvényt  integráljuk   0tól   7ig   4     osztóponttal.   A   piros   vonal   jelöli   az  integrálandó függvényt, a zöld pedig az interpolációs polinomot. A bal alsó sarokban látható a maximális eltérés az integrálandó függvény és az interpolációs polinom között.

    2.2. A NewtonCotes módszer

    Először is lássunk néhány szükséges definíciót:

    D:  Legyen  f : [a , b]ℝ korlátos és  w : [a ,b]ℝ+ súlyfüggvény. Az 

    ∫a

    b

    fw integrál kiszámításához közelítsük  f et a 

    P x =∑i=0

    n

    f x i li x∈P [ x ]n−1 interpolációs polinommal, 

    ahol  x0, ... , x n természetesen az alappontokat  l ix az i. Lagrange   

    interpolációs polinomot jelöli. 

    Ekkor  ∫a

    b

    fw≈∫a

    b

    Pw=∑i=1

    n

    f x i∫a

    b

    l i w=∑i=1

    n

    c i f x i

    D:   ∫a

    b

    fw közelítésére felírt formulát interpolációs típusúnak 

    nevezzük, ha  c i=∫a

    b

    l i w

    Ezeket   a   kvadratúra   formulákat   akkor   nevezzük   NewtonCotes formuláknak, ha a   w≡1 . Az itt bemutatott módszer lényege tehát a Hermitehez képest, hogy nem az egész intervallumon interpolálunk, hanem csak az egyes osztópontok között. Ezekre a részintervallumokra számítjuk ki az interpolációs polinom integrálját, majd a végén ezeket összegezzük. Megjegyezzük, hogy a kompozit Simpson és a kompozit trapéz   módszer   illetve   egyéb   módszerek   a   NewtonCotes   formula speciális esetei.

    10

  • 2.3. A kompozit Simpson módszer 

    A kompozit Simpson módszer a NewtonCotes speciális esete, azaz egy másodfokú Lagrange interpolációs polinommal közelítjük a részintervallumokat. A hozzátartozó levezetés nélkül a következő formula a végeredmény:

    ∫a

    b

    f x dx≈h3[ f x04∑

    k=1

    n/2

    f x2k−12∑k=1

    n/2

    f x2k f xn]

    11

    Illustration 3: A NewtonCotes módszer a programban

  • 2.4. A kompozit trapéz módszer 

    A   kompozit   Simpsonhoz   hasonlóan   a   kompozit   trapéz   formula elsőfokú   Lagrange   interpolációs   polinomot   használ   a részintervallumok   közelítésére.   A   levezetett   formula   a következőképpen néz ki:

    ∫a

    b

    f x dx≈h2[ f x0∑

    k=1

    n−1

    f xk f x n]

    12

    Illustration 5: A kompozit trapéz módszer a programban

    Illustration 4: A kompozit Simpson módszer a programban

  • A   NewtonCotes   formula   speciális   eseteinek   (kompozit   Simpson, kompozit   trapéz)   kétségtelen   előnye,   hogy   alacsony   fokszámú polinomokat használva az integrál kiszámítása gyors és nem megy az eredmény pontosságának rovására. Erről a felhasználó az osztópontok növelésével győződhet meg. 

    Figyelem:  a  Hermite módszer  20nál   több osztópontra  nem ajánlott, ugyanis   nagyon   hosszú   ideig   eltarthat   az   interpolációs   polinom előállítása.

     3  A program használata

    3.1. Telepítés

    A programot először is telepíteni kell. A telepítéshez illetve futtatáshoz a  java 1.6  os  futási  környezete szükséges,  ez alatti  verziókkal  nem működik.  A  programot  két  disztribúcióban   lehet   letölteni,   az   egyik standalone, ami csak a intg.jar  tömörített java állományt tartalmazza, a második   egy   futási   környezetet   is   tartalmazó   zip  intg.zip  fájl.   A standalone   disztribúciót   (integr.jar)   egyszerűen   bemásoljuk   egy általunk   létrehozott   könyvtárba   és   a  java   jar   intg.jar  paranccsal futtathatjuk is. A intg.zip fájlt szintén nagyon egyszerű telepíteni, csak egy általunk létrehozott könyvtárba ki kell csomagolni, és a integr.bat (Windows) illetve az integr.sh  (Linux/Unix) szkriptekkel indíthatjuk a programot.

    3.2. Felhasználói felület (GUI)

    Miután   a   programot   telepítettük,   futtatáskor   a   következő   felületet láthatjuk:

    • az f(x) inputmezőbe az integrálandó függvény formuláját kell beírni

    a   függvény   egy     a   fejlesztői   dokumentációban     megadott szintaktikát kell kielégítenie

    • a from inputmezőbe az intervallum alsó határát kell beírni

    • a to inputmezőbe az intervallum felső határát kell megadni

    • a nop (number of points) mezőbe pedig az osztópontok számát kell megadni

    • a  result  kiviteli   mező   tartalmazza   az   adott   paraméterekkel kiszámított integrál értékét

    13

  • 3.3. Megjegyzések, tanácsok a használathoz, hibajelzések

    • Mielőtt   sok   osztópontra   ráengednénk   a   programot   próbáljuk   ki 1020   osztóponttal,   hogy   mennyire   kielégítő   az   eredmény.   Ez   a Simpson és a trapéz módszerre nem vonatkozik.

    • A program nem ellenőrzi, hogy a megadott függvény integrálhatóe vagy sem, ez nemkívánatos eredményekhez vezethet.

    • Általában nem ajánlott a Hermite módszert sok (>20) osztópontra alkalmazni, ugyanis ez nagyon sok számítást és hosszú futási időt eredményezhet.

    • Ha már több mint egy formulát adtunk meg inputként, akkor a  fel (↑) le(↓) gombokkal váltogathatunk az előzőleg megadott inputok között. A lista végéről közvetlenül a lista elejére ugrunk. A program bezárásával a fent említett lista elveszik.

    14

  •   Fejlesztői dokumentáció

    15

  • 1  A probléma részletes specifikációja

    A program képes egy a megadott grammatikának megfelelő egyváltozós valós függvényt integrálni négy különböző numerikus módszerrel. Ehhez biztosít egy kényelmes,   intuitív   felhasználói   felületet,   ahol   a   függvény   grafikus megjelenítésén   kívül   látható   a   számítás   aktuális   állapota   százalékosan,   az integrálási határok illetve az osztópontok száma. A program platformfüggetlen, azaz operációs rendszertől és hardvertől egyaránt független (illetve minden olyan rendszeren használható, ahol a java virtuális gép futtatható).

    2  Felhasznált módszerek

    A program fejlesztési alapját  UML modell szolgáltatta.  A programot Eclipse   (Europa)   fejlesztőkörnyezetben   készítettem,   UML   pluginként   az Omondo   által   biztosított   ingyenesen   hozzáférhető   bővítést   telepítettem.   A program a   java  által   biztosított   adatszerkezeteken  kívül   sajátot   nem használ. Algoritmusokban a Hermite interpoláció jelentette a legnagyobb kihívást. Itt a numerikus  analízisben   elterjedt   osztott   differenciás  módszert  használtam egy alsó   háromszög   mátrix   kitöltésére,   melyben   az   osztott   differenciák   értékeit tárolom rendre.

    3  A program logikai szerkezete

    A programot az MVC ( Modell – View – Controller ) filozófiájának megfelelően strukturáltam, azzal a céllal, hogy legyen egy önállóan futtatható alkalmazás, másrészt legyen egy újra felhasználható része, amit kívülről is lehet használni. A Modell számítja az input alapján az output adatokat  itt elsősorban az  integrálási  módszerekre kell  gondolni     ,  de  külön használható  a  Hermite interpolációs  osztály,   a  Polynom osztály  és  a  Parser  osztály   is,   ezek  bővebb magyarázatához lásd az API dokumentációt. A View alatt természetesen a GUIt –   felhasználói   felületet   –   kell   érteni.   Ezt   a   Netbeans   fejlesztőkörnyezettel terveztem, ugyanis az Eclipse tökéletes kódszerkesztése és egyéb kiváló funkciói ellenére nagy hiányossága, hogy nem tartalmaz egy integrált GUIdesignert. A felhasználói felületet a felhasználói dokumentációban részletesebben kifejtem. A Controller  hivatott   a  View és  a  Modell   közötti  kapcsolatot  megteremteni,  ő vezérli a programfutást, továbbítja az inputot a felületről a Parsernak, a Parsertől visszajövő adatokat pedig továbbítja a GUIn kiválaszott integrálási módszernek. Az alábbi két képen lehet látni az osztályok tartalmazási viszonyait, ami nagyon szemléletesen ábrázolja a program logikai struktúráját.

    16

  • 3.1  Asszociációs diagram (Association diagram)

    17

  • 18

  • 3.2  Osztálydiagram (class diagram)

    19

  • 3.3  A Parser

    A   Parsert   a   javacc   (java   compiler   compiler   4.0)   programmal készítettem.   Ez   a   csomag  https://javacc.dev.java.net/  oldalról   tölthető   le példakódokkal, grammatikákkal, ill. minden ami egy java nyelven írt parserhez szükséges. A program által leírt grammatika a következőképpen néz ki (kékkel a parser generáló inputját jelöltem, minden rész alatt megtalálható a hozzá tartozó magyarázat):

    options {  LOOKAHEAD = 1;  CHOICE_AMBIGUITY_CHECK = 2;  OTHER_AMBIGUITY_CHECK = 1;  STATIC = true;  DEBUG_PARSER = false;  DEBUG_LOOKAHEAD = false;  DEBUG_TOKEN_MANAGER = false;  ERROR_REPORTING = true;  JAVA_UNICODE_ESCAPE = false;  UNICODE_INPUT = false;  IGNORE_CASE = false;  USER_TOKEN_MANAGER = false;  USER_CHAR_STREAM = false;  BUILD_PARSER = true;  BUILD_TOKEN_MANAGER = true;  SANITY_CHECK = true;  FORCE_LA_CHECK = false;}

    Ezek a javacc oldalán ajánlott alapértelmezett beállítások. Az egyedüli amit ezen változtattam, hogy a parserem statikus, azaz csak egy példány létezik belőle a futás során.

    PARSER_BEGIN(Parser)

    package numeric_integration;

    public class Parser {

    public static String variableId = "x";// **********************************************************

    20

    https://javacc.dev.java.net/

  • // ** The code below is generated ********************************// **********************************************************}PARSER_END(Parser)

    Fent   a   parser   formális   definíciója   látható,   ebből   lesz   a   Parser   osztály   java kódjának nem generált része.

    SKIP : /* WHITE SPACE */{ " " | "\t" | "\f" }

    A megengedett elválasztó elemek.

    TOKEN:{  }

    Az bemenetkén szolgáló formulát lezáró elemek.

    TOKEN:{  }

    TOKEN:{  }TOKEN:{  }TOKEN:{  }

    TOKEN : /* OPEN_PAR */{  }

    TOKEN : /* CLOSE_PAR */{  }

    TOKEN : /* VARIABLE */{  }

    /*          OPERATORS           */

    21

  • TOKEN:{   }TOKEN:{  }TOKEN:{  }TOKEN:{  }TOKEN:{  }

    Fent található a nyelvben megengedett elválasztó elemek (space, tab, newline), számok (egész és   tizedes),  a  zárójelek,  a változók, valamint a műveleti   jelek definíciója.

    /*     ELEMENTARY FUNCTIONS     */TOKEN:{   }TOKEN:{   }TOKEN:{   }TOKEN:{   }TOKEN:{   }TOKEN:{   }TOKEN:{   }TOKEN:{   }

    Itt   a   felhasználható   függvényeket   soroltam   fel,   ha   a   fejlesztő   további függvényeket szeretne definiálni először is ide kellene felvenni az új függvény nevét.

    Az   alábbiakban   jön   a   nyelvtan   definíciója.   Itt   fontos   kiemelni,   hogy   az operátorok   precedenciájának   megfelelően   kerül   parsolva   a   kifejezés.   Ezt bővítésnél   is   figyelembe  kell  venni.  A  parsolással   egy   időben  a  kifejezés   is kiértékelésre kerül.

    // Start of the GRAMMAR

    double eval() throws NumberFormatException :{    double previousValue;}{ ( previousValue = Expression()  { return previousValue; } )* }

    double Expression() throws NumberFormatException :{    double i, value;

    22

  • }{    value = addTerm() (    i = addTerm() { value += i; } |                            i = addTerm() { value = i; } )*   { return value; }  }

    double addTerm() throws NumberFormatException :{    double i, value;}{    value = mulTerm() (    i = mulTerm() { value *= i; } |                            i = mulTerm() { value /= i; } )*   { return value; }}

    double mulTerm() throws NumberFormatException :{    double value, p;}{    value = Primary() (  p = Primary()    { value = java.lang.Math.pow(value, p); } )*    { return value; }}

    double Primary() throws NumberFormatException :{    Token t;    double d;}{    t =     { return  Double.parseDouble(t.image); }    |     d = Expression()     { return d; }    |      d = Primary()

    23

  •     { return d; }        |        d = Expression()     { return java.lang.Math.sin(d); }    |      d = Expression()     { return java.lang.Math.cos(d); }    |      d = Expression()     { return java.lang.Math.tan(d); }    |         d = Expression()     { return 1/java.lang.Math.tan(d); }    |      d = Expression()     { return java.lang.Math.exp(d); }    |      d = Expression()     { return java.lang.Math.log(d); }    |      d = Expression()     { return 0.5*(java.lang.Math.exp(d)  java.lang.Math.exp(d)); }    |      d = Expression()     { return 0.5*(java.lang.Math.exp(d) + java.lang.Math.exp(d)); } }

    24

  • A fent leírtakból könnyen látható, hogyan kell további függvényekkel bővíteni a grammatikát, illetve a meglévőket hogyan lehet módosítani például úgy, hogy működjön a java nyelv BigDecimal (tetszőlegesen hosszú decimális számok) osztályával. Külön ki kell emelni, hogy maga a parser nem  támogatja a változók   kiértékelését,   csak   a   szintaktikus   ellenőrzést,   a   változók kiértékelésének menetét későbbiekben fejtem ki a ParserController osztálynál. A parser generálását a következő parancs végzi:  javacc Parser.jj  . Ez a következő osztályokat generálja:

    • ParseException.java

    • Parser.java

    • ParserConstants.java

    • ParserTokenManager.java

    • SimpleCharStream.java

    • Token.java

    • TokenMgrError.java

    25

  • 4  API dokumentáció

    4.1  ComponentControllerEz az osztály hivatott az MVC tervmintában a Controller szerepét megvalósítani. Ez az osztály biztosítja a kapcsolatot a View és a Modell között.

    • public void execute()

    Lekérdezi a parsolt értékeket, majd egy külön szálon elindítja a   számítást.   A   számítás   kezdetével   a   „Start”   gomb deaktiválódik,   aminek   eredményeképpen   újabb   számítás   nem indítható.

    • public double[][] getParsedValues()

    Visszaadja a  Parser  által parsolt értékeket egy kétdimenziós dupla   pontosságú   tömbben.   A   tömb   hossza   természetesen   az osztópontok számával egyezik meg, ezek száma a Limit osztályban találhatók meg.

    • public void initMethod(PropertyChangeListener Listener, JProgressBar p, MethodUser u)

    Inicializálja a ComponentController osztályt, minden számítás megkezdése   előtt   lefut,   a   Progressbar   példányát   átadja   a kiválasztott   számítási   objektumnak   (numerikus   módszernek),   a PropertyChangeListener  egy   figyelő,   mely   a   progressbar tulajdonságainak változását figyeli.

    • public void parseInput() throws ParseException

    A  System.in  Objektumból tud olvasott formulát adja tovább a Parsernak. Hibás kifejezés esetén  ParseException  hibát vált ki.

    • public void parseInput(String input) throws ParseException

    A felületen megadott formulát adja tovább a Parsernek. Hibás kifejezés esetén ParseException hibát vált ki.

    • public void selectMethod(String method)

    A felületen kiválasztott módszert állítja be aktuális számítási módszernek,   a   számítási   módszereknek   az   IntegrationMethod interfacet   kell   implementálniuk.   Valójában   itt   egy   pointer állítódik az adott numerikus módszert megvalósító osztály egy példányára.

    4.2  ContextFactory

    A   BigDecimal   osztály   műveleteihez   biztosítja   a   számítás   pontosságát   leíró kontextust.

    • public static final MathContext getContext() 

    A   számításokhoz   használt  BigDecimal  osztály   pontosságát 

    26

  • reprezentáló  MathContext  objektumokat   gyárt,   ez   egy   gyártó tervminta.   A    MathContext  keretfeltételeit   a   Limit   osztály tartja nyílván.

    • public static final int getPrecision()

    A  MathContext  objektum   beállított   pontosságát   lehet   ezzel   a függvénnyel lekérdezni.

    • public static final void setPrecision(int p) 

    A   MathContext objektum pontosságát lehet ezzel a függvénnyel beállítani.

    • private ContextFactory()

    Mivel ez az osztály csak statikus függvényeket tartalmaz, az explicit példányosítást megakadályozzuk.

    4.3  DrawArea

    A rajzolófelület és a hozzátartozó objektumok reprezentáló osztálya.• public void addCoordinates(double[][] coordinates) 

    A rajzolófelületre kirajzolni kívánt koordinátákat lehet ezzel a   függvénnyel   az   objektumba   regisztrálni,   a   koordináták   egy vektor   típusú   adatszerkezetben   vannak   tárolva.   A rajzolófüggvény   ezeknek   a   koordinátáknak   a   transzformált értékeit rajzolja ki a Canvasra.

    • public void clear()

    Az összes eddig tárolt koordinátát töröljük ezzel a hívással.

    • public void drawCoordinateSystem(Graphics g)

    A   koordináta   rendszert   rajzolja   meg,   kiszámítja   a   függvény maximumából   minimumából   valamint   az   integrálási   határokból, hogy milyen értékek jelenjenek meg a koordináta rendszerben.

    • private double[] findMinMax(double[][] coordinates)

    Megkeresi   az   eddig   tárolt   összes   koordináta   minimumát   és maximumát,   ezeket   abszolút   maximumnak   illetve   abszolút minimumnak nevezzük.

    • public Dimension init() 

    Inicializálja a rajzolófelület (Canvas) koordinátáit és méretét.

    • private int iX(double x) 

    Koordinátatranszformációt   végez   a   fizikai   és   logikai koordináták között.

    • private int iY(double x) 

    Koordinátatranszformációt   végez   a   fizikai   és   logikai koordináták között.

    • public double maxDeviation() 

    A Hermite interpoláció esetén a legnagyobb eltérést mutatja az interpolációs   polinom   és   a   függvény   között,   a   tárolt koordinátákból   számol,   tehát   nem   feltétlenül   a   ténylegesen elkövetett hibát jeleníti meg.

    27

  • • public void paint(Graphics g)

    A java framework által felhívott paint függvényt terheli túl (overloading),   a   kirajzolást   végzi.   A   paraméterként   kapott Graphics  objektum   képes   a   rajzolófelület   megfelelő módosítására.

    4.4  Hermite

    A Hermite interpolációt megvalósító osztály.• public Hermite()

     Inicializálja az objektumot.

    • public void addInput(Vector newinputData)

    Új   alappont   függvényértékpárokat   ad   az   objektumhoz,   ekkor egyszerű   Lagrange   interpolációról   beszélünk.   Általánosabb esetben magasabbrendű deriváltakat is meg lehet itt adni. A szakdolgozat keretein belül ezt a szolgáltatást nem használtam ki, ugyanis a függvény deriváltjait előállítani nem triviális feladat. 

    • public void clearInput()

     Inicializálja a Hermite osztály bemenő adatait.

    • public Object countHermite()

    Előállítja az interpolációs polinomot, teszi mindezt egy külön szálon.   A   numerikus   módszereket   megvalósító   osztályok   a Swingworker java osztályból származnak, így további módosítások nélkül külön szálon futtathatók.

    • public Object doInBackground()

    A  Swingworker  osztály   felüldefiniált   függvénye,   a   szál indítását követően hívódik meg. A countHermite függvényt hívja.

    • public void done()

    A szál befejeztével – azaz a számítás végén – hívódik meg és az őt tartalmazó objektumnak visszaadja az eredményt.

    • private BigDecimal fact(long n)

    Kiszámítja n faktoriálisát.

    • private int findIndex(BigDecimal d)

    Megkeresi   egy   adott   osztott   diferencia   indexét   az   őt reprezentáló vektorban.

    • public void printResult()

    Ezzel lehet beállítani, hogy az eredményt a Hermite osztály adja vissza a számítás végén, vagy egy külső objektum kérdezi le.

    • public void setInputData(double[][] input)

    Az addInput lebutított változata.

    • public void suppressResult()

    Ezzel lehet beállítani, hogy az eredményt a Hermite osztály adja vissza a számítás végén vagy egy külső objektum kérdezi 

    28

  • le.

    4.5  IntegrationMethod

    Minden integrálási módszer ebből az osztályból származik.• public void clearResult()

    Az eredményt törli.

    • public void done()

    Alapértelmezésben   ez   fut   le   a   számítás   végén,   kivéve   ha   a származtatott osztály felüldefiniálja.

    • public void setInputData(double[][] input)

    Beállítja a numerikus módszer bemenő adatait.

    • public void setProgress(JProgressBar p) 

    Regisztrálja a GUIn levő progressbar példányát.

    • public void setUser(MethodUser u) 

    A módszer felhasználóját regisztrálja.

    4.6  Limit

    A számítás keretfeltételeit ( az intervallum két határa, az osztópontok száma ) nyílvántartó osztály. A lépésközt is ez az osztály számítja.

    • public static double evalStep() 

    Kiszámítja az integrálási határok és az osztópontok alapján, hogy mekkora legyen a lépésköz, értéke dupla pontosságú lehet.

    • public static double getLowerLimit() 

    Az   integrálási   intervallum   alsó   végpontját   adja   vissza   a számításokhoz.

    • public static int getNumberOfPoints() 

    Megadja az osztópontok számát.

    • public static double getUpperLimit()

    Az   integrálási   intervallum   felső   végpontját   adja   vissza   a számításokhoz.

    • public static void setLowerLimit(double low) 

    Beállítja az integrálási intervallum alsó végpontját.

    • public static void setNumberOfPoints(int numPoints)

    Beállítja az osztópontok számát.

    • public static void setUpperLimit(double high)

    Beállítja az integrálási intervallum felső végpontját.

    4.7  MainWindow

    Az MVC tervmintában szereplő  View objektumot hivatott   reprezentálni,  ez a 

    29

  • program fő belépési pontja. Ez az osztály kezeli a GUIn kiváltott eseményeket.• public static void main(String args[]) 

    A belépési pontja a programnak.

    • public MainWindow() 

    A konstruktor. Meghívja az initComponents függvényt.

    • public void count() 

    A „Start” gomb megnyomásakor hívódik meg, ez a függvény triggereli a számításokhoz szükséges akciókat.

    • public void enableStart() 

    A „Start” gombot teszi újra klikkelhetővé.

    • private int findInput(String input) 

    Az input történetben megkeresi egy adott input indexét az azt tároló vektorban.

    • private void initComponents() 

    A képernyőn levő komponenseket inicializálja.

    • private void jInputStringKeyPressed(java.awt.event.KeyEvent evt) 

    Akkor hajtódik végre, ha az inputmezőben van a kurzor és a felhasználó megnyom egy gombot, a fel le billentyűkre reagál, ez lépteti az input történetet fel illetve le.

    • private void jStartActionPerformed(java.awt.event.ActionEvent evt)

    Amikor   a   felhasználó   erre   a   gombra   kattint,   ez   a   függvény hívódik fel, ellenőrzi hogy minden szükséges input meg lette adva, és felhívja a count függvényt.

    • public void prePaint() 

    A rajzolási feladatok előtt kell felhívni, inicializáló függvény.

    • public void propertyChange(PropertyChangeEvent evt) 

    A progressbaron történt változásokat hivatott a képernyőre frissíteni.

    • public void retrieveInput() throws NumberFormatException 

    Az inputként megadott számokat olvassa be és parsolja tényleges számokká.   Ha   valamelyik   nem   sikerül   NumberFormatException kivételt dob.

    • public void setResult(BigDecimal result) 

    Az integrálási módszerek ezt a függvényt hívják meg a számítás végén. Ezzel állítják be a felhasználó objektumnak a számítás számszerű eredményét.

    • public void setResult(Polynom p) 

    Az integrálási módszerek ezt a függvényt hívják meg a számítás végén. Ezzel állítják be a felhasználó objektumnak a számítás polinom eredményét.

    30

  • 4.8  MethodList

    Ez az interface a felhasználható integrálási módszereket sorolja fel, konstansokat tartalmaz.

    4.9  MethodUser

    Ezt   az   interfacet   kell   minden   olyan   osztálynak   implementálnia,   ami   az integrálási módszereket használni szeretné.

    • public void enableStart() 

    Ez a függvény hívódik meg a módszer végén, újra klikkelhetővé teszi a „Start” gombot.

    • public void setResult(BigDecimal result) 

    Az integrál numerikus értékét állítja be.

    • public void setResult(Polynom p) 

    Az eredménypolinomot állítja be a numerikus módszert felhasználó osztálynál.

    4.10  NewtonCotes

    Ez az osztály valósítja meg a NewtonCotes numerikus integráló módszert.• public Object doInBackground() 

    Ez a függvény végzi a tényleges számításokat, a progressbar állapotát változtatja. Ezután hívódik meg a done() függvény, az IntegrationMethodtól örökölt függvénye.

    • public void done() 

    A  doInBackground()  után   hívódik   meg,   azaz   közvetlenül   a munkaszál   terminálása   előtt.   Beállítja   az   őt   tartalmazó objektum eredményeit reprezentáló objektumait.

    • public void enableStart() 

    Üres implementáció.

    • public void setResult(BigDecimal d) 

    Részeredményeket tart nyílván a végeredményt a done() függvény állítja be.

    • public void setResult(Polynom p) 

    Üres implementáció.

    4.11  ParserController

    Ez az osztály hivatott egy plusz réteget megvalósítani a ComponentController és a Parser osztály közé. Erre azért van szükség, mert  a Parser osztály egy generált osztály korlátozott módosítási lehetőségekkel.

    • public static double[][] getParsedValues() 

    31

  • A Parser által parsolt értékeket adja vissza két dimenziós dupla pontosságú tömbben.

    • public static void parseInput(byte[] input) throws ParseException

    Bytetömbben   érkező   inputot   dolgozza   fel   és   adja   tovább   a Parser   objektumnak.   A   változó(k)   helyettesítése   is   ebben   a függvényben   történik.   Lekérdezi   a   Limit   osztályból   a keretfeltételeket   és   a   megfelelő   értékkel   helyettesíti   a parsolni kívánt kifejezésben a változókat, majd így adja tovább a   Parsernak,   ezzel   lényegében   csupa   konstansokból   álló kifejezések parsolására szűkíti a parser feladatkörét.

    • public static void parseInput(String input) throws ParseException

    A   Stringként   érkező   inputot   dolgozza   fel   és   adja   tovább   a Parser   objektumnak.   A   változó(k)   helyettesítése   is   ebben   a függvényben   történik.   Lekérdezi   a   Limit   osztályból   a keretfeltételeket   és   a   megfelelő   értékkel   helyettesíti   a parsolni kívánt kifejezésben a változókat, majd így adja tovább a   Parsernak,   ezzel   lényegében   csupa   konstansokból   álló kifejezések parsolására szűkíti a parser feladatkörét.

    4.12  Pmember

    Ezt az osztályt a Polinom osztály használja fel, a Polinom együtthatóit és kitevőit reprezentálja.

    • public Pmember add(Pmember p) 

    Két Pmember objektumot tud összeadni, az eredmény egy új Pmember objektumba kerül.

    • public BigDecimal getCoefficient() 

    Lekérdezi egy Pmember objektum együtthatóját.

    • public int getExponent() 

    Lekérdezi egy Pmember objektum kitevőjét.

    • public Pmember multiply(BigDecimal d) 

    Egy Pmember típusú objektumot tud összeszorozni egy BigDecimal típusú objektummal. Az eredmény egy új Pmember objektumba kerül.

    • public Pmember multiply(Pmember p) 

    Egy Pmember típusú objektumot tud összeszorozni egy Pmember típusú objektummal. Az eredmény egy új Pmember objektumba kerül.

    • public Pmember negate() 

    Egy Pmember típusú objektum negáltját adja vissza egy új Pmember típusú objektumban.

    • public void setCoefficient(BigDecimal d) 

    Egy Pmember típusú objektum együtthatóját lehet beállítani ezzel a függvénnyel.

    32

  • • public void setCoefficient(long n) 

    Egy Pmember típusú objektum együtthatóját lehet beállítani ezzel a függvénnyel.

    • public void setExponent(int n) 

    Egy Pmember típusú objektum kitevőjét lehet beállítani ezzel a függvénnyel.

    • public void setPmember(Pmember p) 

    Egy   Pmember   típusú   objektumot   lehet   ezzel   a   függvénnyel beállítani.

    • public Pmember subtract(Pmember p) 

    Két Pmember objektumot tud kivonni, az eredmény egy új Pmember objektumba kerül.

    • public String toString() 

    Egy Pmember objektumot tud String típussá konvertálni.

    4.13  Polynom

    Ez az osztály a programban levő polinomokat reprezentálja.• public Polynom(Vector v) 

    Egy Polinomot hoz létre az argumentumként megadott vektorral.

    • public void add(Pmember m) 

    Egy   polinomhoz   ad   hozzá   egy   Pmember   típusú   objektumot.   Az eredmény a meglévő példányba kerül tárolásra.

    • public void add(Polynom q) 

    Két polinomot ad össze. Az eredmény a meglévő példányba kerül.

    • public void clear() 

    Inicializálja a polinomot. Az eredmény nullpolinom.

    • public BigDecimal evalAt(BigDecimal x) 

    Kiértékeli a polinomot egy adott (valós) helyen.

    • public BigDecimal evalAt(double x) 

    Kiértékeli a polinomot egy adott helyen.

    • public int findByExp(int exp) 

    Megkeresi egy adott kitevőjű együttható indexét.

    • public double[][] getCoordinates() 

    A   Limit   osztály   által   visszaadott   keretfeltételek   alapján kiértékeli   a   polinomot   különböző   alappontokban,   majd   az eredményt   egy   kétdimenziós   dupla   pontosságú   tömbben   adja vissza.

    • public int getDeg() 

    Visszaadja a polinom fokszámát.

    • public Pmember getMember(int num) 

    Egy adott indexű polinomtagot ad vissza, ha létezik ilyen.

    33

  • • public int getSize() 

    Lekérdezi a polinomtagok számát.

    • public Vector getVector() 

    A   polinomot   reprezentáló   vektor   másolatát   adja   vissza.   Copy konstruktorként lehet használni.

    • public BigDecimal integrate(double from, double to) 

    Adott   intervallumon   kiszámítja   a   polinom   határozott integrálját.

    • public boolean isnullPol() 

    Lekérdezi hogy a polinom nullpolinom e.

    • public Polynom multiply(BigDecimal d) 

    Megszorozza a polinomot egy BigDecimal számmal. Az eredmény egy új példányba kerül.

    • public Polynom multiply(Pmember m) 

    Megszorozza a polinomot egy Pmember polinomtaggal. Az eredmény egy új példányba kerül.

    • public Polynom multiply(Polynom q) 

    Két polinomot szoroz össze. Az eredmény egy új példányba kerül. A   szorzás   módszere   „minden   tagot   minden   taggal”.   Ennél hatékonyabb algoritmusok is léteznek, sajnos a különbség csak nagyon magas fokszámú (~1000) polinomoknál érezhető.

    • public void negate() 

    Egy polinom negáltját adja vissza (minden tag negáltját).

    • public Polynom pow(int n) 

    Egy polinom hatványát adja vissza. Az eredmény egy új példányba kerül, csak egész kitevővel működik.

    • public void setMember(BigDecimal d, int exp) 

    A polinom egy adott kitevőjű és együtthatójú tagját állítja be. Ha   volt   már   ilyen   tag,   akkor   felülírja,   ha   nem   akkor létrehozza.

    • public void setMember(Pmember newVal)

    A polinom egy adott kitevőjű és együtthatójú tagját állítja be. Ha   volt   már   ilyen   tag,   akkor   felülírja,   ha   nem   akkor létrehozza.

    • public final void setVector(Vector v) 

    A polinomot reprezentáló vektor felülírása egy új vektorral.

    • public void subtract(Polynom q) 

    Két polinomot von ki egymásból. Az eredmény egy új polinomba kerül.

    • public String toString() 

    Ez a függvény String típusúvá konvertálja a polinomot.

    34

  • 4.14  Simpson

    Ez az osztály a kompozit Simpson módszert implementálja.• public Object doInBackground() 

    Ez a felüldefiniált függvény a Simpson formulát alkalmazza az osztópontok   közti   részekre,   majd   az   ezekből   keletkező részeredményeket összegzi.

    4.15  Trapezium

    Ez az osztály a kompozit trapéz módszert implementálja.• public Object doInBackground() 

    Ez a felüldefiniált függvény a trapéz formulát alkalmazza az osztópontok   közti   részekre,   majd   az   ezekből   keletkező részeredményeket összegzi.

    5  Tesztelési terv, tesztelés eredmények

    Alapvetően két részre lehet osztani a tesztelési tervet:

    • hibakezelés 

    • a helyes input adatok mellett a számításra igénybe vett idő, és számítás helyességének ellenőrzése

    5.1  Hibakezelés

    Itt elsősorban a hibásan megadott formulákkal teszteltem, az egészen egyszerű kifejezések   hibás   megadását,   mint   például   olyan   kifejezések   hogy  sin(0.0  , sin(3.0)^2,   illegális  karakterek,  mint  sin(@),  helytelen  zárójelezést  sin(cos(x) vagy  sin().   Az   integrálási   intervallum   is   ellenőrzött,   tehát   a   bal   végpont határozottan kisebb kell, hogy legyen, mint a jobb oldali végpont, valamint az osztópontok száma pozitív egész kell, hogy legyen.

    5.2  Helyes input melletti tesztek

    Minden inputot az összes lehetséges (négy) numerikus módszerre leteszteltem. Először   az   elemi   függvényekkel   ellenőriztem   1től   2ig;   10,   15,   20,   25,   30 osztóponttal,   majd   ezeket   egyre   bonyolultabb   függvényekké   komponáltam. Ezeket 0tól 5ig integráltam a Hermite és a NewtonCotesnál 30 a kompozit Simpson és kompozit trapéz módszernél 100 osztópontot választottam. Minden egyes futást követően a Mapple 9.0 verziójával ellenőriztem le az eredményt, melyek   kivétel   nélkül   kielégítőek   voltak.   Egyedül   a   Hermite   interpolációnál merült fel az a probléma, hogy „sok” (30) osztópontnál nagyon sokáig számol a program, és az eredmény sem kielégítő.

    35

  • 36

    Expression Method NoP Calculated by intg Calculated by Maple

    sin(x)

    Hermite

    10 0.956449142415277453466160295647569000720977783203125

    0,9564491424

    15 0.9564491424152814502690489462111145257949829101562520 0.95644914244619405607750195486005395650863647460937525 0.95626455683668609708547592163085937530 282.7628004550933837890625

    NewtonCotes

    10 0.9576433910217354572580461535835638642311096191406250015 0.9584877477435334025557267523254267871379852294921875020 0.9584440135007036287717596678703557699918746948242187525 0.9582686297766791483354609226807951927185058593750000030 0.95808957186556564789015055794152431190013885498046875

    Composite Simpson

    10 0.958442759127894755577514729338872712105512619018554687515 0.8991924932164594430616944009670987725257873535156250000020 0.9586437725645900326254533752035058569163084030151367187525 0.9223671069005297262766163157721166498959064483642578125030 0.958178300293691838362963864028643001802265644073486328125

    Composite Trapezium

    10 0.9576433910217353323579558832534530665725469589233398437515 0.95848774774353432542861597198680101428180932998657226562520 0.95844401350070336509379131939567741937935352325439453125025 0.95826862977667893322974990155671548563987016677856445312530 0.9580895718655628376381194755140313645824790000915527343750

    cos(x)

    Hermite

    10 0.067826442018052102156389082665555179119110107421875

    0,0678264402

    15 0.0678264420177864257865962827054318040609359741210937520 0.0678264420185122896000962100515607744455337524414062525 0.06780288809204648714512586593627929687530 13.91128051280975341796875

    NewtonCotes

    10 0.027974657861848939433002669829875230789184570312500015 0.003958251136739754372229072032496333122253417968750020 0.019934988878130610601147054694592952728271484375000025 0.029520487015231244853907810465898364782333374023437530 0.03590970440643082017828646712587215006351470947265625

    Composite Simpson

    10 0.02799800898553952716724113614077396050561219453811645507812515 0.03370221071607302967126917891960147244390100240707397460937520 0.019939143731895525839953320357267330109607428312301635742187525 0.04689320024939542055648217244723241492465604096651077270507812530 0.035913029994892830404351613537983212154358625411987304687500

    Composite Trapezium

    10 0.027974657861848654504671740639309973630588501691818237304687515 0.003958251136739811455473453394304783614643383771181106567382812520 0.019934988878131720986802005723959041461057495325803756713867187525 0.029520487015233043165841203547827831243921536952257156372070312530 0.035909704406429994992012988408447426991187967360019683837890625

  • 37

    Expression Method NoP Calculated by intg Calculated by Maple

    tg(x)

    Hermite

    10 528.191767215728759765625

    Float(undefined)

    15 10036.85937520 4616524825 61351691865292830 9,18E+020

    NewtonCotes

    10 2.512651963766201035355152271222323179244995117187515 0.6040407197232280367416024091653525829315185546875020 0.925942231362899548230416257865726947784423828125025 2.88432933240418876152943994384258985519409179687500030 7.797474532292730131644020730163902044296264648437500

    Composite Simpson

    10 3.83068790489995331105532727633544709533452987670898437515 0.59721790057073881330396147859573829919099807739257812520 0.159012397010570127875439538911450654268264770507812500025 4.363644650365849114725946833459602203220129013061523437530 5.03764997156968126479359426639348384924232959747314453125

    Composite Trapezium

    10 2.51265196376621613438828717335127294063568115234375000015 0.604040719723510949323852514680766034871339797973632812520 0.9259422313634234208423734457937825936824083328247070312525 2.8843293324040430863908213154900295194238424301147460937530 7.79747453229284179232472240528295515105128288269042968750

    ctg(x)

    Hermite

    10 0.07752058067892608761439987574703991413116455078125

    0,0775207102

    15 0.077520710142971793743527086917310953140258789062520 0.0775207101519939101308409590274095535278320312525 0.077509909954642353113740682601928710937530 19.70928227901458740234375

    NewtonCotes

    10 0.031988895181542575940625283692497760057449340820312515 0.004516456736253671166991807695012539625167846679687520 0.022738722046776738139328699617180973291397094726562525 0.033673708319740924821417138446122407913208007812500030 0.0409670044473853245392547250958159565925598144531250

    Composite Simpson

    10 0.03192038160197768759118730486079584807157516479492187500015 0.037768450470833405535620030946120095904916524887084960937520 0.022726448165645616369262560496622427308466285467147827148437525 0.052948162675172034171561241677750331291463226079940795898437530 0.04095714603856075879985410015393654248327948153018951416015625

    Composite Trapezium

    10 0.03198889518154256813436964179686583520378917455673217773437515 0.0045164567362526140698736343281893823586869984865188598632812520 0.0227387220467764547559858662184595345934212673455476760864257812525 0.0336737083197406301352666568860172446875367313623428344726562530 0.040967004447384674343211885538806882323115132749080657958984375

  • 38

    Expression Method NoP Calculated by intg Calculated by Maple

    e(x)

    Hermite

    10 4.6707742704728811844461233704350888729095458984375

    4.670774270

    15 4.67077427047146542804512137081474065780639648437520 4.670774270414574047549649549182504415512084960937525 4.669645836867857724428176879882812530 1379.15270519256591796875

    NewtonCotes

    10 5.166304841754078891469248446810524910688400268554687515 4.994622310149566146719735115766525268554687500000000020 4.911272914370003350725824020628351718187332153320312525 4.862040352867755599319821158132981508970260620117187530 4.8295378243126994011191754907486028969287872314453125

    Composite Simpson

    10 5.1620067529907156522739342108252458274364471435546875015 4.48337884379156226266616158682154491543769836425781250020 4.91025015868767295001973138823814224451780319213867187525 4.559839149417787756979336677432002034038305282592773437530 4.8290907276824853178176510937191778793931007385253906250

    Composite Trapezium

    10 5.16630484175407883595809721555269788950681686401367187515 4.994622310149570615367409232021600473672151565551757812520 4.911272914370000880479594229655049275606870651245117187525 4.8620403528677533788737719078199006617069244384765625000030 4.82953782431269025565701014102160115726292133331298828125

    ln(x)

    Hermite

    10 0.3862943711575272942582159885205328464508056640625

    0,3862943611

    15 0.38629436112498227728906385891605168581008911132812520 0.3862943610816396144969075976405292749404907226562525 0.38630035412984398135449737310409545898437530 3.9440991468727588653564453125

    NewtonCotes

    10 0.4528666540200046997100002954539377242326736450195312515 0.4312607459719197677827651205006986856460571289062500020 0.4202451298707269300436450976121705025434494018554687525 0.4135652261775570881496832953416742384433746337890625030 0.40908196516069728065900790170417167246341705322265625

    Composite Simpson

    10 0.4532265205548674374957940358399355318397283554077148437515 0.38411978611671666883342624032593448646366596221923828125020 0.420341851838401805302458669189036299940198659896850585937525 0.3855047977601885698245576250542399066034704446792602539062530 0.4091260200728225708555196860061187180690467357635498046875

    Composite Trapezium

    10 0.452866654020004259090237397344935743603855371475219726562515 0.4312607459719202031983575906792793830391019582748413085937520 0.420245129870726969508604176084531900414731353521347045898437525 0.413565226177556912508931352689955929236020892858505249023437530 0.4090819651606959332125479367192610880010761320590972900390625

  • 39

    Expression Method NoP Calculated by intg Calculated by Maple

    sh(x)

    Hermite

    10 2.219115056269055141768831163062714040279388427734375

    2,2191150560

    15 2.21911505626829663739840725611429661512374877929687520 2.219115056709886957264643569942563772201538085937525 2.21910160315746907144784927368164062530 962.2739009857177734375

    NewtonCotes

    10 2.477857434990038631994480056164320558309555053710937515 2.3884975295975062747899642090487759560346603393554687520 2.3450119934202775517917416436830535531044006347656250025 2.3192922962261474095768676306761335581541061401367187530 2.302298272551417446241117659155861474573612213134765625

    Composite Simpson

    10 2.4757959903938022705460753059014678001403808593750000015 2.137280158629635412603775534989836160093545913696289062520 2.344523652742976360663362811465049162507057189941406250025 2.1708598737970342257286304743502114433795213699340820312530 2.30208513625621395692899540108555811457335948944091796875

    Composite Trapezium

    10 2.477857434990039187105992368742590770125389099121093750015 2.3884975295975074266463522576486866455525159835815429687520 2.3450119934202742627560311916568025480955839157104492187525 2.31929229622614756223253351663515786640346050262451171875030 2.302298272551410195096988076102206832729279994964599609375

    ch(x)

    Hermite

    10 2.45165921420382471040966265718452632427215576171875

    2,4516592140

    15 2.45165921420313681622360491019207984209060668945312520 2.4516592147634881371232040692120790481567382812525 2.451680356391989334952086210250854492187530 1398.53944301605224609375

    NewtonCotes

    10 2.688447406764038039028719140333123505115509033203125015 2.606124780552061093175097994389943778514862060546875020 2.5662609209497307949376931901497300714254379272460937525 2.542748056641606302363811664690729230642318725585937530 2.52723955176128622923670263844542205333709716796875000

    Composite Simpson

    10 2.6862107625969134927501613674394320696592330932617187515 2.34609868516192660026220551117148716002702713012695312520 2.565726505944696589356368576773093082010746002197265625025 2.388979275620753406350615932751679793000221252441406250030 2.5270055914262715412998971942215575836598873138427734375

    Composite Trapezium

    10 2.688447406764039704363256078067934140563011169433593750015 2.6061247805520630360653910884138895198702812194824218750020 2.5662609209497267009902898848849872592836618423461914062525 2.5427480566416058305190261989991995505988597869873046875030 2.527239551761280102193385488362764590419828891754150390625

  • 40

    Expression Method NoP Calculated by intg Calculated by Maple

    sin(x)^2+cos(x)^2

    Hermite 30 4.99999999064949207649988238699734210968017578125

    5,0000000000NewtonCotes 30 5.0000000000000020816681711721685132943093776702880859375

    Composite Simpson 100 5.00000000000000020816681711721685132943093776702880859375Composite Trapezium 100 5.000000000000000242861286636752993217669427394866943359375

    exp(sin(x))^3+cos(x)

    Hermite 30 27.62704887747022297617149888537824153900146484375

    29,3583389900NewtonCotes 30 29.03835379031390229176423645185423083603382110595703125

    Composite Simpson 100 29.2726706851906625229779723706968752594548277556896209716796875Composite Trapezium 100 29.2726706851906625229779723706968752594548277556896209716796875

    ln(x+1)5*x+2*sin(exp(x))

    Hermite 30 663050222.4978923797607421875

    55,4901715900NewtonCotes 30 58.768341190410339158756158894902910105884075164794921875

    Composite Simpson 100 56.8456809847782322357712114779815237852744758129119873046875Composite Trapezium 100 56.63356838867567718295674417117169241464580409228801727294921875

    sin(sin(sin(sin(x))))

    Hermite 30 3.54140489911943490142220980487763881683349609375

    0,5733060489NewtonCotes 30 0.44795422918465900574691573865493410266935825347900390625

    Composite Simpson 100 0.538818177913745764533171023202839933219365775585174560546875

  • Irodalomjegyzék[1] Methods of Numerical Integration          Philip J. Davis, Philip Rabinowitz          2007 Dover Pubns ISBN 9780486453392

    [2] Computer Methods for Mathematical Computations           George E. Forsythe,  Michael A. Malcolm, Cleve B. Moler        1977 Englewood Cliffs, NJ: PrenticeHall ISBN 0131653326

    [3] Numerical Recipes in C         William H. Press, Brian P. Flannery         1988 Cambridge, UK: Cambridge University Press ISBN 9780521431088 [4] Introduction to Numerical Analysis         Josef Stoer, Roland Bulirsch         1980 New York: SpringerVerlag ISBN 9780387954523

    [5] Analízis 1           Leindler Schipp          Eötvös kiadó

    41

    TémabejelentőBevezetésFelhasználói dokumentáció 1 A megoldott probléma1.1. Működés1.2. Szükséges ismeretek

    2 Felhasznált módszerek2.1. A Hermite (Lagrange) interpolációs módszer2.2. A Newton-Cotes módszer2.3. A kompozit Simpson módszer 2.4. A kompozit trapéz módszer

    3 A program használata3.1. Telepítés3.2. Felhasználói felület (GUI)3.3. Megjegyzések, tanácsok a használathoz, hibajelzések

    Fejlesztői dokumentáció1 A probléma részletes specifikációja2 Felhasznált módszerek3 A program logikai szerkezete3.1 Asszociációs diagram (Association diagram)3.2 Osztálydiagram (class diagram)3.3 A Parser

    4 API dokumentáció4.1 ComponentController4.2 ContextFactory4.3 DrawArea4.4 Hermite4.5 IntegrationMethod4.6 Limit4.7 MainWindow4.8 MethodList4.9 MethodUser4.10 NewtonCotes4.11 ParserController4.12 Pmember4.13 Polynom4.14 Simpson4.15 Trapezium

    5 Tesztelési terv, tesztelés eredmények5.1 Hibakezelés5.2 Helyes input melletti tesztek