Funkcje rzeczywiste

Z Henryk Dąbrowski
Przejdź do nawigacji Przejdź do wyszukiwania
27.06.2021



Wyznaczanie miejsca zerowego funkcji

Miejscem zerowym funkcji nazywamy każdy argument x0, dla którego wartość funkcji równa jest zero, czyli f(x0) = 0. Zamieszczona niżej funkcja Solve() znajduje przybliżoną wartość x0, o ile są spełnione następujące warunki:

  • funkcja f(x) jest funkcją ciągłą w przedziale (a, b)
  • punkty a i b zostały wybrane tak, że f(a) i f(b) są różne od zera i mają przeciwne znaki

Dokładność przybliżenia ustalamy wpisując odpowiednią wartość w warunku występującym w pętli Do While. W naszym przykładzie wartość x0 zostanie wyznaczona z dokładnością 10-8.
UWAGA: nazwą badanej funkcji musi być "f" (taka nazwa została wpisana w kodzie funkcji Solve()).

Function Solve(a as Double, b as Double) as Double
    Dim x1 as Double, x2 as Double, z as Double
    Dim f1 as Double, f2 as Double, g as Double
    x1 = IIf(a < b, a, b)
    x2 = IIf(a < b, b, a)
    f1 = f(x1)
    f2 = f(x2)
    If NOT Sgn(f1)*Sgn(f2) < 0 Then
        MsgBox "Warunek f(a)*f(b)<0 nie jest spełniony"
        Exit Function
    End If
    Do While (x2 - x1) > 10^(-8)
        z = (x1 + x2)/2
        g = f(z)
        If g = 0 Then Exit Do
        If Sgn(f1)*Sgn(g) < 0 Then
            f2 = g
            x2 = z
        Else
            f1 = g
            x1 = z
        End If
    Loop
    Solve = z
End Function


Czytelnik powinien pamiętać, że dokładność wyznaczenia miejsca zerowego funkcji nie mówi nam nic o dokładności, z jaką zostanie wyznaczona wartość f(x0). Dokładność ta zależy od tego, jak szybko rośnie (maleje) wartość funkcji f(x) w punkcie x0. Pokazuje to zamieszczony niżej przykład.

Function f(x as Double) as Double
    f = Exp(x) - Exp(30)
End Function
Sub Test2()
    Dim u as Double
    u = Solve(0, 50)
    MsgBox "   x0 = " & u & Chr(10) & "f(x0) = " & f(u)
    'x0 = 29,9999999988358
    'f(x0) = -12440,6953125
End Sub



Wyznaczanie miejsca ekstremum funkcji

Wiemy, że funkcja ciągła f(x) o wartościach rzeczywistych, określona na przedziale domkniętym [a, b] osiąga ekstrema globalne. Jeżeli f(x) osiąga w punkcie xex ∈ [a, b] ekstremum lokalne lub globalne, to powiemy, że xex jest miejscem ekstremum funkcji f(x). Zamieszczona niżej funkcja Extremum() znajduje przybliżoną wartość xex, o ile są spełnione następujące warunki:

  • funkcja f(x) jest funkcją ciągłą w przedziale (a, b)
  • funkcja f(x) jest rosnąca (malejąca) w przedziale (a, xex) i jest malejąca (rosnąca) w przedziale (xex, b)

Dokładność przybliżenia ustalamy wpisując odpowiednią wartość w warunku występującym w pętli Do While. W naszym przykładzie wartość xex zostanie wyznaczona z dokładnością 10-8. Czytelnik łatwo zauważy, że funkcja Extremum() w rzeczywistości znajduje maksimum funkcji f(x). W przypadku gdy szukamy minimum funkcji f(x), obliczenia wykonywane są dla funkcji -f(x).
UWAGA: nazwą badanej funkcji musi być "f" (taka nazwa została wpisana w kodzie funkcji Extremum()).

Function Extremum(a as Double, b as Double) as Double
    Dim X(1 To 4) as Double, Y(1 To 4) as Double 'deklaracja tablic
    Dim u as Double, znak as Double
    Dim k as Long
    znak = 1
    X(1) = IIf(a < b, a, b)
    X(4) = IIf(a < b, b, a)
    u = ( X(1) + X(4) )/2
    If f(u) < f(X(1)) AND f(u) < f(X(4)) Then znak = -1 'zmiana znaku, gdy szukamy minimum
    
    Do While X(4) - X(1) > 10^(-8) 'ustalamy precyzję obliczeń
        X(2) = X(1) + ( X(4) - X(1) )/3
        X(3) = X(1) + 2*( X(4) - X(1) )/3
        For k = 1 To 4
            Y(k) = znak * f( X(k) )
            If k = 1 Then
                u = Y(1)
            Else
                u = IIf(Y(k) > u, Y(k), u) 'u jest największym elementem tablicy Y
            End If
        Next k
    'czasami zapisanie instrukcji If...Then...Else w jednej linii poprawia czytelność kodu
             If u = Y(1) Then X(4) = X(2) _
        Else If u = Y(2) Then X(4) = X(3) _
        Else If u = Y(3) Then X(1) = X(2) _
        Else If u = Y(4) Then X(1) = X(3)
    Loop
    Extremum = ( X(1) + X(4) )/2
End Function



Function f(x as Double) as Double
    f = (x-1)*(x-2)*(x-3)*(x-4)*(x-5)
    'miejsca zerowe pochodnej:
    '1.3555671318
    '2.4560877440
    '3.5439122559
    '4.6444328681
End Function
Sub Test1()
    MsgBox Extremum(1,2) & Chr(10) & Extremum(2,3) & Chr(10) & Extremum(3,4) & Chr(10) & Extremum(4,5)
    '1,35556713127841
    '2,45608773985154
    '3,54391225642674
    '4,64443286673667
End Sub





LibreOffice Calc – makra                   Strona główna