błędy zaokrąglenia Round-off_error wynikające ze skończonej precyzji obliczeń

błędy obcięcia Truncation_error wynikające z przybliżenia stosowanego w obliczeniach matematycznych

Utrata cyfr znaczących Loss of significance - znaczny wzrost bledu względnego w wyniku operacji na liczbach w skończonej precyzji

błędy mogą się akumulować w trakcie obliczeń

źle uwarunkowane zadania -> nieograniczony wzrost błędu

Błąd bezwzględny

Błąd względny

możliwe do wyznaczenia tylko gdy znamy wartość dokładną

Funkcja

#include <stdio.h> #include <math.h> #define TRUNCATION 1e-10 double factorial(int n) { int loop; double fac; for (loop = 1, fac = 1.0; loop <= n; loop++) { fac *= loop; } return fac; } int main() { int n; double x, term, sum; printf(" x exp(-x) series terms\n"); for (x = 0.0; x < 100.0; x += 10.0) { sum = 0.0; n = 0; term = 1; while (fabs(term) > TRUNCATION) { term = pow(-1, n) * (pow(x, n) / factorial(n)); sum += term; n++; } printf("%12f %12g %12g %5d\n", x, exp(-x), sum, n - 1); } return 0; }

gdzie

#include <stdio.h> #include <math.h> #define TRUNCATION 1e-10 int main() { int loop, n; double x, term, sum; printf(" x exp(-x) series terms\n"); for (loop = 0; loop <= 100; loop += 10) { x = (double)loop; sum = 1.0; term = 1; n = 1; while (fabs(term) > TRUNCATION) { term *= -x / ((double)n); sum += term; n++; } printf("%12f %12g %12g %5d\n", x, exp(-x), sum, n - 1); } }

Zauważmy, że

Wyznaczenie wartości jest możliwe z większą dokładnością bo kolejne wyrazy ciągu mają ten sam znak.

#include <stdio.h> #include <math.h> #define TRUNCATION 1e-10 int main() { int loop, n; double x, term, sum; printf(" x exp(-x) series terms\n"); for (loop = 0; loop <= 100; loop += 10) { x = (double)loop; sum = 1.0; term = 1; n = 1; while (fabs(term) > TRUNCATION) { term *= x / ((double)n); sum += term; n++; } printf("%12f %12g %12g %5d\n", x, exp(-x), 1.0 / sum, n - 1); } }

Zaimplementuj program wyznaczający wartość funkcji korzystając z rozwinięcia potęgowego w taki sposób aby zminimalizować utratę precyzji obliczeń oraz wpływ błędów zaokrągleń.

Rozwinięcie funkcji jest postaci:

Zaimplementuj obliczenia unikając wyznaczenia wartości silni w sposób bezpośredni.

Wyprowadzenie wzoru rekurencyjnego:

Dokładność wyznaczenia funkcji zanika dla wartości odległych od . Postaraj się zniwelować wpływ tego problemu.

Wskazówka: zauważ, że oraz

Użyj wartości zdefiniowanej w pliku nagłówkowym biblioteki matematycznej (M_PI) lub przyjmij

Program powinien umożliwić wprowadzenie użytkownikowi wartości rzeczywistej a następnie wyświetla następujące wartości:

wartość funkcji $f(x) wyznaczonej z rozwinięcia w szereg Taylora

wartość dokładną wyznaczoną za pomocą funkcji matematycznych z biblioteki math.h

wartość błędu bezwzględnego

wartość błędu względnego (w procentach).

Dodatkowe ćwiczenia nie podlegające ocenie.

Ćw. 1

Napisz program, który wyznacza przybliżoną wartość funkcji dla , korzystając z rozwinięcia potęgowego

Dane wejściowe wprowadzane przez użytkownika:

wartość

dokładność obliczeń

Program wypisuje następujące wartości:

przybliżona wartość funkcji z dokładnością , tj. obliczenia przerywane są gdy kolejny człon rozwinięcia potęgowego spełni

dokładną wartość funkcji wyznaczoną za pomocą funkcji z biblioteki matematycznej

wartość błędu względnego

Ćw. 2

Napisz program, który doda do siebie razy liczbę . Program dla podanej przez użytkownika liczby wypisuje wynik sumowania dla . Dla każdej wartości wypisywana jest też wartość dokładna oraz błąd względny wyniku.

Sprawdź wyniki programu uzyskane dla oraz .