3. Monotoninės sekos

keisti

1. Monotoninių sekų apibrėžimas.

keisti
Apibrėžimas. Seka   vadinama nemažėjančia (nedidėjančia), jei kiekvienas tos sekos elementas ne mažesnis (ne didesnis) už pirmesnįjį elementą, t. y., jei su visais numeriais n teisinga nelygybė
  ( ).
Nemažėjančios ir nedidėjančios sekos vadinamos monotoninėmis sekomis. Jei monotoninės sekos   elementai su bet kuriuo numeriu n tenkina nelygybę   ( ), tai seka   vadinama didėjančia (mažėjančia). Didėjančios ir mažėjančios sekos dar vadinamos griežtai monotoninėmis sekomis.
Monotoninės sekos yra aprėžtos arba iš viršaus, arba iš apačios; būtent, nedidėjančios sekos aprėžtos iš viršaus, o nemažėjančios aprėžtos iš apačios pirmaisiais savo elementais. Todėl nedidėjanti seka yra aprėžta iš abiejų pusių, kai ji aprėžta iš apačios, o nemažėjanti seka yra aprėžta iš abiejų pusių, kai ji aprėžta iš viršaus.
Pateiksime tris monotoninių sekų pavyzdžius.
1. Seka   nedidėjanti. Ji aprėžta iš viršaus savo pirmuoju elementu, lygiu vienetui, o iš apačios - skaičiumi 0.
2. Seka   nemažėjanti. Ji aprėžta iš apačios savo pirmuoju elementu, o iš viršaus neaprėžta.
3. Seka   didėjanti. Ji aprėžta iš abiejų pusių: iš apačios pirmuoju elementu   iš viršaus, pavyzdžiui, skaičiumi 1.

2. Monotoninės sekos konvergavimo požymis.

keisti
Įrodysime pagrindinę teoremą.
3.15 teorema. Jei nemažėjanti (nedidėjanti) seka   aprėžta iš viršaus (iš apačios), tai ji konverguoja.
Pagal praeitą skirsnį seka   atitinkanti 3.15 teoremos sąlygas, yra aprėžta. Todėl 3.15 teoremą galima trumpai formuluoti taip: jei monotoninė seka   yra aprėžta iš abiejų pusių, tai ji konverguoja.
Įrodymas. Kadangi seka   yra aprėžta, tai jos elementų aibė turi tikslųjį viršutinį rėžį   ir tikslųjį apatinį rėžį   Įrodysime štai ką: jei   – nemažėjanti seka, tai jos riba yra minėtasis tikslusis viršutinis rėžis; jei   – nedidėjanti seka, tai jos riba yra minėtasis tikslusis apatinis rėžis   Išnagrinėsime tik nemažėjančią seką, nes samprotavimai apie nedidėjančią seką būtų analogiški.
Kadangi   yra sekos   elementų aibės tikslusis viršutinis rėžis, tai kiekvieną   atitinka toks elementas   kad   ir   (bet koks elementas   ne didesnis už tikslųjį viršutinį rėžį   t. y.  ). Iš šitų nelygybių gauname nelygybes   Kadangi   – nemažėjanti seka, tai nelygybės   yra teisingos, kai   Iš to išplaukia, kad   kai   Anksčiau pabrėžėme, kad   todėl, kai   teisingos nelygybės   iš kurių gauname nelygybę   Vadinasi, įsitikinome, kad   yra sekos   riba. Teorema įrodyta.
1 pastaba. Monotoninės sekos aprėžtumas yra būtinas ir pakankamas jos konvergavimo požymis.
Iš tikrųjų, jei monotoninė seka yra aprėžta, tai pagal 3.15 teoremą ji konverguoja; jei monotoninė seka konverguoja, tai, remiantis 3.8 teorema, ji yra aprėžta.
2 pastaba. Konverguojanti seka gali ir nebūti monotoninė. Pavyzdžiui, seka   apibrėžta formule   konverguoja, o jos riba yra skaičius 0. Tačiau ši seka nėra monotoninė, nes po teigiamo elemento eina neigiamas, o po neigiamo – teigiamas.
3 pastaba. Jei   yra nemažėjanti ir aprėžta seka, o   – tos sekos riba, tai visi jos elementai tenkina nelygybę   Nedidėjančios ir aprėžtos sekos   konverguojančios į   elementai tenkina nelygybę   Kad šie teiginiai teisingi, įsitikinome, įrodinėdami 3.15 teoremą.
3.15 teoremos išvada. Sakykime, duota begalinė segmentų sistema   Jei kiekvienas segmentas yra pirmesniajame*, o skirtumas   (jį vadinsime segmento   ilgiu) artėja prie nulio, kai   (segmentų sistemą, turinčią šią savybę, vadinsime susitraukiančia), tai egzistuoja vienintelis taškas c, priklausantis visiems tos sistemos segmentams.
Įrodymas. Pirmiausia pastebėsime, kad taškas c, priklausantis visiems segmentams, gali būti tik vienas. Iš tikrųjų, jei būtų dar vienas taškas d, priklausantis visiems segmentams, tai segmentas ** [c; d] priklausytų visiems segmentams   Bet tokiu atveju su bet kokiu numeriu n būtų teisingos nelygybės   tai neįmanoma, nes   kai   Dabar įsitikinsime, kad taškas c, priklausantis visiems segmentams   egzistuoja. Kadangi segmentų sistema yra susitraukianti, tai kairiųjų galų seka   yra nemažėjanti, o dešiniųjų galų seka   – nedidėjanti. Kadangi abi tos sekos yra aprėžtos (visi sekų   ir   elementai priklauso segmentui  ), tai pagal 3.15 teoremą jos konverguoja. Iš to, kad skirtumas   nyksta, išplaukia, jog minimosios sekos turi bendrą ribą. Tą ribą žymėkime raide c. Remiantis 3 pastaba, su bet kokiu numeriu n teisingos šios nelygybės:   t. y. taškas c priklauso visiems segmentams  

_______________

* Tai reiškia, kad  
** Siekdami konkretumo, tariame, kad d > c.

3. Keli konverguojančių monotoninių sekų pavyzdžiai.

keisti
Išnagrinėsime kelias sekas, kurių ribas apskaičiuosime, remdamiesi 3.15 teorema apie monotoninės sekos ribą. Be to, šiame skirsnyje susipažinsime su vienu bendru sekos ribos ieškojimo metodu, kai seka apibrėžiama rekurentine formule (Rekurentinė formulė (lot. recurrens – grįžtas) – formulė, pagal kurią  -ąjį sekos elementą galima išreikšti jos pirmųjų n elementų reikšmėmis.).
1 pavyzdys. Tirsime seką   kurios elementas   lygus
 
(n radikalų). Tą pačią seką galima, savaime aišku, nusakyti šitokia rekurentine formule:
 
Norėdami įsitikinti, kad sekos   riba egzistuoja, įrodysime, jog ta seka yra didėjanti ir aprėžta. Kad ta seka didėja, matyti tiesiog. Įsitikinsime, kad seka   aprėžta iš viršaus skaičiumi A, kai A – didedsnysis iš dviejų skaičių a ir 2. Jei   tai teiginys jau įrodytas. Jei   tai, dešinėje nelygybės   pusėje skaičių a pakeitę didesniu už jį skaičiumi   gauname   o iš čia   Taigi įrodėme, kad seka   aprėžta iš viršaus. Pagal 3.15 teoremą ta seka turi ribą. Pažymėkime tą ribą raide c. Savaime aišku,   Iš rekurentinės formulės turime lygybę
 
iš kurios matyti, kad sekos   ir   sutampa. Todėl jos turi bendrą ribą. Kadangi pirmosios sekos riba lygi   o antrosios   (kai n varo į begalybę skaičiams   ir   tai   praktiškai nesiskiria nuo   ir abu yra labai arti c reikšmės (abu labai panašūs į c)), tai   Iš čia, turėdami mintyje, kad   randame c:
 
 
 
kadangi   tai
 
2 pavyzdys. Tirsime seką   kuria dažniausiai naudojamasi, apskaičiuojant teigiamo skaičiaus a kvadratinę šankį elektronine skaičiavimo mašina. Šita seka apibrėžiama tokia rekurentine formule:
 
