Obliczanie drugiej pochodnej funcji
Ostatnio zmodyfikowano 2015-01-10 21:42
stryku Temat założony przez niniejszego użytkownika |
Obliczanie drugiej pochodnej funcji » 2014-05-05 18:17:38 Witam mam problem z obliczeniem drugiej pochodnej funkcji. Bardziej z obmyśleniem jak to zrobić lub co robię źle. Mam coś takiego double h = 0.00000001; inline double p1f( double x, fn f ) { return( f( x + h ) - f( x - h ) ) /( 2.0 * h ); }
inline double p2f( double x, fn f ) { return( p1f( x + h, f ) - p1f( x - h, f ) ) /( 2.0 * h ); }
Nie wiem nawet czy w dobrym kierunku myślę. Wg wolframa wychodzi -4.69444... a u mnie -4.996003610813204 |
|
OSA_PL |
» 2014-05-05 21:41:14 Mnie uczyli trochę innego wzoru: f'(x) = lim_(d->0)((f(x+d)-f(x))/d) Ale tu raczej problem tkwi w zbyt mało dokadnej wartości tej delty i małej dokładności obliczeń na zmiennych zmiennoprzecinkowych, bo 0.00000001 to jednak duuuużo więcej niż powinno być. Spróbuj użyć long double, może się trochę poprawić. |
|
stryku Temat założony przez niniejszego użytkownika |
» 2014-05-06 10:45:24 Właśnie ten mój wzór ma niby lepsze własności numeryczne niż liczenie granicy. Pójdę dziś wykładowce zapytam |
|
OSA_PL |
» 2014-05-06 15:25:47 Na pewno nie, przy liczeniu granicy będziesz miał różnicę wartości tych funkcji w punktach nieskończenie blisko siebie, czyli praktycznie w jednym punkcie. Przy twoim wzorze te punkty są w odległości 0.00000002 i jeżeli pomiędzy tymi punktami nastąpi zmiana tempa wzrostu wynik twojej funkcji będzie średnią. |
|
Piastlis |
» 2015-01-10 21:42:27 Kompy z natury kiepsko liczą na liczbach rzeczywistych.Wynika to z niedokładności zapisu i implementacji funkcji. Przeliczyłem tą metodą 2 pochodną dla x= 0.1 i ze zmieniającą się deltą funkcji sin. Poprawny wynik to -0.0998334166.
Podaj liczbe: 0.1 0.10000000000000001000 -0.19850382819547036000 1 0.01000000000000000000 -0.10977738602110329000 2 0.00100000000000000000 -0.10082836233995580000 3 0.00010000000000000000 -0.09993291750043961600 4 0.00001000000000000000 -0.09984346689976196500 5 0.00000100000000000000 -0.09983680595058258600 6 0.00000010000000000000 -0.09992006973289899200 7 0.00000001000000000000 -0.27755580245714284000 8 0.00000000100000000000 13.87778800524766800000 9 0.00000000010000000000 1387.77877983818940000000 10 0.00000000001000000000 0.00000166967134562768 11 0.00000000000100000000 0.00003144186300207962 12 0.00000000000010000000 -0.00006559423143537301 13
Dla delty mniejszej niż 1E-7 wyniki nie mają sensu a najlepszy wynik to 5 cyfr znaczących:) |
|
« 1 » |