Lab 4 – wprowadzenie. Szkic M. Głowacki, L-10, PK
1
Laboratorium komputerowe 4 – wprowadzenie Pętla while: obliczanie sum szeregów i granic ciągów
1. Suma szeregu.
Zajmujemy się szeregami nieskończonymi zbieżnymi, których suma jest skończona.
Ograniczamy się do szeregów, których wyrazy zmierzają do zera.
Idea stosowanej metody polega na wyznaczania kolejnych wyrazów szeregu i dodawaniu ich.
Wyznaczamy wyrazy tak długo, jak długo są one większe co do modułu niż pewna przyjęta dokładność obliczeń. Wyrazy mniejsze (co do modułu) niż przyjęta wartość progowa pomijamy, ponieważ nie wpływają one istotnie na końcowy wynik sumy.
Przykład
Napisać funkcję, która obliczy sumę szeregu:
cosh(𝑥) = ∑ 𝑥2𝑛 (2𝑛)!
∞
𝑛=0
= 1 + 𝑥2 2! + 𝑥4
4! + 𝑥6
6! + . . .
Szereg jest zbieżny dla dowolnej wartości x.
function s = szereg_ch(x)
eps = 1e-6; % przyjęta dokładność obliczeń
n = 0; % pierwszy wyraz szeregu
a = 1;
s = a; % suma szeregu,
% na początku wpisujemy do niej
% pierwszy wyraz
while abs(a) > eps
n = n + 1;
a = x^(2*n) / factorial(2*n);
s = s + a; % dodajemy kolejne wyrazy
end
end
n = 0
Lab 4 – wprowadzenie. Szkic M. Głowacki, L-10, PK
2 Ciąg wyrazów rozpatrywanego szeregu
𝑎𝑛 = 𝑥2𝑛 (2𝑛)!
możemy zapisać w postaci rekurencyjnej:
{
𝑎0 = 1 𝑎𝑛 = 𝑥2
2𝑛(2𝑛 − 1)𝑎𝑛−1 , 𝑛 > 0
Pozwoli to istotnie zmniejszyć liczbę wykonywanych operacji arytmetycznych w każdej iteracji.
Fragment kodu w niebieskiej ramce zastępujemy poniższym:
a = x*x / ((2*n)*(2*n-1)) * a;
Proszę zwrócić uwagę, że po takiej modyfikacji nie obliczamy silni w kolejnych iteracjach.
W Command Window możemy sprawdzić działanie naszej funkcji. Wyniki możemy porównać w wartościami dokładnymi. Przykładowo:
format long
szereg_ch(2) % wynik: 3.762195687909974
cosh(2) % wynik dokładny: 3.762195691083631
szereg_ch(-1) % wynik: 1.543080632716050
cosh(-1) % wynik dokładny: 1.543080634815244
Aby poprawić dokładność wyniku możemy przyjąć mniejszą wartość 𝜀 .
Uwaga
Obliczanie sum nieskończonych i sum szeregów funkcyjnych jest szczegółowo omówione w rozdziale piątym skryptu do przedmiotu1, w podrozdziale 5.3 (Suma nieskończona), str. 69- 80 oraz w podrozdziale 5.7 (Szeregi funkcyjne), str. 92-95.
1 A. Matuszak, Programowanie dla (przyszłych) inżynierów, PK
Lab 4 – wprowadzenie. Szkic M. Głowacki, L-10, PK
3 2. Granica ciągu.
Zajmujemy się ciągami zbieżnymi. Do wyznaczenia granicy ciągu zastosujemy bardzo prostą metodę sprowadzającą się do obliczania kolejnych wyrazów tego ciągu (jeśli ciąg jest zbieżny, to jego kolejne wyrazy będą zbliżały się do granicy). Oczywiście w taki sposób nie jesteśmy w stanie uzyskać dokładnej wartości granicy – uzyskany wynik będzie obarczony pewnym błędem. Obliczenia prowadzimy do momentu, kiedy różnica pomiędzy dwoma kolejnymi wyrazami ciągu będzie niewielka. Przyjmujemy warunek stopu:
|𝑎𝑛− 𝑎𝑛−1| < 𝜀
gdzie 𝜀 jest przyjętą dokładnością obliczeń. Warunek ten można stosować dla dowolnych ciągów zbieżnych (monotonicznych i niemonotonicznych). Im mniejsza jest wartość 𝜀, tym dokładniejszy uzyskamy wynik.
Przykład
Obliczyć granicę ciągu:
𝑎𝑛 = √𝑛2+ 𝑛 − 𝑛
eps = 1e-6; % dokładność obliczeń
n = 0; % numer wyrazu bieżącego
ap = 3; % wyraz poprzedni,
% na początku możemy wpisać prawie
% dowolną wartość – należy tylko
% uważać, aby za pierwszym razem
% warunek w pętli while był spełniony
a = 0; % wyraz bieżący,
% na początku wpisujemy pierwszy wyraz
% ciągu (dla n = 0) while abs(a-ap) > eps
n = n + 1;
ap = a; % wyraz bieżący staje się
% poprzednim
a = sqrt(n*n+n)-n; % obliczamy nowy wyraz bieżący end
disp(a)
% Uzyskany wynik: 0.49965
% Wynik ścisły: 0.5
Lab 4 – wprowadzenie. Szkic M. Głowacki, L-10, PK
4 Uwaga
Obliczanie granic ciągów opisane jest w podrozdziale 5.4 (Granica ciągu), str. 80-86.