Pirmuoju elementu   čia galima laikyti bet kokį teigiamą skaičių.
Įrodysime, kad ta seka konverguoja, o jos riba yra skaičius   Pirmiausia įsitikinsime, kad seka   turi ribą. Tam užtenka įrodyti, kad seka   yra aprėžta iš apačios ir kad, pradedant antruoju elementu, ji nedidėja. Iš pradžių įsitikinsime, kad seka   aprėžta iš apačios. Sąlygoje pasakyta, jog   o iš rekurentinės formulės, kai   gauname   Taip samprotaudami toliau, įsitikiname, kad visi   yra teigiami.
Dabar įrodysime, kad visi   kai   tenkina nelygybę   Parašę rekurentinę formulę šitaip:   remsimės beveik savaime aiškia nelygybe  *, kuri teisinga, kai   (imame  ). Gausime
 
kai   t. y.   pradedant numeriu  
Pagaliau įsitikinsime, kad seka   kai   nedidėja. Iš rekurentinės formulės matome, kad   o iš čia, turėdami mintyje, kad   gauname   arba   (kai  ).
Kadangi seka   kai   nedidėja ir yra aprėžta iš apačios skaičiumi   (nes  ), tai ji turi ribą, ne mažesnę kaip   (žr. 3.15 ir 3.13 teoremą). Tą ribą pažymėkime raide c ir atsižvelgę į tai, kad   o   gauname lygybę
 **,
 
 
 
 
Vadinasi,  
1 pastaba. Spręsdami pateiktuosius pavyzdžius, naudojomės plačiai taikomu metodu sekos ribai skaičiuoti. Metodo esmė: iš pradžių įsitikinama, kad sekos riba egzistuoja, o paskui iš lygties, kuri gaunama iš rekurentinės formulės, vietoje   ir   įrašius ieškomąją sekos   ribos reikšmę c, apskaičiuojama tos ribos skaitinė reikšmė.
2 pastaba. Rekurentinės formulės dažnai naudojamos skaičiavimo matematikoje, nes jas taikant daug kartų, atliekamos to paties tipo skaičiavimo operacijos, o tai labai patogu skaičiuojant elektroninėmis skaičiavimo mašinomis.
Išnagrinėtoji rekurentinė formulė aprašo, kaip įsitikinome,   skaičiavimo algoritmą (įrodėme, kad  ).
Vėliau bus tiriamas sekos   konvergavimo į   greitis. Įrodoma, kad, tinkamai pasirinkus pirmąjį artinį   kai   jau ketvirtasis artinys   nuo skaičiaus   skiriasi mažiau kaip  
3 pavyzdys. Įsitikinsime, kad sekos   kai   o x – bet koks fiksuotas skaičius, riba lygi nuliui. Kai n – pakankamai didelis natūralusis skaičius,   Todėl, pradedant kuriuo nors numeriu N, turi būti   nes  
Vadinasi, pradedant numeriu N, seka   mažėja. Kadangi, be to, ji aprėžta iš apačios (pavyzdžiui nuliu), tai pagal 3.15 teoremą seka   konverguoja. Tarkime, kad c yra tos sekos riba. Iš lygybės   išplaukia, kad   nes sekos   riba lygi c, o sekos   – nuliui.

_____________________

* Tą nelygybę įrodinėjant, užtenka pastebėti, kad, kai   ji ekvivalenti nelygybei  
** Ta lygybė gaunama iš rekurentinės formulės  


Sekos, aproksimuojančios a šaknyje, konvergavimo greitis

keisti
Šio skyriaus 3 paragrafo 3 skirsnyje įrodėme, kad sekos   apibrėžiamos rekurentine formule
 
kai   o   – bet koks teigiamas skaičius, riba lygi   Skaičiaus   artiniu galima laikyti bet kurį tos sekos narį   Tokiu atveju, be abejo, reikia išsiaiškinti, koks turi būti įteracijų* skaičius n, kad   artinys būtų nurodyto tikslumo.

______________

* Iteracija (lot. iteratio – kartojimas) – kokios nors matematinės operacijos pakartojimas. Šiuo atveju viena iteracija yra   apskaičiavimas, kai žinomas   pagal rekurentinę (3.10) formulę.

______________

Nagrinėsime seką   apibrėžtą rekurentine (3.10) formule. Tos sekos elementą   vadinsime skaičiaus   n-uoju artiniu. Skaičių
 
vadinsime n-ojo artinio santykine paklaida.
Įrodysime teiginį apie santykinės paklaidos   įvertinimą, remiantis pirmojo artinio santykine paklaida  
Jei   taip parinktas, kad   tai su bet kokiu   teisinga šitokia nelygybė:
 
[   kai   gali būti lygus nuliui.]
Įrodymas. Iš (3.11) formulės
 
Remdamiesi (3.10) ir (3.13) formulėmis bei lygybe   gauname
 
 
Kadangi   tai savaime aišku, kad
 
 
Pagal sąlygą   Iš to išplaukia nelygybės   Bet tada iš (3.14) lygybės, kai   išplaukia nelygybė   Panašiai naudodamiesi (3.14) lygybe, kai   įsitikiname, kad visi   yra neneigiami ( ).
Iš (3.14) lygybės, nelygybių   ir iš to, kad visi   kai   yra neneigiami, išplaukia nelygybė   kai   Iš čia gauname dešiniąją (3.12) nelygybę. Teiginys įrodytas.
[        ir taip toliau.]
Iš (3.12) nelygybių matyti, kad   artinio po n iteracijų santykinė paklaida įvertinama, remiantis pirmojo artinio   santykine paklaida   ir iteracijų skaičiumi n. Vėliau įsitikinsime, jog tuo atveju, kai  *, pirmąjį artinį galima pasirinkti taip, kad santykinės paklaidos   modulis nebūtų didesnis už 0.05. Savaime aišku, taip pasirinkus   santykinė paklaida tenkins įrodytojo teiginio sąlygas. Tuomet bus aišku ir koks turi būti iteracijų skaičius n, kad   artinio santykinė paklaida nebūtų didesnė už duotąjį skaičių  : tą skaičių n galima rasti iš nelygybės* (ta nelygybė gaunama tiesiog iš (3.12) nelygybių)
 
Taigi tarkime, kad   Skaičių a išreikšime šitaip:
 
čia k – sveikasis neneigiamas skaičius, skaičius i lygus arba nuliui, arba vienetui, o skaičius M tenkina sąlygą
 
Pabrėšime, kad skaičius a išreiškiamas (3.16) pavidalu vieninteliu budu.
Pirmąjį artinį   pasirinkime šitaip:
 
Įsitikinsime, kad tuo atveju, kai Mbet koks skaičius, tenkinantis (3.17) sąlygas, pirmojo   artinio   rasto pagal (3.18) formulę, santikinės paklaidos   modulis ne didesnis kaip 0.05.
Įrodinėdami šį teiginį, remsimės tikslia santykinės paklaidos išraiška   Iš (3.16) lygybės gauname   todėl iš   išraiškos ir iš (3.18) formulės
 
 
3.4 pav.
 
Alternatyvus 3.4 pav. Oy ašimi grafikas ištemptas tik maždaug 2 kartus daugiau nei Ox ašimi.
Kadangi skaičius i lygus arba nuliui, arba vienetui, o   tai   Todėl iš (3.19) lygybės išplaukia nelygybė
 
Pažymėkime   raide X. Kadangi   o i lygus arba nuliui, arba vienetui, tai visos galimos X reikšmės priklauso intervalui [1; 2):
 
Naudodami naujai įvestą žymėjimą, (3.20) nelygybę perrašysime šitaip:
 
Pagal (3.22) nelygybę maksimalioji   reikšmė ne didesnė už maksimaliąją reiškinio   reikšmę, kai X tenkina (3.21) sąlygas. Kad būtų aiškiau, išnagrinėkime funkcijos   grafiką. Iš elementariosios matematikos kurso žinome, kad šios funkcijos grafikas yra parabolė (3.4 pav.)**, kurios viršūnė atitinka  
[  
  ]
Kadangi   o   tai X reikšmės, tenkinančios (3.21) sąlygas, atitinka   reikšmėms, esančioms tarp   ir   Kitaip sakant,
 
Iš paskutinės ir (3.22) nelygybių gauname reikiamą   įvertinimą:
 
Pastaba. Jei nurodyta, kad santykinė paklaida   lygi   tai, norint tokiu tikslumu apskaičiuoti bet kokio skaičiaus   kvadratinę šaknį, reikia, suradus   pagal (3.18) formulę, atlikti tik tris iteracijas ( ), nes
 
