Różnica pomiędzy stronami "Funkcje informacyjne" i "Funkcje liczbowe"
m (1 wersja) |
|||
Linia 1: | Linia 1: | ||
− | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;"> | + | <div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">27.09.2020</div> |
__FORCETOC__ | __FORCETOC__ | ||
Linia 5: | Linia 5: | ||
− | == | + | == Logarytm o podstawie 10 == |
− | + | Korzystając ze wzoru na zmianę podstawy logarytmu: | |
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b> | + | ::log<sub>a</sub>(x) = log<sub>b</sub>(x)/log<sub>b</sub>(a) |
− | <span style='color:# | + | |
− | + | łatwo zdefiniujemy logarytm o podstawie równej 10: | |
− | + | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>myLog10(x <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span> | |
− | + | myLog10 <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Log</span>(x)/<span style='color:#0095ff;'>Log</span>(<span style='color:#ff0000;'>10</span>) | |
− | + | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | |
− | + | ||
− | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe1() | |
− | + | MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>10</span>) | |
− | + | MsgBox <span style='color:#0095ff;'>myLog10</span>(<span style='color:#ff0000;'>100</span>) | |
− | + | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | |
+ | |||
+ | 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). | ||
+ | |||
+ | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>RandNum(a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span> | ||
+ | <span style='color:#707070;'>'funkcja zwraca liczbę losową z przedziału [a,b)</span> | ||
+ | RandNum <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Rnd</span>()*(b-a) + a <span style='color:#707070;'>'Rnd() zwraca liczbę losową z przedziału [0,1)</span> | ||
<b><span style='color:#1f1c1b;'>End Function</span></b></span> | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe2() |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> oSheets <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oSht <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span>, oRows <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Object</span> | |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, g <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span>, k <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Long</span> | |
− | + | oSheets <span style='color:#000080;'>=</span> ThisComponent.getSheets() <span style='color:#707070;'>'uchwyt do skoroszytu</span> | |
− | + | <b><span style='color:#1f1c1b;'>If </span></b><b><span style='color:#000000;'>NOT</span></b> oSheets.hasByName( <span style='color:#ff0000;'>"TestRGB"</span> ) <b><span style='color:#1f1c1b;'>Then</span></b> <span style='color:#707070;'>'sprawdza czy arkusz o podanej nazwie już istnieje</span> | |
− | + | oSheets.insertNewByName( <span style='color:#ff0000;'>"TestRGB"</span>, <span style='color:#ff0000;'>0</span> ) <span style='color:#707070;'>'wstawia nowy arkusz na pozycji 1 (z indeksem 0)</span> | |
+ | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
+ | oSht <span style='color:#000080;'>=</span> oSheets.getByName(<span style='color:#ff0000;'>"TestRGB"</span>) <span style='color:#707070;'>'uchwyt do arkusza "TestRGB"</span> | ||
+ | ThisComponent.CurrentController.setActiveSheet(oSht) <span style='color:#707070;'>'uaktywnienie arkusza "TestRGB"</span> | ||
+ | oRows <span style='color:#000080;'>=</span> oSht.getRows() <span style='color:#707070;'>'uchwyt do wierszy</span> | ||
+ | <b><span style='color:#1f1c1b;'>For </span></b>k=<span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>To</span></b> <span style='color:#ff0000;'>100</span> | ||
+ | r <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) ) | ||
+ | g <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) ) | ||
+ | b <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>Int</span>( <span style='color:#0095ff;'>RandNum</span>(<span style='color:#ff0000;'>0</span>,<span style='color:#ff0000;'>256</span>) ) | ||
+ | oRows.getByIndex(k).Height <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>200</span> <span style='color:#707070;'>'wybiera wiersz przez indeks i ustawia jego wysokość równą 2 mm</span> | ||
+ | oRows.getByIndex(k).CellBackColor <span style='color:#000080;'>=</span> <span style='color:#0095ff;'>RGB</span>(r,g,b) <span style='color:#707070;'>'ustawia kolor tła wiersza</span> | ||
+ | <b><span style='color:#1f1c1b;'>Next </span></b>k | ||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
− | |||
+ | == 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 ([https://pl.wikipedia.org/wiki/Algorytm_obliczania_pierwiastka_n-tego_stopnia LINK]):<br/> | ||
+ | ::a<sub>1</sub> = 1<br/> | ||
+ | ::a<sub>n+1</sub> = ( a<sub>n</sub> + x/a<sub>n</sub> )/2<br/> | ||
− | + | 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 - ... | |
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b> | + | Rozwinięcie jest zbieżne dla |x| ≤ 1 |
− | <span style='color:#707070;'>'funkcja | + | |
− | <b><span style='color:#1f1c1b;'>Dim</span></b> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Function </span></b>mySqr(x <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>) <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span> |
− | <b><span style='color:#1f1c1b;'>If </span></b> | + | <span style='color:#707070;'>'funkcja oblicza pierwiastek kwadratowy z x</span> |
− | + | <b><span style='color:#1f1c1b;'>Dim</span></b> a <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, b <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span>, r <b><span style='color:#1f1c1b;'>as</span></b> <span style='color:#000080;'>Double</span> | |
+ | <b><span style='color:#1f1c1b;'>If </span></b>x < <span style='color:#ff0000;'>0</span> <b><span style='color:#1f1c1b;'>Then</span></b> | ||
+ | mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>0</span> | ||
+ | MsgBox <span style='color:#ff0000;'>"mySqr: ujemna wartość parametru!"</span> | ||
<b><span style='color:#1f1c1b;'>Exit Function</span></b> | <b><span style='color:#1f1c1b;'>Exit Function</span></b> | ||
<b><span style='color:#1f1c1b;'>End If</span></b> | <b><span style='color:#1f1c1b;'>End If</span></b> | ||
− | + | r <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>5</span>) <span style='color:#707070;'>'wartość r wyznacza precyzję obliczeń</span> | |
− | + | a <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> | |
− | + | b <span style='color:#000080;'>=</span> x | |
− | + | <b><span style='color:#1f1c1b;'>If </span></b><span style='color:#0095ff;'>Abs</span>(b - a) <= r <b><span style='color:#1f1c1b;'>Then</span></b> | |
− | + | mySqr <span style='color:#000080;'>=</span> <span style='color:#ff0000;'>1</span> + (x-<span style='color:#ff0000;'>1</span>)/<span style='color:#ff0000;'>2</span> - (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>2</span>/<span style='color:#ff0000;'>8</span> + (x-<span style='color:#ff0000;'>1</span>)^<span style='color:#ff0000;'>3</span>/<span style='color:#ff0000;'>16</span> | |
− | <b | + | <b><span style='color:#1f1c1b;'>Exit Function</span></b> |
− | <b><span style='color:#1f1c1b;'> | + | <b><span style='color:#1f1c1b;'>End If</span></b> |
+ | <b><span style='color:#1f1c1b;'>Do While </span></b><span style='color:#0095ff;'>Abs</span>(b - a) > r | ||
+ | a <span style='color:#000080;'>=</span> b | ||
+ | b <span style='color:#000080;'>=</span> (a + x/a)/<span style='color:#ff0000;'>2</span> | ||
+ | <b><span style='color:#1f1c1b;'>Loop</span></b> | ||
+ | mySqr <span style='color:#000080;'>=</span> b | ||
<b><span style='color:#1f1c1b;'>End Function</span></b></span> | <b><span style='color:#1f1c1b;'>End Function</span></b></span> | ||
− | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b> | + | <span style="color: green"><b><span style='color:#1f1c1b;'>Sub </span></b>Liczbowe3() |
− | <span style='color:# | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>0.25</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>0.25</span>) |
− | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>1</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>1</span>) | |
− | < | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</span>)) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>1</span>+<span style='color:#ff0000;'>10</span>^(-<span style='color:#ff0000;'>6</span>)) |
− | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>2</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>2</span>) <span style='color:#707070;'>'√2 <span style='color:#000080;'>=</span> 1.414213562373095…</span> | |
− | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>3</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>3</span>) <span style='color:#707070;'>'√3 <span style='color:#000080;'>=</span> 1.732050807568877…</span> | |
− | + | MsgBox <span style='color:#0095ff;'>mySqr</span>(<span style='color:#ff0000;'>4</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Chr</span>(<span style='color:#ff0000;'>10</span>) <span style='color:#000080;'>&</span> <span style='color:#0095ff;'>Sqr</span>(<span style='color:#ff0000;'>4</span>) | |
− | |||
− | < | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
<b><span style='color:#1f1c1b;'>End Sub</span></b></span> | <b><span style='color:#1f1c1b;'>End Sub</span></b></span> | ||
Wersja z 19:06, 18 paź 2020
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 Strona główna