Tak ma napadlo praktické využitie Newtonovej metódy pre nájdenie obsahu kruhu. Keďže túto metódu môžeme využiť na nájdenie mocniny resp. odpocniny, tak ešte potrebujeme nájsť číslo pí a to nájdeme ako 4*súčet čísiel 1/1-1/3+1/5-1/7+1/9 atď. Toto všetko si poďme skúsiť skombinovať ako vždy v našom obľúbenom jazyku Gambas3. Tu je teda zdroják:
' Gambas class file
'mnohe veci v tomto programe sa daju vylepsit
'podla vlastnej fantazie a podla chuti
'toto je len koncept programu,
'treba si ho dopisat podla vlastnej chuti
Public Sub umocni(n As Float, k As Float) As Variant
'funkcia umocni n^k a vrat vysledok
'pozor k moze byt zaporne alebo desatinne cislo
'ak sa jedna o celociselne umocnenie, tak spravim toto
'najskor skontrolujem, ci k je cele cislo a potom umocnim
Dim cele, zaporne As Integer
'vysledok
Dim vysl, fi, fra, vysl1, vysl2, vysl3 As Float
vysl = 0
'bool je/nieje cele cislo
cele = 0
'bool k je/nieje zaporne cislo, nula pre nezaporne
zaporne = 0
If Abs(Frac(k)) > 0 Then
'ak desatinna cast cisla je vacsia ako nula, tak k neni cele cislo
cele = 0
Else
'inak k je cele cislo
cele = 1
Endif
'kontrola zaporneho k
If k > 0 Then
'nie je zaporne
zaporne = 0
Endif
'kontrola zaporneho k
If k < 0 Then
'je zaporne
zaporne = 1
Endif
'ak k je rovne nule, vratim rovno vysledok 1
'hocico umocnene na nultu je jedna
If k = 0 Then
Return 1.0
Endif
'ak sa jedna o cele cislo a nezaporne, tak vytvorim umocnenie
If cele = 1 And zaporne = 0 Then
'vynasobim float, lebo chcem float vysledok
'explicitny casting premennej
vysl = n * 1.0
k = CInt(k)
While (k - 1 > 0)
vysl = n * vysl
Dec k
Wend
Endif
'ak sa jedna o cele cislo a zaporne, tak vytvorim umocnenie
If cele = 1 And zaporne = 1 Then
'vynasobim float, lebo chcem float vysledok
'explicitny casting premennej
vysl = n * 1.0
k = CInt(k)
While (k - 1 > 0)
vysl = n * vysl
Dec k
Wend
vysl = 1 / vysl
Endif
'ak sa jedna o necele cislo a nezaporne, tak vytvorim umocnenie
If cele = 0 And zaporne = 0 Then
'spravim si 100 nasobok, aby som sa dostal za desatinnu ciarku na dve miesta
fra = Frac(k)
'cela cast
fi = k - fra
'desatinna cast
fra = fra * 100
fra = Round(fra)
'Print "cela cast= " & fi & " des cast= " & fra & " n= " & n
vysl1 = umocni(n, fi)
'Print vysl1
vysl2 = umocni(n, fra)
'Print vysl2
vysl3 = odmocni(100, vysl2)
'Print vysl3
vysl = vysl1 * vysl3
Endif
'vrat vysledok
Return vysl
End
'funckia najde vhodne X0
Public Sub NajdiX0(k As Float, n As Float) As Float
Dim x, t, fx, fxd2 As Float
t = 1
While t < 10000
fx = umocni(t, k) - n
fxd2 = (k * k - k) * umocni(t, (k - 2))
If fx * fxd2 > 0 Then
Return t
Endif
t = t + 1
Wend
Return k
End
Public Sub odmocni(k As Float, n As Float) As Variant
'premenne xi+1 a xi0
Dim xi0, xi1, k2 As Float
'iterator q
Dim q As Integer
k2 = k
k = Abs(k)
q = 1
'nastavim si xi0 podla podmienok, ktore uvazim
'vid podmienky Newtonovej metody pre ziskanie korena
xi0 = NajdiX0(k, n)
'ak k > 180 tak vrat 1
'vacsia odmocnina ako 180 beriem, ze je uz prakticky rovna 1
If Abs(k) > 180 Then
Return 1.0
Endif
While q < 10000
xi1 = xi0
'pouzijem Newtonovu metodu pre vypocet odmocniny z cisla
'pozor na delenie nulou - treba este upravit, domysliet
Try xi0 = xi0 - (umocni(xi0, k) - n) / (k * umocni(xi0, k - 1))
If Error Then
Message.Error("Chyba, toto umocnenie, odmocnenie neviem spočítať! " & error.text)
Exit
Endif
If Abs(xi1 - xi0) = 0 Then
'ak som nasiel cistu odmocninu, vratim vysledok
If k2 < 0 Then
Return 1 / xi1
Endif
If k2 > 0 Then
Return xi1
Endif
If k2 = 0 Then
Message.Error("Nultá odmocnina???")
Return -1.0
Endif
Endif
'zdvihnem q o jedna
Inc q
Wend
Return xi1
End
Public Sub zisti_pi() As Float
'funkcia vyrata pi
Dim s As Float
Dim n, presnost, delta, x As Integer
s = 1
x = 1
delta = 2
'pocet clenov
presnost = 1000
'vypocitam pi stvrt
For n = 1 To presnost
x = x + delta
s = s + umocni(-1, n) / (x)
Print x
Next
'vratim cele pi
Return s * 4
End
Public Sub _new()
'konstruktor triedy
End
Public Sub Form_Open()
Dim r, s As Float
r = 3.5
s = zisti_pi() * 3.5 * 3.5
Message.Info("Obsah kruhu s polomerom 3.5m je " & CStr(s) & " m^2")
Me.Close
End
Tento malý program, ktorý ma napadol ako ukážka využitia Newtonovej metódy a nájdenia čísla Pí spočíta obsah kruhu. Čo je zaujímavé je to, že vôbec neberieme pevnú konštantu čísla pí, ale si toto číslo sami vypočítame. Ďalej je tu zaujímavé spočítanie mocniny a odmocniny, na to využijeme Newtonovu metódu. Program som komentoval a nadvazuje na sériu článkov na tomto Blogu. Ak tento Content Management System zasa náhodou nezmenil niektoré znaky zdrojáku, tak by malo stačiť len skopírovať si tento zdroják do Gambas3 a malo by to fičať. Výsledkom programu je len okienko, ktoré vypíše obsah kruhu s polomerom 3.5metra ako vidíme v zdrojáku. Polomer je pevne zadaný. Dalo by sa ešte spraviť to, že v Gambase by sme si vytvorili textové políčko a v ňom by sme si zadávali polomery kruhu a po kliknutí na tlačítko by nám program zrátal obsah príslušného kruhu, ale to je už len námet na ďalšie rozmýšľanie…