[   Pasirodo, santykinė paklaida   visada bus mažesnė už   po 3 iteracijų ( ). ]

_______________

* Jei   tai   ir   Tada  
** 3.4 paveiksle ašies Oy mastelis 20 kartų didesnis už ašies Ox mastelį.

Pavyzdžiai

keisti
  • Apskaičiuosime   Iš (3.16) formulės   Matome, kad   turi būti lygus 4, t. y.   Tada aišku, kad   Toliau randame M:
 
 
 
Toliau randame   pagal (3.18) formulę:
 
 
= 2.58(3).
Skaičių   randame pagal (3.10) rekurentinę formulę:
 
= 2.646505376344086021505376344086.
Toliau rasime  :
 
= 2.6457514184920023809913880196814.
[Atėmę tikslią   reikšmę iš   reikšmės gauname:
2.6457514184920023809913880196814 - 2.6457513110645905905016157536393 = 1.0742741179048977226604214545141e-7.]
Toliau rasime  :
 
 
= 120178103989057/45423053741472 = 2.6457513110645927714791488926518.
Atėmę tikslią   reikšmę iš gautos   reikšmės, gauname:
2.6457513110645927714791488926518 - 2.6457513110645905905016157536393 = 2.1809775331390125063383535564728e-15.
Tai yra gavome paklaidą  
Santykinė paklaida yra tokia:
 
(2.6457513110645927714791488926518 - 2.6457513110645905905016157536393)/2.6457513110645905905016157536393 =
= 8.2433202395785127055094193690687e-16.
Taigi  


  • Apskaičiuosime   Iš (3.16) formulės   Pagal (3.17)   Todėl   Tada   Iš čia gauname, kad  
Toliau randame M:
 
 
 
 
Toliau randame   pagal (3.18) formulę:
 
= 6.08(3).
[   6.2449979983983982058468931209398. ]
Skaičių   randame pagal (3.10) rekurentinę formulę:
 
= 0.5*(6.0833333333333333333333333333333 + 6.4109589041095890410958904109589) =
= 0.5 * 12.494292237442922374429223744292 = 6.2471461187214611872146118721461.
Toliau rasime  :
 
= 0.5*(6.2471461187214611872146118721461 + 39/6.2471461187214611872146118721461) =
= 6.2449983677207123204232036062421.
[Atėmę tikslią   reikšmę iš   reikšmės, gauname:
6.2449983677207123204232036062421 - 6.2449979983983982058468931209398 = 3.693223141145763104853022918526e-7.]
Toliau rasime  :
 
= 0.5*(6.2449983677207123204232036062421 + 39/6.2449983677207123204232036062421) =
= 6.2449979983984091265040071378015.
Atėmę tikslią   reikšmę iš   reikšmės, gauname:
6.2449979983984091265040071378015 - 6.2449979983983982058468931209398 = 1.0920657114016861678930991073622e-14.
Taigi, gavome paklaidą   O santykinė paklaida   lygi
 
= (6.2449979983984091265040071378015 - 6.2449979983983982058468931209398)/6.2449979983983982058468931209398 =
= 1.7487046620059110065547770263338e-15.
T. y.  


  • Apskaičiuosime   Iš (3.16) formulės   Pagal (3.17)   Todėl   Tada   Iš čia gauname, kad  
Kadangi   tai  
Toliau randame   pagal (3.18) formulę:
 
Skaičių   randame pagal (3.10) rekurentinę formulę:
 
= 0.5*(1.375 + 1.4545454545454545454545454545455) = 0.5 * 2.8295454545454545454545454545455 =
= 1.4147727272727272727272727272727.
Toliau rasime  :
 
= 0.5*(1.4147727272727272727272727272727 + 2/1.4147727272727272727272727272727) =
= 1.4142136728733114275282949981745.
[1.4142136728733114275282949981745 - 1.4142135623730950488016887242097 = 0.0000001105002163787266062739648  ]
Toliau rasime  :
 
= 0.5*(1.4142136728733114275282949981745 + 2/1.4142136728733114275282949981745) =
= 1.4142135623730993657935457387426.
Atėmę tikslią   reikšmę iš   reikšmės, gauname:
1.4142135623730993657935457387426 - 1.4142135623730950488016887242097 = 4.316991857014532913283559342618e-15.
Santykinė paklaida yra tokia:
 
=(1.4142135623730993657935457387426 - 1.4142135623730950488016887242097)/1.4142135623730950488016887242097 =
= 3.0525742164220827729222598916484e-15.
Gavome, kad  


Šiaip, skaičiuojant su kompiuteriu, santikinę paklaidą   (arba  ) reikia padauginti iš 10, nes procesoriaus x87 FPU be eksponentės dirba su skaičiais nuo 1.00000000000000001 iki 9.99999999999999999. Tada nebus prarastas tikslumas, jei įvertinsime, kad FPU paklaida yra  

Šaknies traukimas iš didelių skaičių

keisti
Bet kokį skaičių a ( ) galima užrašyti taip:
 
Čia   skaičius v gali būti nulis arba teigiamas lyginis skaičius (v gali būti 0, 2, 4, 6, 8, 10 ir t. t.); skaičius j lygus arba nuliui arba vienetui.
Jeigu ištrauksime kvadratinę šaknį iš a, tai gausime:
 
Jegiu v nelygus nuliui, tai   bus sveikasis skaičius su dvigubai mažiau nulių nei pas   Jeigu   tai tereikia apskaičiuoti   kurį bus galima visada taikyti (2) formulėje. Vadinasi, tereikia mokėti greitai ištraukti šaknį iš skaičiaus p.
1) Jeigu   tai pagal (3.16) formulę
 
iš čia  
Tada pagal (3.18) formulę randame  :
 
Ir toliau, darant iteracijas, apskaičiuojamas   pagal (3.10) formulę:
 
2) Jeigu   tai pagal (3.16) formulę
 
iš čia   Tada  
Pagal (3.18) formulę randame  :
 
Matome, kad šiuo atveju artinio   formulė tokia pati kaip ir 1) atveju.
Toliau skaičiuojama kaip ir pirmu atveju.
3) Jeigu   tai pagal (3.16) formulę
 
iš čia   Tada  
Pagal (3.18) formulę randame  :
 
Toliau skaičiuojama kaip ir pirmu atveju.
4) Jeigu   tai pagal (3.16) formulę
 
iš čia   Tada  
Pagal (3.18) formulę randame  :
 
Matome, kad šiuo atveju artinio   formulė tokia pati kaip ir 3) atveju.
Toliau skaičiuojama kaip ir pirmu atveju.
Apibendrinant, skaičiaus   ( ) apskaičiavimui, taikoma   reikšmė
 
kai  
ir taikoma   reikšmė
 
kai  


  • Apskaičiuosime   Čia   Tada pagal (1) formulę
 
Pagal (2) formulę
 
Toliau randame   skaičiui  :
 
= 1.2083333333333333333333333333333.
[   1.2247448713915890490986420373529. ]
[1.2247448713915890490986420373529 - 1.2083333333333333333333333333333 = 0.0164115380582557157653087040196; tai yra ne santykinė paklaida, o reali paklaida.]
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(1.2083333333333333333333333333333 + 1.5/1.2083333333333333333333333333333) = 1.2248563218390804597701149425287.
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(1.2248563218390804597701149425287 + 1.5/1.2248563218390804597701149425287) = 1.2247448764620622240199548319682.
[1.2247448764620622240199548319682 - 1.2247448713915890490986420373529 = 0.0000000050704731749213127946153 =  ]
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(1.2247448764620622240199548319682 + 1.5/1.2247448764620622240199548319682) = 1.2247448713915890595945823395751.
Iš ką tik gautos   reikšmės atėmę   reikšmę, gauname:
1.2247448713915890595945823395751 - 1.2247448713915890490986420373529 = 0.0000000000000000104959403022222 =  
Santykinė paklaida yra tokia:
 
(1.2247448713915890595945823395751 - 1.2247448713915890490986420373529)/1.2247448713915890490986420373529 =
= 8.5698993703859497564530032133562e-18.
Taigi  
Iš anksčiau apskaičiuoto
 
