Jeśli funkcja jest znany dwukrotnie różniczkowalne, użyj
f'(x) = (f(x + h) - f(x - h))/2h
który jest drugi w kolejności dokładne godz. Jeśli jest tylko jednokrotnie różny, należy jednoznacznie ustawić wartość w wierszu na wartość 1.
To jest teoria. W praktyce sprawy są dość trudne. Przyjmę drugą formułę (pierwsze zamówienie), ponieważ analiza jest prostsza. Wykonaj drugie zamówienie jako ćwiczenie.
Pierwsza obserwacja jest taka, że musisz musi upewnij się, że (x + h) - x = h, w przeciwnym razie dostaniesz ogromne błędy. Rzeczywiście, f (x + h) i f (x) są blisko siebie (powiedzmy 2.0456 i 2.0467), a kiedy je odejmujesz, tracisz wiele znaczących liczb (tutaj jest to 0,0011, co daje 3 znaczące liczby mniej niż x). Tak więc każdy błąd na h może mieć ogromny wpływ na wynik.
Tak więc, pierwszy krok, napraw kandydata h (pokażę ci po chwili jak go wybrać) i weź h do obliczenia ilość h '= (x + h) - x. Jeśli używasz języka takiego jak C, musisz zadbać o to, aby zdefiniować h lub x jako zmienne, aby nie można było zoptymalizować tych obliczeń.
Następnie wybór h. Błąd w (*) składa się z dwóch części: błędu obcięcia i błędu zaokrągleń. Błąd obcięcia jest fakt, że formuła nie jest dokładny:
(f(x + h) - f(x))/h = f'(x) + e1(h)
gdzie e1(h) = h/2 * sup_{x in [0,h]} |f''(x)|
.
Błąd zaokrąglania wynika z faktu, że f (x + h) i f (x) są blisko siebie. Można oszacować grubsza
e2(h) ~ epsilon_f |f(x)/h|
gdzie epsilon_f
jest względną dokładność obliczeń funkcji f (x) (lub F (x + h), który jest blisko). To musi być ocenione na podstawie twojego problemu. W przypadku prostych funkcji, epsilon_f
może być traktowany jako epsilon maszyny. Dla bardziej skomplikowanych może być gorszy niż rząd wielkości.
Więc chcesz h
, który minimalizuje e1(h) + e2(h)
. Podłączając wszystko razem i optymalizacji w h
daje
h ~ sqrt(2 * epsilon_f * f/f'')
która musi być określona na podstawie swojej funkcji. Możesz wziąć przybliżone szacunki. Jeśli masz wątpliwości, weź h ~ sqrt (epsilon) gdzie epsilon = dokładność maszyny. Dla optymalnego wyboru h względna dokładność, z jaką znana jest pochodna, to sqrt (epsilon_f), czyli. połowa znaczących liczb jest poprawna.
W skrócie: zbyt mały a h => błąd zaokrągleń, zbyt duży a h => błąd obcięcia.
Dla wzoru drugiego rzędu, takie same wydajności obliczeń
h ~ (6 * epsilon_f/f''')^(1/3)
i częściowym dokładność (epsilon_f)^(2/3) dla pochodnej (zwykle jedna albo dwie cyfry znaczące lepsze niż pierwsza formuła zamówienia, zakładając podwójną precyzję).
Jeśli jest to zbyt nieprecyzyjne, poproś o więcej metod, istnieje wiele sztuczek, aby uzyskać lepszą dokładność. Ekstrapolacja Richardsona jest dobrym początkiem dla płynnych funkcji. Ale te metody zazwyczaj są obliczane dość często, może to być lub nie być to, co chcesz, jeśli twoja funkcja jest złożona.
Jeśli zamierzasz używać wielu pochodnych wiele razy w różnych punktach, interesujące jest skonstruowanie przybliżenia Czebyszewa.
+1 za fajną odpowiedź :) – posdef
Mam rację myśląc, że im mniej wybieram dx, tym dokładniejsza będzie moja odpowiedź. Jeśli tak, to czy istnieje stała MATLAB dla BARDZO małej liczby rzeczywistej? Coś jak pi dla 3.14 ... lub i dla sqrt (-1)? – lms
@codenoob: 'eps' daje bardzo małą liczbę. Jednak dla większości praktycznych celów wystarczy 0,0001. Ponadto, jeśli pracujesz z wielomianami i używasz 'polyder', nie musisz się martwić o rozmiar' dx'. – Jonas