Numerikus analízis

Hiba, pontosság, stabilitás

A számítógépek a számokat véges pontossággal, általában lebegőpontos alakban tárolják. A véges pontosság azt jelenti, hogy az aritmetikai műveletek eredményeként kapott érték nem egyezik meg a művelet egzakt értelemben vett eredményével, hanem csak megközelíti azt. Ha egy számítógép a tízes számrendszert használja, és a számokat 8 tizedesjegy pontossággal tárolja, akkor az 1/3 művelet eredménye 0.33333333 lesz, ami több mint 3*10-9-nel tér el a valódi értéktől.

Mivel a számítógépek többnyire nem a tízes számrendszert használják, hanem a kettest, ezért nem a tárolt tizedes jegyek számát szokták az ábrázolás pontosságának jellemzésére használni. Általában az ábrázolás pontosságának szokták nevezni azt az e legkisebb abszolút értékű valós számot, amelynek ha a lebegőpontos alakját hozzáadjuk az 1.0 valós szám lebegőpontos alakjához, akkor az eredmény eltér 1.0-től. Ez a szám 32 bites mantissza esetén m=3*10-8 érték. Azt lehet mondani, hogy az m érték a számok lebegő pontos ábrázolás tört részének a pontossága. Ennek a pontosságnak, és az aritmetikai műveletek pontosságának elegendően jónak kell lennie ahhoz, hogy az eredményünk a számítás végén elfogadható legyen. Ez nem jelenti azt, hogy ha két tizedes jegy pontosságú eredményre van szükségünk, akkor m=10-2 megfelel. A számítás során fellép ugyanis egy ún. kerekítési hiba, amelynek az értéke legalább m, és amely a számítások során halmozódik.

Ha egy számításhoz N aritmetikai műveletre van szükségünk, akkor szerencsés esetben m ~ N1/2 nagyságú kerekítési hibára számíthatunk. Azonban gyakran előfordul, hogy a számítógép aritmetikai rutinjai mindíg egy irányba kerekítenek. Ekkor m ~ N nagyságú lesz. Ez ellen azonban nem tehetünk semmit, ha csak nem kívánjuk újra írni az operációs rendszer, vagy a fordítóprogram aritmetikai rutinjait. Egy másik hiba lehetőség, amelyet azonban elkerülhetünk, ha két egymáshoz közeli számot vonunk ki egymásból. Ilyen esetben az értékes bitek nagy része azonos, és csak néhány olyan bit lesz, amelyik valóban értékes eredményt ad. gy az eredményül kapott szám pontossága jóval alatta lesz a valódi számábrázolási pontosságnak. Azt hihetnénk, hogy ilyen kivonás csak nagyon ritkán fordul elő. Néhány képlet azonban magában hordozza az ilyen jellegű kivonásokat. Ilyen például a másodfokú egyenlet megoldó képlete.

Van egy másik hibafajta is, amelyet a program határoz meg. A legtöbb numerikus módszer diszkrét módon közelít valamilyen folytonos mennyiséget. Egy integrált például úgy számítunk ki numerikusan, hogy kiszámítjuk a függvény értékét véges sok pontban, de korántsem minden pontban. Egy másik példa, amikor egy függvény értékét számítjuk ki valamely a függvényt közelítő sor első néhány tagjának összegeként, de természetesen sohasem veszünk végtelen sok tagot. Ezekben az esetekben van egy paraméterünk, az első esetben a pontok száma, a másodikban a tagoké, amelyeket megfelelően nagyra választva, az eredmény megfelelő potossággal kapjuk meg. Ennek a paraméternek a megválasztása persze egy kompromisszum eredménye, mert igaz ugyan, hogy minnél nagyobb ez a paraméter, annál pontosabb az eredmény de annál tovább is fut a program. Azt a hibát, amely így adódik, csonkítási hibának hívják. Ez a csonkítási hiba még akkor is meglenne, ha a számítógépünk abszolút pontossággal tárolná a számokat, és végezné a műveleteket. Addíg, amíg a kerekítési hibával a programozó semmit sem tud kezdeni, a csonkítási hiba teljesen a hatalma alatt van. Egy kis túlzással azt állíthatjuk, hogy a numerikus analízis nem más, mint ennek a hibának a minimalizálása. A kerekítési és csonkítási hiba az esetek döntő többségéban független egymástól. Egy számítás hibája kezelhető úgy, mint a csonkítási hiba, amely egy végtelenül pontosan számoló számítógépen keletkezne, plusz a kerekítési hiba, amely a műveletek számától függ.

Ugyanakkor, néha mégi előfordul, hogy egy máskülönben vonzó eljárás nem stabilis. Ez azt jelenti, hogy a kerekítési hiba, amely a számítás egy korai stádiumában keletkezik, a számítás során megnő, és a számítás végére az eredményként kapott számokban dominássá válik. (Gyakran mondjuk, hogy a program házszámokat ad eredményül.) Egy ilyen nem stabilis eljárás nagyon jól használható lenne egy abszolút pontos számítógépen. Nézzünk meg egy egyszerű, bár kissé mesterkélt példát!

Tegyük fel, hogy ki szeretnénk számolni az aranymetszési arány egész hatványait. Ez az arány:

Egyszerűen belátható, hogy n+1=n-1-n. Ha tudjuk az első két értéket, 0=1.0 és 1 ~ 0.61803398, akkor könnyen, és gyorsan, csupán kivonásokat alkalmazva lassú szorzások helyett, egymás után kiszámíthatjuk egész hatványait. Sajnos ennek a rekurzív egyenletnek van egy másik megoldása is, Mivel az összefüggés lineáris, és mivel ennek a megoldásnak az abszolút értéke nagyobb mint 1, bármilyen kicsiny kerekítési hiba exponenciális gyorsasággal nő. Egy tipikus, 32 bites mantisszával rendelkező számábrázolásnál, n=16-nál már teljesen hibás eredményt ad. Az összefüggés nem stabilis, és ezért nem használható egész hatványainak kiszámításához.

[Következő fejezet.] [Tartalomjegyzék]