= 1.2247448713915890595945823395751 * 10000 = 12247.448713915890595945823395751.
Atėmę tikslią   iš 12247.448713915890595945823395751, gauname paklaidą:
12247.448713915890595945823395751 - 12247.448713915890490986420373529 = 1.0495940302222154304017026259951e-13.
O santykinė paklaida skaičiui   yra
(12247.448713915890595945823395751 - 12247.448713915890490986420373529)/12247.448713915890490986420373529 =
= 8.5698993703859497564530032133562e-18.
Tokia pati, kaip skaičiui  


  • Apskaičiuosime   Čia   Tada pagal (1) formulę
 
Pagal (2) formulę
 
Šaknį iš 10 lengva apskaičiuoti (nes (4) formulė tinka skaičiams  ).
  3.1622776601683793319988935444327.
Toliau randame   skaičiui   pagal (4) formulę:
 
= 0.16666666666666666666666666666667*9.6 + 1.4166666666666666666666666666667 = 3.0166666666666666666666666666667.
[   3.0983866769659335081434123198259. ]
[3.0983866769659335081434123198259 - 3.0166666666666666666666666666667 = 0.0817200102992668414767456531592; tai yra ne santykinė paklaida, o reali paklaida.]
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(3.0166666666666666666666666666667 + 9.6/3.0166666666666666666666666666667) = 3.0994935543278084714548802946593.
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(3.0994935543278084714548802946593 + 9.6/3.0994935543278084714548802946593) = 3.0983868746074953885623653564026.
[3.0983868746074953885623653564026 - 3.0983866769659335081434123198259 = 0.0000001976415618804189530365767 =
 ]
Toliau pagal (3.10) formulę apskaičiuojame  :
 
= 0.5*(3.0983868746074953885623653564026 + 9.6/3.0983868746074953885623653564026) = 3.0983866769659398117763289613096.
Iš ką tik gautos   reikšmės atėmę   reikšmę, gauname:
3.0983866769659398117763289613096 - 3.0983866769659335081434123198259 = 0.0000000000000063036329166414837 =
 
Santykinė paklaida yra tokia:
 
(3.0983866769659398117763289613096 - 3.0983866769659335081434123198259)/3.0983866769659335081434123198259 =
= 2.0344887755631127106428103904763e-15.
Taigi  
Iš ankstesnių skaičiavimų
 
= 3.0983866769659398117763289613096 * 3.1622776601683793319988935444327 * 100000 = 979795.89711327323266266864962311.
Tiksli   reikšmė yra tokia:
  979795.89711327123927891362988236.
Atėmę tikslią   reikšmę iš 979795.89711327323266266864962311, gauname paklaidą:
979795.89711327323266266864962311 - 979795.89711327123927891362988236 = 0.00000000199338375501974075 =
 
Santykinė paklaida skaičiui   yra
(979795.89711327323266266864962311 - 979795.89711327123927891362988236)/979795.89711327123927891362988236 =
= 2.0344887755631126970242116177837e-15,
t. y. tokia pati (su 16 pirmų tokių pačių skaitmenų) kaip skaičiui  
[Čia kažkas negerai su tais 16 skaitmenų, nes iš viso ciferblate yra 32 skaitmenys... Jeigu įdėti (padaryti copy-paste) į kalkuliatorių tokį reiškinį:
(3.0983866769659398117763289613096 - 3.0983866769659335081434123198259)/3.0983866769659335081434123198259 -(979795.89711327323266266864962311 - 979795.89711327123927891362988236)/979795.89711327123927891362988236 =
tai gaunamas toks rezultatas:
= 1.3618598772692596082816173047622e-32.
Kažkokie dvigubi skaičiavimo standartai su "Windows 10" kaluliatorium... Gal po kokių nors dalybos iteracijų labai prasiranda tikslumas, nes ne visi skaitmenys Winows 10 kalkuliatoriuje rodomi (jų yra virš 40, gal apie 47 skaitmenys iš viso, iš kurių rodomi tik 32 skaitmenys). Nors gal ir ne tai, nes ten tik atimtis atliekama... Gal koks bug'as?
Bendrai, viskas teisingai, nes
2.0344887755631127106428103904763e-15 - 2.0344887755631126970242116177837e-15 = 1.36185987726926e-32.
Tai rodo, kad skaičiavimo tikslumas yra 32 skaitmenys, nes jų šituose skaičiavimuose tiek ir yra.]


Jeigu   tai pažymėję   galime, jei b didelis skaičius, apskaičiuoti   pagal pateiktą aukščiau būdą. Apskaičiavę   galime rasti   taip:
 
Tačiau toks   ( ) skaičiavimo būdas nėra ekonomiškas, nes reikia atlikti dvi [papildomas] dalybos operacijas.
Pateiksime ekonomiškesnį, greitesnį   skaičiavimo būdą. Jei   tai a galima užrašyti taip:
 
Čia   skaičius v gali būti nulis arba neigiamas lyginis skaičius (v gali būti 0, -2, -4, -6, ...); skaičius j lygus arba nuliui arba  
Jeigu ištrauksime kvadratinę šaknį iš a, tai gausime:
 
Jeigu   tai tereikia apskaičiuoti   kurį bus galima visada taikyti (6) formulėje. Vadinasi, tereikia mokėti greitai ištraukti šaknį iš skaičiaus p. O toliau jau lengva pagal (6) formulę surasti kam lygus   Kaip rasti   pateikta aukščiau.
Kiek pamenu, skaičiau, kad jeigu norima padauginti skaičių dvejetainėje sistemoje iš 2, tai reikia visus bitus pastumti per vieną bito poziciją į kairę. O jeigu norima skaičių dvejetainėje sistemoje padalinti iš 2, tai reikia visus bitus pastumti viena bito pozicija į dešinę. Tokiu budu, jeigu skaičius j nelygus nuliui, tai reikia skaičių a padauginti iš 10, jei 0<a<1 (arba padauginti iš 0.1, jei a>1). Tada skaičius v bus lyginis skaičius. Toliau norint padalinti v iš 2, tereikia rodiklio v visus bitus pastumti per vieną bitą į dešinę. Taip mes gausime v/2. Ir nereikia procesoriaus FPU daryti sudetingų eksponentės dalybos operacijų (skaičiuojant šaknį iš kokio nors skaičiaus).
Lieka tik paslaptis kodėl procesorių FPU šaknies traukimo operacijai sunaudoja tiek pat arba tik apie 1.5 karto (priklausomai nuo procesoriaus) daugiau ciklų negu dalybos operacijai. Net jeigu artinį   kažkokiu budu galima gauti su santykine paklaida apie   tai vis tiek reikės dviejų iteracijų ir to pasekoje reikės dviejų dalybos operacijų (kiekvienoje iteracijoje yra viena dalybos operacija). Kad užtektų apskaičiuoti   iš vienos iteracijos, artinio   santykinė paklaida   turi būti apie   (kad gauti   su santykine paklaida apie  ). Jeigu kažkokiu budu galima pagal skaičių p pažiūrėt į kažkokią artinių   lentelę, tai ta lentelė turės apie milijardą artinių ir užims apie   10 GB, t. y. apie 10 gigabaitų. Į procesorių akivaizdu to neįstatysi, tuo labiau, kad, pavyzdžiui, Pentium II/III naudojo 17...38 ciklus dalybos operacijai ir 27...50 ciklų šaknies traukimo operacijai (tik apie 1.5 karto daugiau ciklų šakniai nei dalybai). Tais laikais ir 1 MB (megabaito) kokios nors atminties (pvz., cache atminties) įdėjimas į procesorių buvo techniškai neįmanomas ar sunkiai pasiekiamas dalykas.
Kadangi artinio   skaičiavimui [pateiktam aukščiau] nereikia daryti dalybos operacijos, tai galbūt yra, tarkim, apie 100 ar 1000 artinio   skaičiavimo grupių skaičiui   Kaip matėme, tik dviejų grupių (1<p<4 ir  ) užtenka   skaičiavimui, kad gauti pirmo artinio   santykinę paklaidą   Jeigu sukurti apie 10 tokių artinio   grupių (1<p<2, 2<p<3, 3<p<4, ..., 9<p<10) arba apie 100 tokių artinio   grupių (1<p<1.1, 1.1<p<1.2, 1.2<p<1.3, ..., 9.9<p<10), tai peršasi mintis, kad 10-iai grupių tikslumas gali būti apie   o šimtui tokių grupių santykinės paklaidos   tikslumas gali būti apie   Tik tai gali užimti darbo suradimui artinio   formulės kiekvienai grupei (tokia formulė padidinanti tikslumą siauro/trumpo intervalo grupei turėtų egzistuot matematiškai mąstant ir lažinantis...). Tik gal tikslumo padidėjimas gali būti ne toks žymus, kai grupių padaugėja apie 10 kartų (arba 100 kartų), nežinau...
Kitas klausimas yra, kaip kiekvieną skaičių p nusiusti į jį atitinkančią vieną iš 10 (ar vieną iš 100) grupę (kad paskui gauti artinį  ). Programuotojas sakytų, kad reikia vidutiniškai praifint 5 kartus, jei yra 10 grupių (arba ~50 kartų, jei yra 100 grupių). Pavyzdžiui, jei yra skaičius 3.5346, tai pirmą kartą paklaust ar skaičius p [jei yra 10 grupių] yra mažiau už 2, antrą kartą paklaust ar skaičius p yra mažiau už 3 ir trečią kartą palyginus 3.5346 su 4 nustatoma, kad skaičius p patenka į trečią grupę, nes yra mažiau už 4. Bet su ifinimais šaknies skaičiavimai bus dar ilgesni. Todėl su tranzistoriais galima sukurt painią schemą, kuri, jeigu skaičiaus p pirmas skaitmuo yra 3, siunčia skaičių p į trečią grupę, kurioje skaičiuoja artinį   skaičiams nuo 3 iki 4 ir gauna numanomai minėtą tikslumą   O jeigu skaičiaus p pirmas skaitmuo yra 4, tai siunčiasi per tą loginę schemą toks skaičius į ketvirtą grupę (į kurią įeina skaičiai nuo 4 iki 5) ir t. t. Kas ten žino, gal taip ir randamas [skaičiaus p]   artinys (apie   tikslumu) naudojant apie 100 tokių grupių. Ir tada užtenka tik vienos iteracijos (t. y. užtenka vienos dalybos operacijos [kuri yra iteracijoje]), kad gauti apie   tikslumą.
Pastebėsime, kad jeigu artinys   tai pagal (3.10) formulę
 
