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 błedu 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ą

Liczba_zmiennoprzecinkowa

Błąd względny wynikający ze skonczonej liczby bitów mantysy

float bity , double bity

Możliwy znaczny wzrost błędu przy odejmowaniu dużych bliskich sobie liczb

Napisz program znajdujący pierwiastki równania kwadratowego dla dowolnych rzeczywistych . Dla wyznaczonych pierwiastków wypisz wartości funkcji oraz aby zweryfikować poprawność uzyskanego wyniku.

Sprawdź, czy program poprawnie wyznacza miejsca zerowe równania oraz .

Przy wyznaczaniu pierwiastków tradycyjnym podejściem (z wyznaczeniem delty) może dojść do istotnego błędu zaokrągleń gdy delta jest bliska . Spróbuj zniwelować wpływ tego błędu wykorzystując Wzory Viète’a

#include <stdio.h> #include <math.h> #include <float.h> #define EPS FLT_EPSILON float wielomian(float x, float a, float b, float c) { return x*x*a + x*b + c; } int main(void) { float a, b, c, delta, x1, x2 ; printf("a="); scanf("%f",&a); printf("b="); scanf("%f",&b); printf("c="); scanf("%f",&c); printf("Wielomian w(x) = %lg x^2 + %lg x + %lg.\n", a, b, c); delta = b*b - 4.0*a*c; if ( delta < 0) { printf("Brak miejsc zerowych\n"); return 0; } if( fabs(delta) < EPS ) { x1 = -b/a/2; x2 = x1; } else { delta = sqrt(delta); x1 = -(b-delta)/(2*a); x2 = -(b+delta)/(2*a); } printf("Miejsca zerowe, x1=%lg, x2=%lg \n", x1, x2); printf("w(x1)=%lg,\nw(x2)=%lg\n", wielomian(x1, a, b, c), wielomian(x2, a, b , c)); return 0; }

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); } }

Treść zadania znajduje się w Moodle pod adresem Zadanie 2

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 .