Strona główna » Algorytmy » Artykuły » Szacowanie e^x
ex

Szacowanie e^x

Wstęp

Wyrażenie ex pojawia się w wielu różnych zagadnieniach matematycznych, więc nieuniknione, że może zajść potrzeba wyliczenia konkretnej wartości przy pomocy komputera. Jednym ze sposobów wyliczenia jest rozwinięcie funkcji w szereg Taylora. Wtedy przybliżoną wartość można policzyć ze wzoru:

Jest to bardzo wygodna metoda, która pozwola na dostosowanie dokładności przybliżenia poprzez wybór ilości sumowanych wyrazów, różnicy pomiędzy kolejnymi wyrazami lub aż któryś wyraz będzie mniejszy od pewnej wartości.

Liczba e w przybliżeniu 2,718281828459.

Implementacja

Prosta

Przygotujmy funkcję fwykladnicza(), która będzie przyjmowała dwa argumenty: x - wykładnik do którego ma zostać pondniesione e oraz n - ile kolejnych wyrazów rozwinięcia ma zostać zsumowanych. Przykładowy kod będzie wyglądał następująco:

  1. double fwykladnicza(double x, int n) {
  2.   double suma = 1;
  3.   for (int i = 1; i < n; i++)
  4.     suma += pow(x, i) / silnia(i);
  5.   return suma;
  6. }

(2.) Inicjalizacja wartości dla n = 0, a potem (3. - 4.) dodawanie w pętli n kolejnych wyrazów. Na koniec (5.) zostaje zwrócona wyliczona suma. W kodzie została wykorzystana funkcja silnia():

  1. int silnia(int n) {
  2.   return (n == 0) ? 1 : n*silnia(n - 1);
  3. }

Jak można zauważyć ten sposób wyliczania funkcji ex nie jest najbardziej efektywny. Za każdym razem należy wyliczyć kolejną potęge x oraz coraz wyższą wartość silni.

Efektywna

Jeśli dobrze się przyjrzeć rozwinięciu funkcji ex to przypomina ona wielomian. Wyłączając kolejne czynniki przed nawias otrzymujemy:

Zaleta takiego rozpisania powinna być oczywista. Zastosowanie schematu Hornera pozwoli na wykonanie jak najmniejszej ilości operacji arytmetycznych. Ponadto nie jest potrzebna, ani funkcja potęgowania, ani silnii co oznacza, że program nie będzie wykonywał wielokrotnie tych samych operacji.

  1. double fwykladnicza(double x, int n) {
  2.   double suma = 1;
  3.   for (int i = n - 1; i > 0; i--)
  4.     suma = 1 + x*suma / i;
  5.   return suma;
  6. }

W powyższym kodzie warto zauważyć, że zaczynamy od największego i, ponieważ najpierw wyliczamy wartość w środku całego schematu, a potem je modyfikujemy n razy.

Uwagi do kodu

Szacowanie wyrażenie poprzez określenie ile kolejnych wyrazów rozwinięcia ma zostać zsumowanych jest rozwiązaniem, ale warto dodać warunki np. że wyrazy są sumowane dopóki wyraz nie jest mniejszy niż pewna wartość. Tego typu implementacja jest do wykonania w zadaniu 1.

Testowanie funkcji

W celu przetestowania napisanych funkcji

Zadania

Zadanie 1

Napisz iteracyjne wyznaczanie funkcji ex, która wyliczając kolejny wyraz będzie pamiętała wynik poprzedniego i na jego podstawie będzie wyliczała następny wyraz. Funkcja powinna przestał sumować kolejne wyrazy rozwinięcia, gdy wyraz będzie mniejszy niż podana wartość z przez użytkownika. Przykładowo jeśli z = 0.0001 to jeśli ai < z to program zwraca wynik.