Čia aiškinama kaip dalybos operacija vyksta procesoriuje:
https://www.quora.com/How-is-integer-division-implemented-in-Computer-Hardware
https://en.wikipedia.org/wiki/Division_algorithm#SRT_division
Pavyzdžiui čia:
https://electronics.stackexchange.com/questions/22410/how-does-division-occur-in-our-computers
skaitant, gali būti neaišku kas yra "reciprocal", "denominator", "numerator". Jie yra atitinkamai 1/x, vardiklis, skaitiklis.
Šis tekstas:
"For floating point numbers, however, it may be quicker to first compute the reciprocal of the denominator and then multiply that times your numerator."
verčiamas per Google translate taip:
"Tačiau slankiojo kablelio skaičiams gali būti greičiau pirmiausia apskaičiuoti vardiklio atvirkštinį skaičių ir tada padauginti jį iš skaitiklio."
Ten pat duotas pavyzdys, jeigu norima apskaičiuoti 1/3.5. Iš pradžių spėjama, koks turi būti g, kad g*3.5 būtų lygus 1. Spėjimas, kad g=0.3. Tada g*3.5=0.3*3.5=1.05. Tada toliau naudojama pagerinta formulė g'=g(2-gd). Gauname 0.3*(2-1.05)=0.285. Jau gana arti 1/3.5=0.28571428571428571428571428571429. Toliau kartojamas procesas: 0.285*(2-0.285*3.5)=0.2857125. Dar toliau: 0.2857125*(2-0.2857125*3.5)=0.285714285703125. Paklaida yra:
0.28571428571428571428571428571429 - 0.285714285703125 = 0.00000000001116071428571428571429  
Čia
https://www.reddit.com/r/explainlikeimfive/comments/yc5qkp/eli5_how_does_a_computer_do_division_efficiently/
dar papildomai rašo apie šitą būdą, kuris ką tik buvo pateiktas skaičiuot 1/D, o suradus kam tai lygu, galima paskui sužinot kam lygu N/D, padauginus N iš apskaičiuoto 1/D (kai D=p, t. y. kai 1<D<10, o jei D>10, tai skaičiaus D eksponentės rodiklis atimamas iš skaičiaus N eksponentės rodiklio...).
Šito metodo išvedimas aprašytas angliškoje Vikipedijoje: https://en.wikipedia.org/wiki/Division_algorithm#Newton–Raphson_division
Jame naudojamas Niutono metodas (liesinių metodas), kuris taikomas polinomo realiųjų šaknų apytikslėms reikšmėms rasti.

Greitas šaknies iš skaičiaus a traukimo būdas

keisti
Parodysime praktiškai greičiausią kvadratinės šaknies traukimo būdą. Šitas būdas paremtas Niutono metodu (liestinių metodu). Todėl pirma trumpai apžvelgsime Niutono metodą.
Niutono metodas. Naudojant Niutono metodą galima rasti polinomo (arba kokios nors funkcjos) f(x) šaknį (sprendinį) bet kokiu norimu tikslumu. Nagrinėkime atkarpą [a; b], kurioje yra viena šaknis c (taške c funkcija f(x) kerta ašį Ox). Toliau, priklausomai nuo to ar funkcija f(x) atkarpoje [a; b] įgaubta ar išgaubta bei priklausomai nuo to ar funkcija f(x) didėja ar mažėja atkarpoje [a; b], pasirenkamas tinkamas atkarpos vienas iš galų (a arba b). Pažymėkime tą galą   (  arba  ). Toliau taške   surandame funkcijos f(x) liestinės lygtį, kuri atrodo taip:
 
Arba taip:
 
Toliau randamas liestinės y(x) susikirtimo taškas su Ox ašimi. Tą tašką pažymėkime (x; y)=(d; f(d))=(d; 0). Įstatę šio taško koordinates į (1) lygtį gausime:
 
 
 
Dabar turime siauresnį intervalą, kuriame ant Ox ašies yra šaknis c (per kurią pereina funkcjos f(x) grafikas). Ir dabar reikšmė   yra arčiau šaknies c. Pakartoję šį procesą rasime tašką   esantį dar arčiau prie c taško (ant Ox ašies):
 
Taip kartodami (2) formulę galime labai tiksliai rasti funkcijos f(x) susikirtimo su Ox ašimi tašką c. Šios formulės paklaida mažėja kvadratu po kiekvienos iteracijos, kai   konverguoja į tašką c (po kiekvienos iteracijos, tikslumas didėja daug greičiau, nei jeigu spėliotume šaknį c, dalindami intervalą [a; b] kaskart per pusę ir tikrindami ar skirtinguose intervalų pusėse funkcija f(x) turi priešingus ženklus). Išsamiai apie Niutono metodą galima paskaityti aukštosios algebros arba matematinės analizės vadovėliuose.


Čia pasakojama apie   skaičiavimo metodus: https://www.quora.com/How-do-computers-calculate-square-roots
O čia
https://en.wikipedia.org/wiki/Fast_inverse_square_root#Newton's_method
aprašoma, kaip apskaičiuoti   Kai apytiksliai apskaičiuojama   reikia gautą rezultatą padauginti iš a. Tada ir gausime   Be to   rezultatas yra net naudingesnis, nes nereikia dalinti   iš a, kad gauti  
Pereikime prie   skaičiavimo algoritmo, kuris vadinasi Niutono metodu [šaknies skaičiavimui]. Pažymėkime   o skaičių a pažymėkime per x. Tada
 
Jeigu   yra apytikslė skaičiaus y reikšmė, tai   yra dar tikslesnė skaičiaus y reikšmė (pagal liestinių metodą):
 
Surandame f(y) išvestinę:
 
 
Toliau įstatome   ir   į (3) formulę:
 
 
 
Gavome rekurentinę formulę   reikšmei skaičiuoti:
 

Pavyzdžiai

keisti
  • Apskaičiuosime   ir rasime kam lygus  
Pirmiausia turime žinoti   apytikslią reikšmę. Tą reikšmę procesoriaus FPU gali gauti iš tam tikros lentelės, kuri galbūt yra procesoriaus L1 Data cache'e arba L2 cache. Tiksli   reikšmė yra tokia:
  1.5165750888103101108513650872564.
O   0.65938047339578700471798482054627.
Mes paimsime, kad   Tada pagal formulę
 
