Funkcje liczbowe: Różnice pomiędzy wersjami
m (1 wersja) |
|||
Linia 110: | Linia 110: | ||
− | [[LibreOffice Calc – makra | <b>LibreOffice Calc – makra</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] | + | [[LibreOffice Calc – makra – przykłady | <b>LibreOffice Calc – makra – przykłady</b>]] [[Henryk Dąbrowski | <b>Strona główna</b>]] |
Aktualna wersja na dzień 15:24, 24 maj 2024
Logarytm o podstawie 10
Korzystając ze wzoru na zmianę podstawy logarytmu:
- loga(x) = logb(x)/logb(a)
łatwo zdefiniujemy logarytm o podstawie równej 10:
Function myLog10(x as Double) as Double
myLog10 = Log(x)/Log(10)
End Function
Sub Liczbowe1()
MsgBox myLog10(10)
MsgBox myLog10(100)
End Sub
Jest to znacznie prostszy sposób niż wykorzystywanie w tym celu funkcji arkusza LOG10().
Liczba losowa z przedziału [a, b)
Funkcja Rnd() zwraca liczbę losową z przedziału [0, 1). Łatwo możemy napisać funkcję, która zwraca liczbę losową z przedziału [a, b).
Function RandNum(a as Double, b as Double) as Double
'funkcja zwraca liczbę losową z przedziału [a,b)
RandNum = Rnd()*(b-a) + a 'Rnd() zwraca liczbę losową z przedziału [0,1)
End Function
Sub Liczbowe2()
Dim oSheets as Object, oSht as Object, oRows as Object
Dim r as Long, g as Long, b as Long, k as Long
oSheets = ThisComponent.getSheets() 'uchwyt do skoroszytu
If NOT oSheets.hasByName( "TestRGB" ) Then 'sprawdza czy arkusz o podanej nazwie już istnieje
oSheets.insertNewByName( "TestRGB", 0 ) 'wstawia nowy arkusz na pozycji 1 (z indeksem 0)
End If
oSht = oSheets.getByName("TestRGB") 'uchwyt do arkusza "TestRGB"
ThisComponent.CurrentController.setActiveSheet(oSht) 'uaktywnienie arkusza "TestRGB"
oRows = oSht.getRows() 'uchwyt do wierszy
For k=0 To 100
r = Int( RandNum(0,256) )
g = Int( RandNum(0,256) )
b = Int( RandNum(0,256) )
oRows.getByIndex(k).Height = 200 'wybiera wiersz przez indeks i ustawia jego wysokość równą 2 mm
oRows.getByIndex(k).CellBackColor = RGB(r,g,b) 'ustawia kolor tła wiersza
Next k
End Sub
Obliczanie pierwiastka kwadratowego
Zauważmy, że jeżeli liczba a jest przybliżoną wartością pierwiastka z liczby x z niedomiarem, to x/a jest przybliżoną wartością pierwiastka z liczby x z nadmiarem. Pozwala to przypuszczać, że ciąg kolejnych średnich z liczb a i x/a będzie dążył do pierwiastka z liczby a. Jest tak w istocie i pozwala to zapisać prosty algorytm służący do obliczania pierwiastka z liczby nieujemnej x (LINK):
- a1 = 1
- an+1 = ( an + x/an )/2
- a1 = 1
Możemy zatem napisać własną funkcję, która oblicza pierwiastek kwadratowy. Podkreślmy, że zapisana niżej funkcja mySqr() nie jest potrzebna, bo istnieje funkcja Sqr(), która pierwiastek kwadratowy z liczby x znajduje. Funkcję tę prezentujemy jedynie jako ciekawostkę dla zainteresowanego Czytelnika, który chciałby wiedzieć, jak funkcję tę można zrealizować. Wykorzystujemy następujące rozwinięcie w szereg Taylora:
- √(1+x) = 1 + x/2 - x^2/8 + x^3/16 - ...
Rozwinięcie jest zbieżne dla |x| ≤ 1
Function mySqr(x as Double) as Double
'funkcja oblicza pierwiastek kwadratowy z x
Dim a as Double, b as Double, r as Double
If x < 0 Then
mySqr = 0
MsgBox "mySqr: ujemna wartość parametru!"
Exit Function
End If
r = 10^(-5) 'wartość r wyznacza precyzję obliczeń
a = 1
b = x
If Abs(b - a) <= r Then
mySqr = 1 + (x-1)/2 - (x-1)^2/8 + (x-1)^3/16
Exit Function
End If
Do While Abs(b - a) > r
a = b
b = (a + x/a)/2
Loop
mySqr = b
End Function
Sub Liczbowe3()
MsgBox mySqr(0.25) & Chr(10) & Sqr(0.25)
MsgBox mySqr(1) & Chr(10) & Sqr(1)
MsgBox mySqr(1+10^(-6)) & Chr(10) & Sqr(1+10^(-6))
MsgBox mySqr(2) & Chr(10) & Sqr(2) '√2 = 1.414213562373095…
MsgBox mySqr(3) & Chr(10) & Sqr(3) '√3 = 1.732050807568877…
MsgBox mySqr(4) & Chr(10) & Sqr(4)
End Sub
LibreOffice Calc – makra – przykłady Strona główna