Funkcje liczbowe: Różnice pomiędzy wersjami

Z Henryk Dąbrowski
Przejdź do nawigacji Przejdź do wyszukiwania
m (1 wersja)
 
Linia 110: Linia 110:
  
  
[[LibreOffice Calc – makra | <b>LibreOffice Calc – makra</b>]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[[Henryk Dąbrowski | <b>Strona główna</b>]]
+
[[LibreOffice Calc – makra – przykłady | <b>LibreOffice Calc – makra – przykłady</b>]]&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;[[Henryk Dąbrowski | <b>Strona główna</b>]]
  
  

Aktualna wersja na dzień 15:24, 24 maj 2024

27.09.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

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