rasime
 
Toliau pagal (4) formulę rasime  :
 
[0.65938047339578700471798482054627 - 0.6592433044896 = 0.00013716890618700471798482054627  ]
Toliau pagal (4) formulę rasime  :
 
= 0.6592433044896*(3 - 2.3*0.6592433044896^2)/2 = 0.65938043059651203399501910136126.
[0.65938047339578700471798482054627 - 0.65938043059651203399501910136126 =
= 0.00000004279927497072296571918501  ]
Toliau pagal (4) formulę rasime  :
 
= 0.65938043059651203399501910136126*(3 - 2.3*0.65938043059651203399501910136126^2)/2 = 0.65938047339578283767489142997287.
Taigi,   paklaida yra tokia:
0.65938047339578700471798482054627 - 0.65938047339578283767489142997287 =
= 0.0000000000000041670430933905734  
Po 4 iteracijų gavome paklaidą mažesne nei  
Dabar galime rasti a šaknyje:
  2.3*0.65938047339578283767489142997287 = 1.5165750888103005266522502889376.
[1.5165750888103101108513650872564 - 1.5165750888103005266522502889376 = 0.0000000000000095841991147983188 =
 ]
Pažiūrėkime kaip konverguoja   į   iš dešinės pusės, kai   parenkamas taip, kad  
Taigi parinkime   Tada
 
[0.65938047339578700471798482054627 - 0.6593796 = 0.00000087339578700471798482054627  ]
Toliau pagal (4) formulę rasime  :
 
  1.3187609467881033886272/2 = 0.6593804733940516943136.
[0.65938047339578700471798482054627 - 0.6593804733940516943136 = 0.00000000000173531040438482054627  ]
Toliau pagal (4) formulę rasime  :
 
0.6593804733940516943136*(3 - 2.3*0.6593804733940516943136^2)/2 = 0.65938047339578700471797797024742.
Paklaida lygi
0.65938047339578700471798482054627 - 0.65938047339578700471797797024742 =
= 0.00000000000000000000000685029885  
Po 3 iteracijų gavome paklaidą mažesne nei  
Šį kartą, parenkant   iš dešinės,   reikšmė buvo daug tikslesnė negu anksčiau. Bet teoriškai Niutono metodas (liestinių metodas) bent jau polinomams gali greitai konverguoti tik iš vienos šaknies y pusės. Čia gi greitas konvergavimas į   vyksta tiek iš kairės pusės, tiek iš dešinės pusės, kas atrodo kaip prieštaravimas liestinių metodo teorijai. Gal greito konvergavimo tik iš vienos pusės taisyklė taikoma tik polinomams ir kai kurioms funkcjoms, o ši funkcija   yra išimtis.
Dabar galime rasti a šaknyje:
  2.3*0.65938047339578700471797797024742 = 1.5165750888103101108513493315691.
[1.5165750888103101108513650872564 - 1.5165750888103101108513493315691 = 0.0000000000000000000000157556873 =
 ]


  • Apskaičiuosime   ir rasime kam lygus  
Tiksli   reikšmė yra tokia:
  2.4083189157584590960256482060757.
O   0.41522739926869984414235313897857.
Mes paimsime, kad   Tada pagal (4) formulę
 
[0.41522739926869984414235313897857 - 0.4144 = 0.00082739926869984414235313897857  ]
Toliau pagal (4) formulę rasime  :
 
= 0.4144*(3 - 5.8*0.4144^2)/2 = 0.4152249278464.
[0.41522739926869984414235313897857 - 0.4152249278464 = 0.00000247142229984414235313897857  ]
Toliau pagal (4) formulę rasime  :
 
= 0.4152249278464*(3 - 5.8*0.4152249278464^2)/2 = 0.41522739924663512944560082817282.
[0.41522739926869984414235313897857 - 0.41522739924663512944560082817282 = 0.00000000002206471469675231080575 =
 ]
Toliau pagal (4) formulę rasime  :
 
= 0.41522739924663512944560082817282*(3 - 5.8*0.41522739924663512944560082817282^2)/2 = 0.41522739926869984414059439797726.
[0.41522739926869984414235313897857 - 0.41522739926869984414059439797726 = 0.00000000000000000000175874100131 =
 ]
Tada   5.8*0.41522739926869984414059439797726 = 2.4083189157584590960154475082681.
[2.4083189157584590960256482060757 - 2.4083189157584590960154475082681 = 0.0000000000000000000102006978076 =
 ]
Po 4 iteracijų gavome paklaidą mažesne nei   (beveik  ).
Dabar pažūrėsime kaip konverguos   į   iš dešinės pusės (kai  ). Parenkame   Tada pagal (4) formulę
 
[0.41522739926869984414235313897857 - 0.4151448 = 0.00008259926869984414235313897857  ]
Toliau pagal (4) formulę rasime  :
 
= 0.4151448*(3 - 5.8*0.4151448^2)/2 = 0.4152273746236976005632.
[0.41522739926869984414235313897857 - 0.4152273746236976005632 = 0.00000002464500224357915313897857  ]
Toliau pagal (4) formulę rasime  :
 
= 0.4152273746236976005632*(3 - 5.8*0.4152273746236976005632^2)/2 = 0.41522739926869765000924208032344.
[0.41522739926869984414235313897857 - 0.41522739926869765000924208032344 = 0.00000000000000219413311105865513 =
 ]
Toliau pagal (4) formulę rasime  :
 
= 0.41522739926869765000924208032344*(3 - 5.8*0.41522739926869765000924208032344^2)/2 = 0.41522739926869984414235313896118.
[0.41522739926869984414235313897857 - 0.41522739926869984414235313896118 = 0.00000000000000000000000000001739 =
 ]
Tada   5.8*0.41522739926869984414235313896118 = 2.4083189157584590960256482059748.
[2.4083189157584590960256482060757 - 2.4083189157584590960256482059748 = 0.0000000000000000000000000001009 =
 ]
Po 4 iteracijų gavome   paklaidą mažesne nei   (beveik  ).
[2.4083189157584590960256482059748^2 = 5.7999999999999999999999999995139.]


Pastebėsime, kad abiejuose pavyzdžiuose (skaičiuojant   ir  ) skaičiuojant   iš dešinės (kai   arba  ), jau po pirmos iteracijos   (t. y. jau   arba  ). Vadinasi atlikus pirmą iteraciją   skaičiavimai toliau vyksta iš kairės (pagal Niutono metodą).

Štolco teorema

keisti

Trisdešimt antro laipsnio šaknies traukimas taikant Niutono metodą

