Funkcje rzeczywiste: Różnice pomiędzy wersjami
(Utworzono nową stronę "<div style="text-align:right; font-size: 130%; font-style: italic; font-weight: bold;">27.06.2021</div> __FORCETOC__ == Wyznaczanie miejsca zerowego funkcji == Miej...") |
m (1 wersja) |
(Brak różnic)
|
Wersja z 21:36, 18 wrz 2022
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