Ellen®rz® kérdések
2. Modellalkotás és hibaforrásai
2.5. Gépi számábrázolás és következményei
2.4.4. deníció.
A
κ(d) = lim
δd→0
kxd+δd−xdk/kxdk kδdk/kdk értéket a (2.4.1) feladat (relatív) kondíciószámának nevezzük.
A kondíciószám tehát szemléletesen azt méri, hogy pl. a bemen® adat 1%-os megváltozása hány százalékos változást eredményez a megoldásban. Ha a kondíciószám kicsi, akkor jól kondicionált feladatról, ha pedig nagy, akkor rosszul kondicionált feladatról beszélünk. Hogy mit értünk kicsin vagy nagyon, az mindig az aktuális feladattól elvárt viselkedés függvénye. A kondíciószám, ahogy jeleztük is, a dparaméter függvénye. Amennyiben xd vagyd nulla, a relatív kondíciószám nem értelmezhet®.
2.4.5. deníció.
A
κabs(d) = lim
δd→0
kxd+δd−xdk kδdk értéket a (2.4.1) feladat abszolút kondíciószámának nevezzük.
Korrekt kit¶zés¶ feladatok esetén degy környezetében az xd+δd (egyértelm¶) megoldás felír-hatóxd+δd=G(d+δd)alakban, ahol aGfüggvényt megoldófüggvénynek hívjuk. Amennyiben a Gfüggvény dierenciálhatód-ben, a relatív kondíciószámra a
κ(d) = kG0(d)k · kdk kG(d)k , míg az abszolút kondíciószámra a
κabs(d) =kG0(d)k formulát nyerjük.
2.4.6. példa. A2.4.3.példában szerepl® egyenletrendszer esetén a kondíciószámot 2-es nor-mában számolvaκ(5)≈1985adódik, ami azt jelenti, hogy adparaméter 2%-os változása a megoldásvektor 2-es normáját 3970%-kal is megváltoztathatja. Így érthet®, hogy a megoldás annyira nagyot változhatott.
Természetesen a modellalkotás során kerülni kell a rosszul kondicionált feladatokat, vagy leg-alábbis jó tudnunk egy feladatról, hogy annak megoldása rosszul kondicionált. Ennek jelent®sége onnét látszik, hogy egy rosszul kondicionált feladatban, ha a bemen® adatok mérési eredmények, akkor egy kis mérési pontatlanság is jelent®sen megváltoztathatja a feladat megoldását.
2.5. Gépi számábrázolás és következményei
Ahhoz, hogy megértsük, hogy a kerekítési és ábrázolási hibák honnét származnak, ismernünk kell, hogy a számítógépek hogyan kezelik a valós számokat. Természetesen számtalan kezelési mód létezik. Mi ezek közül a MATLAB által használt dupla pontosságú lebeg®pontos számokkal fogunk foglalkozni. A MATLAB lebeg®pontos számrendszere a kettes számrendszeren alapszik.
Ennek ellenére a konkrét számpéldákat tízes számrendszerben mutatjuk be, hiszen azok sokkal megszokottabbak, és a jelenségek hasonlóan érvényesek a kettes számrendszerben is.
2.5.1. példa. Felsorolunk néhány MATLAB által szolgáltatott eredményt.
• A MATLAB tg(π/2) értékére az1.6331e+ 016értéket adja, ami nyilvánvalóan hibás, hiszenπ/2-nél nincs is értelmezve a tangens függvény.
• 2−1074 = 4.94066e−324, de2−1074/2 = 0 és2−1074·1.2 = 4.94066e−324 = 2−1074, ami megintcsak hibás.
• 10310=Inf.
• Összetettebb példaként tekintsük az alábbi eljárástπ értékének meghatározására [15]:
Jelentseyk az egységkörbe írt szabályos2k-szög félkerületét. Ekkor nyilványk →π, ha k→ ∞. Továbbá érvényes az
yk+1= 2k+1 s
1 2
1−
q
1−(2−kyk)2
rekurzió, aholy1 = 2, y2= 2√
2, . . . . Az iterációt számítógépen végrehajtva az alábbi számokat kapjuk:y10= 3.14158627,y12= 3.14166137, . . . ,y19= 3.70727600, . . . . Azaz szemmel láthatóan a sorozat nem tartπ-hez. Ebben a feladatban a matematikai vagy numerikus modell a πértékét szolgáltatja, de a számítógépes modell már nem.
A számítógép két egysége játszik fontos szerepet a számítások elvégzésénél. Az egyik a pro-cesszor (CPU=central processing unit), a másik pedig a memória. A processzor végzi a m¶vele-teket, a memóriában pedig a m¶veletekhez szükséges adatokat tároljuk. Innét rögtön láthatjuk, hogy pl. irracionális számokat vagy végtelen szakaszos tizedes törteket nem tudunk számítógé-pen tárolni. A memória méretének korlátozottságából következik, hogy csak véges sok racionális számot tudunk a memóriában elhelyezni. Megjegyezzük, hogy mivel a számítógépek a kettes szám-rendszert használják általában a tároláshoz, ezért pl. az 1/10-et sem tudják pontosan eltárolni, hiszen az
1 10 = 1
24 + 1 25 + 1
28 + 1 29 + 1
212 + 1 213 +. . .
egyenl®ség miatt kettes számrendszerben az1/10végtelen szakaszos tizedes tört.
A valós számok ábrázolására a legelterjedtebb módszer az ún. lebeg®pontos számábrázolás.2 Ebben az esetben a valós számot a
±bka0
b0 +a1
b1 +a2
b2 +· · ·+ap−1 bp−1
≡a0.a1a2. . . ap−1×bk (2.5.1) alakban írjuk fel (ha lehet), aholb a számábrázolás alapja,pa szerepl® számjegyek (mantissza) száma, éska kitev® (karakterisztika). Azai(i= 0, . . . , p−1)számjegyekr®l feltesszük, hogy azok az alapnál kisebb nemnegatív egész számok. Ha a06= 0, akkor azt mondjuk, hogy a felírt szám normálalakban van. Ha normálalakban írjuk fel a számokat, akkor az ábrázolásuk egyértelm¶ lesz.
Természetesen, ha egy valós szám nem írható fel ilyen alakban, akkor a számot kerekítenünk kell.
Megmutatható, hogy a kerekítés szokásos szabálya miatt (nevezetesen, hogy az 5-ös számjegyet felfelé kerekítjük) a számítások értéke bizonyos esetekben felfelé tolódhat, így a számítógépek
2A lebeg®pontos számábrázolás bevezetése Konrad Zuse (1910-1995) német mérnök nevéhez köthet®, aki több számítógépet is épített az éppen a második világháborúra készül®d® Németországban. Eredményeire nem gyeltek akkoriban fel. Már 1941-ben létrehozott egy jelfogókkal m¶köd®, a lebeg®pontos kettes számrendszeren alapuló, teljesen programozható számítógépet [37].
2.5. Gépi számábrázolás és következményei 53
általában a párosra kerekítés (angolul: round to even) szabályát használják. Azaz pl. a 3.155-öt a szokásos módon 3.16-ra kerekítjük felfelé (a 6 páros), a 3.145-öt viszont 3.14-re lefelé kerekítjük (a 4 páros).
Könnyen látható, hogy a lebeg®pontosan ábrázolható számok rendelkeznek az alábbi tulaj-donságokkal:
• Csak véges sok racionális számot tudunk el®állítani.
• A lehetséges számok nem alkotnak testet. Pl. nem kommutatív vagy asszociatív az össze-adás). (pl.:123.4+0.04+0.03+0.02+0.01kétféle sorrendben összeadva más-más eredményt ad ap= 4, b= 10,k=−2, . . . ,2 lebeg®pontos számrendszerben (jelölése:F(4,−2,2)).
• Az el®állítható számok korlátos halmazt alkotnak. Pl.F(4,−2,2)-ben a legnagyobb el®állít-ható szám a 999.9, a legkisebb pedig -999.9. Ha ezeknél nagyobb abszolút érték¶ lesz egy számítás eredménye, akkor túlcsordulásról beszélünk.
• A nulla körül "relatívan nagy ¶r van". Pl. F(4,−2,2)-ben a legkisebb pozitív el®állítható szám normál alakban 0.01, nem normál alakban 0.00001. Ha ezeknél kisebb pozitív szám lesz a számítás eredménye, akkor azt már nullaként ábrázolja a számítógép (alulcsordulás).
• Az 1 utáni legkisebb el®állítható szám az ún. gépi epszilonnal (εg) nagyobb 1-nél. Az F(4,−2,2)rendszerben ez0.001.
A MATLAB dupla pontosságú lebeg®pontos számrendszere a következ® struktúrájú: A szá-mokat kettes számrendszerben (a (2.5.1) el®állításbanb= 2) állítja el® 64 bitnyi tárhelyet felhasz-nálva. Egy biten tároljuk az el®jelet (0 = +,1 =−). 52 biten a mantisszát tároljuk, pontosabban annak a tizedespont utáni részét, hiszen normálalak esetén a tizedesponttól balra mindenképpen 1-esnek kell szerepelnie. 11 biten a karakterisztika tárolódik úgy, hogy a kitev®höz hozzáadunk 1023-at, és az így nyert szám 2-es számrendszerbeli alakját tároljuk. Így a karakterisztika -1023-tól 1024-ig tárolható. A -1023-as karakterisztika a 0 (ha a mantissza is csupa nulla) ill. annak jelzé-sére szolgál, hogy az adott szám nincs normálalakban (ilyenkor az értéke±0.a1. . . a52×2−1022).
A csupa 1-essel kódolt 1024-es karakterisztika speciális célokra foglalt. Ha a mantissza nem nulla, az azt jelenti, hogy a számítás m¶velete nem szám (jelölésben NaN = not a number). Ilyen pl. a 0/0m¶velet eredménye. Ha a mantissza nulla, akkor az el®jelbit szerint vagy +∞-t, vagy−∞-t jelöl.
A legnagyobb ábrázolható pozitív szám az M = 1.111. . .111
| {z }
52db
×21023= 1.79769×10308 és a legkisebb ábrázolható pozitív szám
m= 0.000. . .000
| {z }
51db
1×2−1022= 4.94066×10−324.
Vegyük észre, hogy míg az els® szám normálalakban van, addig a második nem. A normálalakban ábrázolható legkisebb pozitív szám az
1.000. . .000
| {z }
52db
×2−1022= 2.22507×10−308. Az 1-et az
1≡1.000. . .000
| {z }
52db
×20
módon ábrázolhatjuk. Az 1-nél nagyobb legkisebb ábrázolható szám az 1.000. . .000
| {z }
51db
1×20,
amiεg= 2−52-nel nagyobb mint az 1.
Jelentse fl(x)egyx∈R,−M ≤x≤M valós szám lebeg®pontosan ábrázolt képét.
2.5.2. tétel.
Legyen−M ≤x≤M. Ekkor
|fl(x)−x| ≤
(ε0, ha|x|< ε0,
εg|x|
2 , haε0≤ |x| ≤M.
Bizonyítás. A tétel els® része triviális. Essen xaz xi < xj szomszédos lebeg®pontos számok közé. Legyenxi mantisszájapjegy¶, és karakterisztikájak. Ekkor
|fl(x)−x| ≤ xj−xi
2 = b−p+1bk
2 ≤εg|x|
2 .
Az εg gépi epszilon felét gépi pontosságnak nevezzük. Jelölése u. A gépi pontosság tehát a lebeg®pontosan ábrázolt számok relatív hibakorlátja. A fenti tétel közvetlen következménye, hogy egyM-nél nem nagyobb abszolút érték¶ valós szám lebeg®pontos képére igaz azfl(x) = (1 +δ)x egyenl®ség, ahol|δ| ≤u.
Egy számítógépes számítást leegyszer¶sítve úgy képzelhetjük el, hogy a processzor megkapja azt a két számot, amikkel m¶veleteket kell végeznie, lebeg®pontossá alakítja ®ket, ezekkel ponto-san elvégzi a m¶veletet, majd pedig kerekíti az eredményt úgy, hogy lebeg®pontoponto-san ábrázolható legyen. Legyen egy tetsz®leges m¶velet valós számok között. Ekkor azxésy valós számokkal számítógépen a következ® értéket kapjuk a m¶velet eredményére:
xy:=fl(fl(x)fl(y)).
Nézzünk meg két alapm¶veletet (a kivonást és az osztást), hogy hogy viselkedik lebeg®pontos számokkal végrehajtva! El®ször vizsgáljuk a kivonás relatív hibáját(x, y >0).
|x-y−(x−y)|
|x−y| =|(x(1 +δx)−y(1 +δy))(1 +δ−)−(x−y)|
|x−y|
≤|(xδx−yδy)(1 +δ−)|
|x−y| +|δ−| ≤u(1 +u) x+y
|x−y| +u, ahol|δx|,|δy|,|δ−| ≤u.
Ha x közel van y-hoz (azaz két egymáshoz közeli számot vonunk ki egymásból), akkor a különbség relatív hibája jóval nagyobb lehet, mint a gépi pontosság.
Két közeli szám kivonásánál abból is ered hiba, hogy a mantissza hossza véges. Ezt a jelenséget kiegyszer¶södésnek nevezzük. A jelenség szemléltetésére mutatunk be most két példát.
2.5. Gépi számábrázolás és következményei 55
2.5.3. példa. Tekintsük azF(10,−10,10)számrendszert. Ebben írjuk fel az alábbi gyököket:
√
9876 = 9.937806599×101, √
9875 = 9.937303457×101. Most vonjuk ki egymásból a két számot.
√
9876−√
9875 = 0.000503142×101= 5.03142 0000
| {z }
értelmetlen
×10−3.
A megjelen® 4 darab nullának a számításokhoz nincs semmi köze, abból erednek, hogy a számjegyeket balra toltuk a mantisszában a normálalak létrehozásához.
A kiegyszer¶södést kiküszöbölhetjük a nevezetes szorzat alkalmazásával:
√
Jól mutatja a két számolás közti különbséget, hogy az els® érték relatív hibája2.6×10−7, míg a másodiké1.6×10−10.
2.5.4. példa. A2.5.1.példában is a kiegyszer¶södés okozta a gondot. Haknövekszik, akkor 1−p
1−(2−kyk)2 második tagja egyre közelebb lesz 1-hez, így kiegyszer¶södés lép fel. A jelenség nyilván kiküszöbölhet® a képlet megfelel® átírásával, nevezetesen az
yk+1=yk
s 2
1 +p
1−(2−kyk)2 iterációban már nem lép fel kiegyszer¶södés.
Most vizsgáljuk az osztás hibáját! Legyenekxésy pozitív számok.
nevez®ben szerepl® szám jóval kisebb a számlálónál. Megjegyezzük, hogy a relatív hiba3u (azaz gépi pontosság) nagyságrend¶.
Azt, hogy a lebeg®pontos számokkal milyen módon kell számolni ill. hogy hogy kell kerekíteni
®ket, szabványok rögzítik. A legelterjedtebb ilyen szabvány az IEEE 745-ös (IEEE=Institute of Electrical and Electronics Engineers [16]). Az interneten több, a lebeg®pontos számokat szemlél-tet® alkalmazás érhet® el. Ezek közül ajánlunk kett®t a [17,38] honlapokon.
A számítógépen megírt programokat jól jellemzi az, hogy végrehajtásuk során hány lebeg®pon-tos m¶veletet (+,−,·, /) hajtunk végre. Ezek megszámolásával összehasonlíthatunk két eljárást futási sebesség szempontjából. A m¶veletigényt általábanf lop-ban szoktuk mérni (oating point operation).
2.6. A fejezettel kapcsolatos MATLAB parancsok
>> realmin % A legkisebb ábázolható pozitív szám.
ans =
2.225073858507201e-308
>> realmax % A legnagyobb ábázolható pozitív szám.
ans =
1.797693134862316e+308
>> eps % A gépi epsilon.
ans =
2.220446049250313e-016
Végezzünk el egy kísérletet arra vonatkozóan, hogy a számítógép mennyi id® alatt hajt végre108 lebeg®pontos m¶veletet. A futási id®t a tic (stopper indul) és toc (stopper megáll) parancsokkal mérhetjük. Vizsgáljuk az összeadást, a szorzást és az osztást.
>> x=sqrt(2); tic, for i=1:10^8 x=x+1; end, toc;
x=sqrt(2); tic, for i=1:10^8 x=x*1.00000001; end, toc;
x=sqrt(2); tic, for i=1:10^8 x=x/1.0000001; end, toc;
Elapsed time is 47.930000 seconds.
Elapsed time is 49.164000 seconds.
Elapsed time is 66.737000 seconds.
Látható tehát, hogy az összeadáshoz és a szorzáshoz szinte pontosan ugyanannyi id® kellett, míg az osztáshoz kb. 36%-kal több. Az adatok azt jelentik, hogy a használt számítógép kb.2×106 m¶veletet (speciálisan szorzást) képes 1 másodperc alatt elvégezni.
2.7. Feladatok
Lebeg®pontos számábrázolás
2.7.1. feladat. Vizsgáljuk meg, hogy korrekt kit¶zés¶-e azx+dy= 1, dx+y= 0 egyenletrend-szer advalós paraméter függvényében! Adjuk meg a kondíciószámot maximumnormában!
2.7.2. feladat. Vizsgáljuk meg az x= −d+√
d2−4 kifejezés kondicionáltságát a d változó függvényében! Milyendértékek esetén lesz korrekt kit¶zés¶ a feladat? Adjunk meg olyandértéket, melyre a (relatív) kondíciószám 100-nál nagyobb!
2.7. Feladatok 57
2.7.3. feladat. Aza= 0.001választás mellettA= 1−1/(1−2a)értéke−0.002004008016. Hatá-rozzuk meg mi isAértékét egy tízes számrendszer¶, hatjegy¶ mantisszás lebeg®pontos számokat használó számítógépen! Javasoljunk numerikus szempontból jobb számolástA-ra, és végezzük el úgy is a számolásokat!
2.7.4. feladat. Aza= 1000választás mellettA= 1/(√
a+ 1−√
a)értéke63.26136064087. Ha-tározzuk meg mi isAértékét egy tizes számrendszer¶, hatjegy¶ mantisszás lebeg®pontos számokat használó számítógépen! Javasoljunk numerikus szempontból jobb számolástA-ra, és végezzük el úgy is a számolásokat!
2.7.5. feladat. Egy 10-es számrendszeren alapuló számítógép a sinx, cosx, x2 függvények értékeit pontosan számolja, majd az eredmények ábrázolásánál hatjegy¶ mantisszára kerekít.
Határozzuk meg ezen a számítógépen azf(x) = cos2x−sin2xfüggvény értékét azx= 0.7854 helyen! Mekkora a számított eredmény relatív hibája? Indokoljuk az eredményt! Javasoljunk jobb képletet azf(x)érték kiszámítására!
2.7.6. feladat. Írjunk MATLAB programot az
yk+1= 2k+1 s
1 2
1−q
1−(2−kyk)2
iteráció vizsgálatára! Hasonlítsuk össze az eredményt az
yk+1=yk
s 2
1 +p
1−(2−kyk)2 iterációval! Magyarázzuk meg az eltérést!
2.7.7. feladat. Írjunk MATLAB programot az ex= lim
n→∞
n
X
i=0
xi i!
sor összegének kiszámítására. Futtassuk negatív értékek esetén (pl.x=−25)! Mit tapasztalunk?
Adjunk magyarázatot a jelenségre! Javasoljunk jobb módszerte−25 kiszámítására!
2.7.8. feladat. Legyen F(p, kmin, kmax)a tizes alapú lebeg®pontos számok halmaza (pa man-tissza hossza, kmin és kmax pedig a minimális és maximális karakterisztikát jelentik), ahol p a mantissza hossza, éskminéskmaxa karakterisztika legkisebb és legnagyobb értéke. Adjuk meg az F(1,−2,2) rendszerben megadható számokat!
2.7.9. feladat. Adjuk meg azF(1,−2,2)rendszerben az1/3,1/900,20·200,(((2 + 0.1) + 0.1) +
· · ·+ 0.1)(10 összeadás), (((0.1 + 0.1) + 0.1) +· · ·+ 0.1) + 2értékeket!
2.7.10. feladat. Adjunk meg olyan lebeg®pontos számrendszert (F(p, kmin, kmax)), melyben az alábbi számok ábrázolhatók!
a) 5,50,500,5000;
b) 5,5.5,5.55;
c) 5,0.5,0.05,0.005;
d) 5,55,555,5555.
2.7.11. feladat. Milyen lebeg®pontos számrendszerben számolható kerekítés nélkül 2.2·3.45,1/80, 2×102·7×102?
Ellen®rz® kérdések
1. Milyen tulajdonságai vannak egy korrekt kit¶zés¶ feladatnak?
2. Mikor mondjuk egy korrekt kit¶zés¶ feladatról, hogy rosszul kondicionált?
3. Hogy ábrázolja a MATLAB a valós számokat, és milyen következményei vannak ennek?
4. Soroljuk fel azokat a lebeg®pontos m¶veleteket, melyek nagy hibával rendelkezhetnek!
5. Mekkora a MATLAB gépi pontossága?