keisti
Skaičiuojant ln(z), kai 0.7<z<1.4, reikalingas greitas šešiolikto ar trisdešimt antro laipsnio šaknies traukimo algoritmas (apie tokius natūrinio logaritmo skaičiavimus parašyta čia https://lt.wikibooks.org/wiki/Matematika/Teiloro_eilutė#Natūrinio_logaritmo_liekamojo_nario_įvertinimas ).
Parodysime kaip apskaičiuoti   taikant Niutono metodą. Pažymėkime   Tada turime funkciją
 
Pagal liestinių metodą
 
Surandame f(y) išvestinę:
 
 
Toliau įstatome   ir   į (3) formulę:
 
 
 
Gavome rekurentinę formulę   reikšmei skaičiuoti:
 

Pavyzdžiai

keisti
  • Apskaičiuosime   ir rasime kam lygus   Prieš tai dar pastebėsime, kad norint apskaičiuoti   reikia 5 kartus ištraukti kvadratinę šaknį iš z. Tiksli   reikšmė yra tokia:
  1.0082325861537202021533989768813.
O   0.99183463590963025992221676151568.
Mes paimsime, kad   Tada pagal (5) formulę
 
= 0.99*(33 - 1.3*0.72498033595785364231768779197961)/32 = 0.99177969711319507382303549411632.
[0.99183463590963025992221676151568 - 0.99177969711319507382303549411632 = 0.00005493879643518609918126739936  ]
Toliau pagal (5) formulę rasime  :
 
= 0.99177969711319507382303549411632*(33 - 1.3*0.99177969711319507382303549411632^32)/32 = 0.99183458572688580323137637227142.
[0.99183463590963025992221676151568-0.99183458572688580323137637227142=0.00000005018274445669084038924426  ]
Toliau pagal (5) formulę rasime  :
 
= 0.99183458572688580323137637227142*(33 - 1.3*0.99183458572688580323137637227142^32)/32 = 0.99183463590958836578366677638205.
(0.99183458572688580323137637227142*(33 - 1.3*0.76922952379474351345468696687987)/32 = 0.99183463590958836578366677638205.)
[0.99183463590963025992221676151568 - 0.99183463590958836578366677638205 = 0.00000000000004189413854998513363 =
 ]
Toliau pagal (5) formulę rasime  :
 
= 0.99183463590958836578366677638205*(33 - 1.3*0.99183463590958836578366677638205^32)/32 = 0.9918346359096302599222167323178.
Atėmę, ką tik gautą   reikšmę iš tikslios   reikšmės, gauname:
0.99183463590963025992221676151568 - 0.9918346359096302599222167323178 = 0.00000000000000000000000002919788 =
 
Gavome po keturių iteracijų paklaidą mažesnę už  
Padalijus vienetą iš   reikšmės gauname
 
= 1/0.9918346359096302599222167323178 = 1.0082325861537202021533990065619.
[1.0082325861537202021533989768813 - 1.0082325861537202021533990065619 = -0.0000000000000000000000000296806 =
 ]
1.0082325861537202021533990065619^32 = 1.3000000000000000000000012246312.
(kad pakelti 1.0082325861537202021533990065619 32 laipsniu reikia ant kalkuliatoriaus 5 kartus paspasuti mygtuką  )
Toliau apskaičiuosime ln(1.3). Kadangi
 
tai tereikia apskaičiuoti   Gauname
  ln(0.9918346359096302599222167323178) = ln(1-0.0081653640903697400777832676822), x=-0.0081653640903697400777832676822.
Pagal Teiloro formulę ( https://lt.wikibooks.org/wiki/Matematika/Teiloro_eilutė#Natūrinio_logaritmo_liekamojo_nario_įvertinimas ) apskaičiuosime -32*ln(1+x) = -32*ln(1-0.0081653640903697400777832676822). Imsime n=9. Tada
 
čia  
Vietoje x įstatome -0.0081653640903697400777832676822 į (13) formulę ir su n=9, gauname
 
= -0.0081653640903697400777832676822 - (-0.0081653640903697400777832676822)^2/2 + (-0.0081653640903697400777832676822)^3/3 - (-0.0081653640903697400777832676822)^4/4 + (-0.0081653640903697400777832676822)^5/5 - (-0.0081653640903697400777832676822)^6/6 + (-0.0081653640903697400777832676822)^7/7 - (-0.0081653640903697400777832676822)^8/8 + (-0.0081653640903697400777832676822)^9/9 =
(galima nuo skaičiaus "-0.0081653640903697400777832676822" iki ženklo "=" nukopijuoti visą eilutę su 9 dėmenim ir įstatyti (padaryti "Paste") į Windows 10 kalkuliatorių ir iškart bus gautas apskaičiuotas atsakymas)
= -0.00819888326460909537597654216045.
[-0.00819888326460909537597654216045 - ln(0.9918346359096302599222167323178) = 1.3273686782585303927157997035195e-22.]
Gavome paklaidą  
Įvertinsime liekamąjį narį teoriškai.
 
=| -32*((-0.0081653640903697400777832676822)^10)/(10*(1-0.0081653640903697400777832676822)^10) | =
=| -32*((-0.0081653640903697400777832676822)^10)/(10*0.9918346359096302599222167323178^10) | =
(čia galima padaryti "Copy-Paste", viską nukopijavus, išskyrus modulio ženklus "|" ir paspaudus paskui kalkuliatoriuje ženklą "="; tokiu budu bus gautas žemiau esantis atsakymas)
=| -4.5762824470151633013165981309199e-21 |  
Padauginsime anksčiau per Teiloro eilutę gautą atsakymą -0.00819888326460909537597654216045 iš -32, kad gauti ln(1.3). Taigi,
  -32*(-0.00819888326460909537597654216045) = 0.2623642644674910520312493491344.
Atėmę apskaičiuotą ln(1.3) [apytikslią] reikšmę iš Windows 10 kalkuliatoriaus tikslios reikšmės, gauname paklaidą:
ln(1.3) - 0.2623642644674910520312493491344 = 0.26236426446749105203549598688095 - 0.2623642644674910520312493491344 =
= 4.2466377465543972041664561314341e-21.
Taigi, gavome paklaidą  
Ir čia viskas atitinka teoriją.
Palyginsime kiek reikia daugybos ir sudeties operacijų, 5 kartus traukiant kvadratinę šaknį su vieno karto trisdešimt antro laipsnio šaknies traukimo formulę. Priminsime 32-o laipsnio šaknies traukimo formulę (tiksliau 1/z^(1/32))
 
Kad   pakelti 32 laipsniu, reikia tiesiog   penkis kartus pakelti kvadratu. Tai jau yra 5 daugybos operacijos. Toliau dar reikia   padauginti iš z. Jau turime 6 daugybos operacijas. Tada reikia   atimti iš 33. Gauname vieną atimties operaciją. Ir galiausiai viską padauginti iš   ir iš 1/32. Gavosi iš viso 6+2=8 daugybos operacijos ir viena atimties operacija. Truputi tiksliau [nei mes] iš procesoriaus FPU lentelės pasirinkus   reikšmę užteks 3 iteracijų, kad gauti 18 skaitmenų tikslumą. Todėl kad ištraukti 32-o laipsnio šaknį reikia 8*3=24 daugybos operacijos ir 1*3=3 atimties operacijų. Iš viso 24+3=27 operacijos (nors šiuolaikiniai procesoriai turi FMA (fuse multiply add) instrukcija, kuri leidžia per vieną operaciją sudauginti du skaičius ir pridėti trečią skaičių). Daugybos ir sudeties operacijos x87 FPU skaičiuojamos panašiu greičiu. Čia nereikia vienos dalybos iteracijos, kad atlikti   nes skaičiuojant ln(1+x) be to apseinama kaip galima matyti iš aukščiau.
Išnagrinėsime kiek reikia daugybos ir sudeties operacijų, jei penkis kartus traukti kvadratinę šaknį iš skaičiaus z. Kvadtatinės šaknies (tiksliau 1/x^(1/2)) traukimo vienos iteracijos formulė yra tokia:
 
Kad pakelti   kvadratu reikia vienos daugybos operacijos. Paskui dar vienos daugybos operacijos reikia, kad padauginti  x. Jau turime dvi daugybos operacijas. Čia yra dar viena atimties operacija. Dar viena daugybos operacija reiškinio skliaustuose iš   ir dar viena daugybos operacija visko padauginimas iš 0.5. Taigi, iš viso reikia 2+2=4 daugybos operacijų ir vienos atimties operacijos. Procesoriui gana tiksliai pasirinkus pirmą artinį   užteks 3 iteracijų. Atlikus 3 iteracijas dar reikia padauginti gautą rezultatą iš x, kad gauti x^(1/2). Šiuolaikiniai procesoriai skaičiuojantis pagal Goldschmidt’o algorithm'ą moka suskaičiuoti vienu metu ir 1/x^(1/2) ir x^(1/2), todėl sutaupoma viena daugybos operacija (palyginus su Niutono metodu), bet nesutaupomi tranzistoriai. Trims iteracijoms reikia 4*3=12 daugybos operacijų ir 1*3=3 atimties operacijos. Taigi, kvadratinę šaknį reikia traukti 5 kartus. Tai iš viso reikia 12*5=60 daugybos operacijų ir 3*5=15 atimties operacijų. Gaunasi, kad iš viso reikia 60+15=75 operacijų, kad penkis kartus ištraukti kvadratinę šaknį (ir tai paskui pritaikyti ln(1+x) skaičiavimuose).
Taigi, kad apskaičiuoti 1/z^(1/32) reikia 27 operacijų. Gauname, kad penkių kartų skaičiavimui 1/x^(1/2) reikia 75/27=2.77778 karto daugiau operacijų negu 1/z^(1/32) skaičiavimui. Ne tiek jau ir daug ir todėl greičiausiai nieks neeikvos papildomų tranzistorių   lentelėms bei nekurs naujų instrukcijų, kad greičiau apskaičiuoti ln(x). Tiesa, ln(x), kaip parodyta čia ( https://lt.wikibooks.org/wiki/Matematika/Teiloro_eilutė#e_pakelta_x_liekamojo_nario_įvertinimas ), taikomas skaičiaus kelimui bet kokiu laipsniu. Bet skaičiaus kelimas bet kokiu laipsniu mažai kur reikalingas. Dar yra ir kitokių gana konkurencingų ln(x) skaičiavimo būdų.
Geriau paskaičius, Goldschmidt’o algorithm'as gali būti, kad sutaupo kiekvienoje iteracijoje daugybą iš 0.5. Tai iš viso trijose iteracijose sutaupomos trys daugybos operacijos (arba trys dalybos operacijos iš 2; dvejetainėje sistemoje dalyba iš dviejų yra pastumimas visų bitų į dešinę per vieną bito poziciją; bet kas greičiau ar daugyba, ar pastumimas tai yra dar neaišku).
Va čia gerai paaiškinta apie Goldschmidt’o algorithm'ą: https://en.wikipedia.org/wiki/Methods_of_computing_square_roots#Goldschmidt’s_algorithm


  • Apskaičiuosime   ir rasime kam lygus   Tiksli   reikšmė yra tokia:
  0.99105022504172762555415281377767.
O   1.0090305967670766121721228310046.
Mes paimsime, kad   Tada pagal (5) formulę
 
= 1.009*(33 - 0.75*1.3320401627616656376316134288889)/32 = 1.0090305814634409227725711418028.
[1.0090305967670766121721228310046 - 1.0090305814634409227725711418028 = 0.0000000153036356893995516892018  ]
Toliau pagal (5) formulę rasime  :
 
= 1.0090305814634409227725711418028*(33 - 0.75*1.0090305814634409227725711418028^32)/32 = 1.0090305967670727824366475789071.
[1.0090305967670766121721228310046 - 1.0090305967670727824366475789071 = 0.0000000000000038297354752520975  ]
Toliau pagal (5) formulę rasime  :
 
= 1.0090305967670727824366475789071*(33 - 0.75*1.0090305967670727824366475789071^32)/32 = 1.0090305967670766121721228307648.
Atėmę gautą   reikšmę iš tikslios   reikšmės, gauname:
1.0090305967670766121721228310046 - 1.0090305967670766121721228307648 = 0.0000000000000000000000000002398  
Tik po 3 iteracijų paklaida yra mažesnė nei   Taip yra todėl, nes parinkome   su paklaida
1.0090305967670766121721228310046 - 1.009 = 0.0000305967670766121721228310046  
Na o,
  1/1.0090305967670766121721228307648 = 0.99105022504172762555415281401323.
[0.99105022504172762555415281377767 - 0.99105022504172762555415281401323 = -0.00000000000000000000000000023556 =
  Čia kažkodėl iš viso, su pirmu nuliu prieš tašką, yra 33 skaitmenys, o ne 32 skaitmenys kaip prieš tai esančiame   paklaidos atsakyme.]
Toliau apskaičiuosime ln(0.75). Kadangi
 
tai tereikia apskaičiuoti   Gauname
  ln(1.0090305967670766121721228307648) = ln(1+0.0090305967670766121721228307648), x=0.0090305967670766121721228307648.
Pagal Teiloro formulę apskaičiuosime -32*ln(1+x) = -32*ln(1+0.0090305967670766121721228307648). Imsime n=9. Tada
 
čia  
Vietoje x įstatome 0.0090305967670766121721228307648 į (13) formulę ir su n=9, gauname
 
= 0.0090305967670766121721228307648 - 0.0090305967670766121721228307648^2/2 + 0.0090305967670766121721228307648^3/3 - 0.0090305967670766121721228307648^4/4 + 0.0090305967670766121721228307648^5/5 - 0.0090305967670766121721228307648^6/6 + 0.0090305967670766121721228307648^7/7 - 0.0090305967670766121721228307648^8/8 + 0.0090305967670766121721228307648^9/9 =
= 0.00899006476411815398283337192369.
[0.00899006476411815398283337192369 - ln(1.0090305967670766121721228307648) =
= 0.00899006476411815398283337192369 - 0.00899006476411815398247559369963 =
= 0.00000000000000000000035777822406.]
Gavome paklaidą  
Įvertinsime liekamąjį narį teoriškai.
 
=| -32*(0.0090305967670766121721228307648^10)/10 | =
(čia galima padaryti "Copy-Paste", viską nukopijavus į kalkuliatoriaus laukelį kur rodo skaičius, išskyrus modulio ženklus "|" ir paspaudus paskui kalkuliatoriuje ženklą "="; tokiu budu bus gautas žemiau esantis atsakymas)
=| -1.1542888083111938172050915484026e-20 |  
Padauginsime anksčiau per Teiloro eilutę gautą atsakymą ln(1+x)=0.00899006476411815398283337192369 iš -32, kad gauti ln(0.75). Taigi,
  -32*0.00899006476411815398283337192369 = -0.28768207245178092745066790155808.
Atėmę apskaičiuotą ln(0.75) [apytikslią] reikšmę iš Windows 10 kalkuliatoriaus tikslios reikšmės, gauname paklaidą:
ln(0.75) - (-0.28768207245178092745066790155808) = -0.28768207245178092743921900599383 + 0.28768207245178092745066790155808 =
= 0.00000000000000000001144889556425.
Taigi, gavome paklaidą  
Viskas atitinka teoriją.

Goldschmidt dalybos algoritmas

keisti

https://en.wikipedia.org/wiki/Division_algorithm#Goldschmidt_division

Goldschmidt'o algoritmas veikia taip, kad skaitiklis ir vardiklis dauginamas iš bendro skaičiaus Fi. Skaičius Fi pasirinktas taip, kad dauginant vardiklį kiekvieną kartą iš Fi, vardiklis konverguoja į vienetą. Taip kelis kartus dauginant skaitiklį ir vardiklį iš Fi skaitiklis konverguoja į Q=N/D; čia N yra dalinys (skaitiklis), D yra daliklis (vardiklis). Formulė Q skaičiuoti yra tokia:
 

Žingsniai Goldschmidt'o dalybai yra:

  1. Generuoti Fi .
  2. Padauginti dalinį ir daliklį iš Fi .
  3. Jeigu daliklis pakankmai arti prie 1, pateikti dalmenį Q, priešintu atveju, kartoti nuo žingsnio 1.
Pirma reikia daliklį (vardiklį) padauginti iš 0.1, kad jisai būtų intervale nuo 0 iki 1 (0<D<1). Kiekvienas Fi randamas iš Di (D1 = D):
 
Dauginant dalinį   ir daliklį   iš faktoriaus Fi duoda   ir  :
 
Po pakankmo iteracijų skaičiaus k,  .

Pavyzdžiai

keisti
  • Apskaičiuosime Q=N/D=3/7. Padauginame 7 iš 0.1:   Tada
 
 
Toliau padauginame   ir   :
 
 
Toliau apskaičiuojame  :
 
Toliau padauginame   ir   :
 
 
Toliau apskaičiuojame  :
  2 - 0.9919 = 1.0081.
Toliau padauginame   ir   :
  4.251*1.0081 = 4.2854331,
  0.9919*1.0081 = 0.99993439.
Toliau apskaičiuojame  :
  2 - 0.99993439 = 1.00006561.
Toliau padauginame   ir   :
  4.2854331*1.00006561 = 4.285714267265691,
  0.99993439*1.00006561 = 0.9999999956953279.
Taigi   4.285714267265691*0.1 = 0.4285714267265691. Tiksli Q=3/7 reikšmė yra tokia:
Q = 3/7 = 0.42857142857142857142857142857143.
[0.42857142857142857142857142857143 - 0.4285714267265691 = 0.00000000184485947142857142857143  ]
Po 4 iteracijų gavome paklaidą mažesnę nei  
Dar padarysime penktą įteraciją, apskaičiuodami     ir  :
  2 - 0.9999999956953279 = 1.0000000043046721;
  4.285714267265691*1.0000000043046721 = 4.2857142857142856348705633349211,
  0.9999999956953279*1.0000000043046721 = 0.99999999999999998146979811148159.
Taigi   4.2857142857142856348705633349211*0.1 = 0.42857142857142856348705633349211.
[0.42857142857142857142857142857143 - 0.42857142857142856348705633349211 = 0.00000000000000000794151509507932 =
 ]
Po 5 iteracijų gavome paklaidą mažesnę nei  

Nuorodos

keisti