13. Rekurencja 2.
Treści kształcenia. Ciągi zadane rekurencyjnie w informatyce. Granice ciągów, algorytmy obliczania granic (problem zbieżności). Interpretacja geometryczna (programy), obliczanie granic, punkty skupienia ciągów.
Efekty kształcenia: Student potrafi operować ciągami rekurencyjnymi, badać ich zbieżność i granice. Potrafi określić podstawowe wady i zalety takich ciągów w zastosowaniach informatycznych.
Badanie ciągów rekurencyjnych¶
Przypomnienie: ciąg to funkcja określona na liczbach naturalnych. Tzw. ‘‘ciągi skończone’’ nie powinny być traktowane jako ‘‘ciągi’’ w sensie przez nas badanym. Zamiast ‘‘liczby tworzą ciąg...’’ raczej powinno się mówić ‘‘liczby są (pierwszymi) wyrazami ciągu ...’’.
a) Od wzoru ogólnego do rekurencji.
Stosunkowo łatwo (?) można wyznaczyć wzór rekurencyjny ciągu, gdy znany jest jego wzór ogólny.
Przykład 1¶
Niech dany będzie ciąg o wyrazie ogólnym
Wyznaczyć jego wzór rekurencyjny.
Rozwiązanie.
Wyznaczmy najpierw pierwszy wyraz tego ciągu. Łatwo sprawdzić, że .
Wiemy także, że . Stąd możemy policzyć różnicę wyrazów następnego i poprzedniego:
stąd zaś wynika, że . Ostatecznie więc zapisujemy wzór rekurencyjny ciągu w oparciu o jego pierwszy wyraz:
Przykład 2¶
Rozpatrzmy ciąg
Wyznaczyć jego wzór rekurencyjny.
Rozwiązanie.
Rozpoczniemy od pierwszego wyrazu: . Zauważmy, że . Teraz badamy wyraz :
Przykład 3 (samodzielne)¶
Rozpatrzmy ciąg
Wyznaczyć jego wzór rekurencyjny.
Przykład 4¶
Rozpatrzmy ciąg Lucasa
Wyznaczymy jego wzór rekurencyjny.
Rozwiązanie.
Pierwsze wyrazy to , . Mamy
Czyli wzór rekurencyjny to:
b) Od rekurencji do wzoru ogólnego.
‘‘Algorytmy rekurencyjne są szczególnie odpowiednie, gdy podstawowy problem lub dane, które mają być przetwarzane, są zdefiniowane w kategoriach rekurencyjnych. Nie oznacza to jednak, że takie rekurencyjne definicje gwarantują najlepszą efektywność algorytmu rekurencyjnego w rozwiązaniu problemu. Takie niewłaściwe przykłady były główną przyczyną powstania pewnej niechęci do stosowania rekurencji w programowaniu oraz utożsamiania rekurencji z nieefektywnością [N. Wirth].’’
Są więc sytuacje, gdy warto rozważyć przejście od rekurencji do wzoru ogólnego. A teraz dość trudny, ale klasyczny przykład.
Ciąg Fibonacciego. Wzór Bineta¶
A teraz problem uzyskiwania wzoru ogólnego na przykładzie ciągu Fibonacciego: 0, 1, 1, 2, 3, 5, 8, 13, 21,…
Wzór Bineta to jawny wzór na -ty wyraz ciągu Fibonacciego podany w 1843 r. przez Jacques Philippe Marie Bineta możemy otrzymać, korzystając z pewnej formalnej metody (tzw. funkcji tworzących). Od razu uprzedzimy - podamy też później inną, efektywną metodę ogólną dla rekurencji liniowych, a ten ciąg zbadamy ponownie tą metodą (nie jest jednak niezbędna - jak widać).
Niech dany będzie ciąg Fibonacciego (przesunięty o jeden wyraz względem powyższego, czyli ):
def F(n):
F = []
F.append(0)
F.append(1)
for i in range(2,n+1):
F.append(F[i-1]+F[i-2])
return F
F(10)[0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]Ciąg Fibonacciego jest ciekawym obiektem i ma interesujące zastosowania - np.
,,Miniatury Matematyczne’’ tom 43, Ł. Mentzen, M.K. Mentzen, ,,Ciąg Fibonacciego’',
czy tom 31 ‘‘MM" - A. Sendlewski ,,Zliczanie rekurencyjne’’.
Tworzymy funkcję :
Podstawiając otrzymujemy:
W szczególności:
Ponieważ wielomian ma dwa pierwiastki
(proszę sprawdzić!),
to wyrażenie można przedstawić w postaci (rozkład na ułamki proste - proszę powtórzyć!):
gdzie:
Wówczas:
a stąd:
Dla ciągu , (czyli ) mamy dla , a więc:
Mamy więc wyraz ogólny ciągu Fibonacciego. A właściwie dlaczego taka metoda? Pokażemy to także w nieco bardziej ogólnym przypadku: jak to zrobić w przypadku rekurencji liniowej.
Ale najpierw inny problem.
Zbieżność ciągu rekurencyjnego¶
Skoro klasyczną metodą definiowania ciągów jest rekurencja (zwłaszcza w informatyce!): definiujemy kolejne wyrazy w oparciu o znajomość poprzednich (jak już wiemy: niekoniecznie jednego wyrazu). To - niestety - prowadzi do poważnego problemu: jak zbadać zbieżność ciągu zadanego rekurencyjnie, dla którego nie znamy jego wzoru ogólnego?
I tu widoczna jest przydatność twierdzeń o ciągach zbieżnych. Podstawowe narzędzie to twierdzenie o ciągach monotonicznych i ograniczonych. Przypomnijmy kluczowe własności w badaniu zbieżności ciągów rekurencyjnych:
Ciąg nazywamy ograniczonym, gdy
W przypadku gdy , ciąg nazywamy ograniczonym z góry, natomiast w przypadku gdy , ciąg nazywamy ograniczonym z dołu.
Ciąg nazywamy monotonicznym, jeżeli spełnia jeden z następujących warunków:
O ciągach spełniających pierwsze dwa warunki mówimy, że są ściśle monotoniczne. Warto zauważyć, że zakresy pojęć ciągów monotonicznych oraz ograniczonych przecinają się, tzn. istnieją ciągi, które są ograniczone, ciągi, które są monotoniczne oraz takie ciągi, które są równocześnie ograniczone i monotoniczne.
Zadania¶
Sprawdź, czy dane ciągi są monotoniczne:
(a)
(b)
(c)
Twierdzenie. Ciąg monotoniczny i ograniczony jest zbieżny.
(a) Jeżeli ciąg jest niemalejący i ograniczony z góry, to jest zbieżny i wówczas
(b) Jeżeli ciąg jest nierosnący i ograniczony z dołu, to jest zbieżny i wówczas
Obliczanie granic ciągów rekurencyjnych¶
Jeżeli ciąg rekurencyjny jest zbieżny (a mieliśmy różne przykłady), to kolejne pytanie brzmi: jak obliczyć jego granicę?
Przykład 1¶
Prosty przykład ciągu rekurencyjnego do zbadania:
Najpierw problem zbieżności tego ciągu: wystarczy wykazać, że jest monotoniczny i ograniczony. Przede wszystkim widoczne jest, że wyrazy są nieujemne i mniejsze niż 1. Ta ostatnia uwaga wynika z faktu, że oraz że suma liczb ( oraz ) mniejszych niż 1 jest mniejsza niż 2, czyli , a więc . Formalny dowód: indukcja matematyczna!
Poza tym ciąg jest niemalejący (, a od drugiego wyrazu rosnący) i ten dowód też wygodnie przeprowadzić indukcją matematyczną...
Warto dodać, że nieco później (na analizie matematycznej) poznamy też inne (prostsze) metody badania monotoniczności takich ciągów.
I teraz kluczowe: jeżeli ciąg jest zbieżny (powiedzmy do granicy ), to też jest zbieżny do (to własność ciągów zbieżnych) i stąd przechodząc obustronnie do granicy z (tak formalnie to zastosowanie twierdzenia o 3 ciągach):
uzyskujemy:
a więc , czyli (pierwiastek podwójny).
Przykład 2. Określmy ciąg wzorem rekurencyjnym:
Sprawdzimy, czy ten ciąg jest zbieżny i obliczyć jego granicę.
Rozwiązanie. Symulacja komputerowa sugeruje zbieżność, ale - to nie dowód...
x = RealField(25)(1)
for i in range(0,21):
print("%s %s"%(i,x))
x = sqrt(2+x)0 1.000000
1 1.732051
2 1.931852
3 1.982890
4 1.995718
5 1.998929
6 1.999732
7 1.999933
8 1.999983
9 1.999996
10 1.999999
11 2.000000
12 2.000000
13 2.000000
14 2.000000
15 2.000000
16 2.000000
17 2.000000
18 2.000000
19 2.000000
20 2.000000
Skorzystamy teraz z twierdzenia o ciągach monotonicznych i ograniczonych. Ciąg ten jest ograniczony z góry przez 2 (co można łatwo wykazać metodą indukcji zupełnej) oraz rosnący, gdyż
(wykorzystaliśmy tu fakt, że ). Można też inaczej: skoro wiemy o ograniczoności z góry wyrazów ciągu przez 2, to
czyli
Jako ciąg monotoniczny i ograniczony jest więc zbieżny. Jego granicę oznaczmy przez .
Uwaga: skoro wiemy, że jest zbieżny, to możemy już zrobić symulację na komputerze.
def g(n):
if n==1:
return 1
else:
return sqrt(2+g(n-1))
list_plot([g(k) for k in range(2,36)],figsize=[3,3])
Oczywiście (a właściwie dlaczego??) ciąg jest również zbieżny do i stąd:
Mamy więc kolejno: , , , czyli
oraz , który odpada, gdyż .
Ostatnie równanie ma dwa pierwiastki. Ostatecznie .
Jest to zgodne z naszymi oczekiwaniami po wykonaniu symulacji.
Podkreślmy tu jeszcze konieczność wykazania istnienia granicy ciągu, zanim zaczynamy ją obliczać.
Przykład 3¶
Ciąg rekurencyjny oczywiście nie musi być zbieżny (por. wcześniejszy przykład o pozornej zbieżności). Ale nawet niezbyt skomplikowane i ograniczone ciągi rekurencyjne nie muszą być zbieżne.
Określmy ciąg wzorem rekurencyjnym:
Sprawdzimy, czy ten ciąg jest zbieżny. Rozpoczniemy od wyliczenia kilku wyrazów ciągu: , , , , ... Ciąg nie jest monotoniczny (choć ograniczony), a można wykazać (indukcja!)
Ciąg rekurencyjny nie jest zbieżny (ma 2 punkty skupienia).
A teraz dobry moment, aby zauważyć, że zbieżność ciągu rekurencyjnego może być zależna od początkowych wyrazów! Pozostawmy bez zmian wzór rekurencyjny z tego zadania, ale zmieńmy pierwszy wyraz:
Tym razem mamy więc: , , , , ... Ciąg jest stały! A więc zbieżny.
Przykład 4¶
Niech , . Definiujemy
Sprawdzić, że granice obu ciągów są równe i wynoszą .
Rozwiązanie. Przede wszystkim trzeba zauważyć, że to ciągi średnich: jest średnią arytmetyczną liczb i , a ich średnią harmoniczną. Załóżmy, że (przypadek jest analogiczny i pozostawiamy go do samodzielnego sprawdzenia).
Przypomnijmy nierówność Cauchy’ego pomiędzy średnimi
czyli
Mamy więc () - pamiętajmy, że średnia liczb zawsze ‘‘leży pomiędzy nimi’’:
i dalej
Ciąg jest więc rosnący i ograniczony, a jest malejący i ograniczony. Oba są więc zbieżne, powiedzmy do i , odpowiednio. Oczywiście . Pokażemy (dowód nie wprost!), że . Niech i przypuśćmy, że . Z definicji granicy: weźmy odpowiednio duże tak, aby oraz . Ale wtedy , czyli - sprzeczność.
Przechodzimy do granicy w nierówności pomiędzy średnimi (i wykorzystamy fakt, że o ile tylko gdy ).
Teraz wykorzystamy twierdzenie Cauchy’ego o średnich. W powyższej nierówności przy zachodzi równość, czyli
A ponieważ , to
Oba ciągi są zbieżne do . To ważny algorytm obliczania pierwiastka (liczby na ogół niewymiernej) na komputerze. Ale - będzie ich więcej...
Przykład 5¶
Wracamy do sytuacji z Przykładu (A). Mamy wtedy
i wzór na obwód wielokąta to
Z samej konstrukcji ( to długość boku wielokąta) wiemy oczywiście, że (rozpoczynamy od kwadratu). Co więcej w każdym kroku dokonujemy podziału, czyli . A więc z samej konstrukcji wynika, że ciąg jest malejący.
A teraz pytanie otwarte: jak wykazać, że ciąg jest rosnący i ograniczony z góry?
Przykład 6 (samodzielnie)¶
Dany jest ciąg:
a) wyznaczyć wzór rekurencyjny,
b) sprawdzić zbieżność ciągu,
c) obliczyć granicę - o ile istnieje,
d) dodatkowe: znaleźć wzór ogólny!
Zadania domowe (?):
(ostatnia relacja to obliczanie rekurencyjne pewnych całek - o czym później, tylko należy obliczyć wstępnie).
Zadanie (Z1)¶
Okres połowicznego rozpadu pierwiastka to okres, po którym z danej ilości pierwiastka pozostaje jego połowa. Dla radu () wynosi on około 1600 lat. Ile lat co najmniej trzeba czekać, aby z radu zostało mniej niż ?
Zadanie (Z2)¶
Bezpośrednio za pomocą twierdzenia Cauchy’ego o średnich oraz twierdzenia o 3 ciągach wykaż, że Czy tak samo można zbadać granicę ?