Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

14. Rekurencja 3. Zastosowania.

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 ciągów rekurencyjnych, postać rekurencyjna a ogólna.

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.

Ciągi rekurencyjne a obliczanie funkcji pierwiastek a\sqrt{a}.

Metoda naiwna (jak to było w szkole...) jest zła: mamy zgadnąć (a komputer w tym nie pomoże...) kwadrat jak największej liczby nie przekraczającej aa. To działa ‘‘w pamięci’’ np. dla 10\sqrt{10}, znajdziemy 32=9<103^2 = 9 < 10, czyli 3<103 < \sqrt{10} itp. Ale już np. dla

125624726\sqrt{125624726}

nie jest to dobry algorytm, nie mówiąc np. o obliczeniu tego pierwiastka:

1213,86428997.\sqrt{1213,86428997}.

A na komputerze:

[1.0, 1.414213562373095, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.82842712474619, 3.0]

Lepszym algorytmem było omawiane ujęcie poprzez twierdzenie Cauchy’ego o średnich. Ale to nadal dalekie od optymalności.

Kolejna metoda (rekurencyjna) będzie bazowała na poprzedniej, ale z wykorzystaniem tylko jednego ciągu. Metoda babilońska (Herona) (bazująca na geometrii - pierwiastek jako bok kwadratu o polu aa, rozpoczynamy od prostokąta i zmniejszamy różnicę pomiędzy długościami boków korzystając ze średniej arytmetycznej) a>0a > 0:

xn+1=12(xn+axn) , x1=a2.x_{n+1} = \frac{1}{2} \left( x_n + \frac{a}{x_n} \right) \ , \ x_1 = \frac{a}{2} .

Jak widać: wyraz xn+1x_{n+1} jest tu średnią arytmetyczną liczb xnx_n oraz axn\frac{a}{x_n}.

W pętli while:

[1.0, 1.414213562373095, 1.7320508075688772, 2.0, 2.23606797749979, 2.449489742783178, 2.6457513110645907, 2.82842712474619, 3.0]

Albo w pętli for:

[1.0, 1.4166666666666665, 1.7321428571428572, 2.0000000929222947, 2.236067977499978, 2.449489742783178, 2.6457513110645907, 2.82842712474619, 3.0]

A to w Python (interaktywne):

440.218127750323
Podaj pierwsza liczba: 154
Podaj druga liczba: 4579
Pierwiastek z pierwszej liczby to: 12.4096736459909
Pierwiastek z drugiej liczby to: 67.6683086828687

Dla porównania predefiniowana funkcja z modułu math Pythona (dla zainteresowanych - poszukać, jakim algorytmem jest obliczana). Wartości do porównania...

67.66830868286867

Zadanie

Sprawdzić, że ten ciąg jest zbieżny do a\sqrt{a}. A jak być może pamiętamy: to (na ogół) liczba niewymierna, a więc wymaga obliczeń na komputerze. A to, czego jeszcze nie mówiliśmy: funkcja pierwiastkowa sprawi pewne problemy obliczeniowe i warto opracować specjalne algorytmy - zwłaszcza za pomocą ciągów rekurencyjnych!

Rozwiązanie. Zbadamy oczywiście ograniczoność i monotoniczność tego ciągu. Zastanowimy się, skąd ten algorytm. To proste: bierzemy prostokąt o polu aa i bokach xnx_n oraz axn\frac{a}{x_n}. Algorytm zakłada dążenie do uzyskania kwadratu, a wówczas jego bok ma długość a\sqrt{a}.

.... rysunek - może być na tablicy ....

Mamy więc dwie liczby: xnx_n i axn \frac{a}{x_n}, a (jak już przypominaliśmy) ich średnia arytmetyczna, czyli xn+1x_{n+1} jest ‘‘pomiędzy nimi’’. Rozpatrzmy przypadek x1<ax1x_1 < \frac{a}{x_1} (odwrotny przypadek jest analogiczny - samodzielnie!). Aby uniknąć rozważań co do porównania wielkości xnx_n i axn\frac{a}{x_n} w kolejnych krokach będziemy zawsze przyjmować za xnx_{n} mniejszą z tych liczb (tj. obliczając powyższym wzorem xn+1x_{n+1} wyznaczymy też axn+1\frac{a}{x_{n+1}} i do dalszych obliczeń zakładać będziemy, że xn+1x_{n+1} oznacza mniejszą z nich (czyli zawsze krótszy bok prostokąta)). Formalnie: xn+1=min⁡{12(xn+axn),a12(xn+axn)}x_{n+1} = \min{ \{ \frac{1}{2}(x_n + \frac{a}{x_n}) , \frac{a}{\frac{1}{2}(x_n + \frac{a}{x_n}) }\} }. Wtedy

x1≤x2≤x3≤…≤ax3≤ax2≤ax1,x_1 \leq x_2 \leq x_3 \leq \ldots \leq \frac{a}{x_3} \leq \frac{a}{x_2} \leq \frac{a}{x_1} ,

czyli ciąg (xn)(x_n) jest rosnący i ograniczony z góry. Jest więc zbieżny (oznaczmy tę granicę przez xx).

Tak jak we wcześniejszych przykładach przechodzimy do granicy z n→∞n \to \infty we wzorze rekurencyjnym i uzyskujemy

x=12(x+ax)x = \frac{1}{2} \left( x + \frac{a}{x} \right)

Rozwiązujemy równanie uzyskując

x2=a⇒x=a.x^2 = a \quad \Rightarrow \quad x = \sqrt{a} .

Wyjaśnienie źródeł pomysłu i komentarz do drugiego przypadku - pozostawionego do samodzielnego uzupełnienia:

xn≈a  ⇒  axn≈aa=a,x_n\approx \sqrt{a} \;\Rightarrow \; \frac{a}{x_n}\approx \frac{a}{\sqrt{a}}=\sqrt{a},
xn>a  ⇒  axn<aa=a,x_n>\sqrt{a} \;\Rightarrow \; \frac{a}{x_n} < \frac{a}{\sqrt{a}}=\sqrt{a},
xn<a  ⇒  axn>aa=a,x_n<\sqrt{a} \;\Rightarrow \; \frac{a}{x_n} > \frac{a}{\sqrt{a}}=\sqrt{a},

czyli w każdym przypadku

∣12 (xn+axn)−a∣\left|\frac{1}{2}\,\left(x_n+\frac{a}{x_n}\right) - \sqrt{a}\right|

jest mniejsze albo od ∣xn−a∣\left|x_n - \sqrt{a}\right|, albo od ∣axn−a∣\left|\frac{a}{x_n} - \sqrt{a}\right|.

Jeśli xnx_n leży blisko a\sqrt{a}, to axn\frac{a}{x_n} też leży blisko a\sqrt{a}; przy tym jeśli xnx_n leży po jednej stronie a\sqrt{a}, to axn\frac{a}{x_n} leży po drugiej stronie a\sqrt{a}. Jedna z liczb xnx_n, axn\frac{a}{x_n} znajduje się bliżej a\sqrt{a} niż druga, ale niezależnie od tego, która, ich średnia 12 (xn+axn)\frac{1}{2}\,\left(x_n+\frac{a}{x_n}\right) znajdzie się bliżej a\sqrt{a} od obu z nich.

Inne algorytmy

A jak programy obliczają wartości funkcji x\sqrt{x}?

Czy jest ‘‘najlepszy algorytm’’? Dla zainteresowanych przegląd algorytmów dla funkcji f(x)=xf(x) = \sqrt{x} można znaleźć tu: przegląd kilkunastu algorytmów

Może ograniczymy się do jednego algorytmu rekurencyjnego pozwalającego obliczać pierwiastki (tak naprawdę: ich przybliżone wartości) - ale co ważne - tylko za pomocą mnożenia i dodawania ({N. Wirth}):

an=an−1⋅(1+12cn−1),cn=cn−12⋅14⋅(3+cn−1) ,a_n = a_{n-1} \cdot \left( 1 + \frac{1}{2}c_{n-1} \right) \qquad , \qquad c_n = c_{n-1}^2 \cdot \frac{1}{4} \cdot (3 + c_{n-1} ) \ ,

gdzie a0=x,c0=1−x,x∈(0,2)a_0 = x, c_0 = 1-x , x \in (0,2).

Pozostawimy zbadanie granicy w tym zadaniu do samodzielnego rozwiązania...

Wskazówka.

Można pokazać, że an=x⋅(1−cn)a_n = \sqrt{x \cdot (1 - c_n)}, ∣c0∣<1|c_0| < 1 i cn→0c_n \to 0, gdy n→∞n \to \infty, i dalej podobnie jak w przypadku 1x\frac{1}{x}.

A może rekurencja dla innych typowych operacji w informatyce? {N. Wirth}

Obliczanie odwrotności liczby 1x\frac{1}{x} dla rzeczywistych liczb x∈(0,2)x \in (0,2) (jedynie poprzez mnożenie i dodawanie) i za pomocą rekurencji...

Dane: a0=1a_0 = 1, c0=1−xc_0 = 1 - x (x≠0x \not= 0). Definiujemy dwa ciągi rekurencyjne:

an=an−1⋅(1+cn−1)a_n = a_{n-1} \cdot (1 + c_{n-1})
cn=cn−1⋅cn−1c_n = c_{n-1} \cdot c_{n-1}

Wtedy (dlaczego?)

lim⁡n→∞an=1x\lim_{n \to \infty} a_n = \frac{1}{x}

Ale najpierw (!!) wypadałoby sprawdzić, że te ciągi są zbieżne. Proszę sprawdzić te fakty.

Rozwiązanie. Po pierwsze zauważmy, że ∣c0∣<1|c_0| < 1 oraz, że c1=c02c_1 = c_0^2, c2=c12=c04c_2 = c_1^2 = c_0^{4} i ogólnie

cn=c02n.c_n = c_0^{2^n} .

Ponieważ ∣c0∣<1|c_0| < 1, to ∣cn∣=∣c0∣2n≤∣c0∣n|c_n| = |c_0|^{2^n} \leq |c_0|^n, w szczególności lim⁡n→∞cn=0\lim_{n \to \infty} c_n = 0. Teraz zajmiemy się ciągem (an)(a_n):

an=an−1⋅(1+cn−1)=an−2⋅(1+cn−2)⋅(1+cn−1)=...=(1+cn−1)⋅(1+cn−2)⋅...⋅(1+c1)⋅(1+c0).a_n = a_{n-1} \cdot (1 + c_{n-1}) = a_{n-2} \cdot (1 + c_{n-2}) \cdot (1 + c_{n-1}) = ... = (1 + c_{n-1}) \cdot (1 + c_{n-2}) \cdot ... \cdot (1 + c_{1}) \cdot (1 + c_{0}) .

Teraz zauważmy, że dla k=1,2,…,nk = 1,2, \ldots , n mamy (bo 1−ck=1−ck−12=(1−ck−1)⋅(1+ck−1)1 - c_k = 1 - c_{k-1}^2 = (1 - c_{k-1}) \cdot (1 + c_{k-1}))

1+ck−11−ck=11−ck−1.\frac{1+ c_{k-1}}{1- c_k} = \frac{1}{1-c_{k-1}} .

Podstawiając do wzoru i pamiętając, że c0=1−xc_0 = 1-x uzyskujemy:

an=1−cnx.a_n = \frac{1 - c_n}{x} .

A teraz można skorzystać z własności ciągów zbieżnych i przejść obustronnie do granicy (pamiętając, że zbieżność (an)(a_n) można też sprawdzić bezpośrednio):

a=1x.a = \frac{1}{x} .

Przykład (BIS)

A teraz wrócimy do wspominanej wcześniej (zajęcia z liczb rzeczywistych) metody bisekcji rozwiązywania równań nieliniowych

f(x)=0.f(x) = 0 .

Tam była taka metoda ‘‘wspomagana graficznie’’, ale chodzi nam o algorytm, którym posłuży się sam program, bez oceny przez jego twórcę. Definiujemy dwa ciągi rekurencyjne: x1=ax_1 = a, y1=by_1 = b oraz

xn+1=xngdyf(xn)⋅f(xn+yn2)<0x_{n+1} = x_n \quad gdy \quad f(x_n) \cdot f\left(\frac{x_n + y_n}{2}\right) < 0
xn+1=xn+yn2gdyf(xn)⋅f(xn+yn2)≥0x_{n+1} = \frac{x_n + y_n}{2} \quad gdy \quad f(x_n) \cdot f\left(\frac{x_n + y_n}{2}\right) \geq 0
yn+1=xn+yn2gdyf(xn)⋅f(xn+yn2)<0y_{n+1} = \frac{x_n + y_n}{2} \quad gdy \quad f(x_n) \cdot f\left(\frac{x_n + y_n}{2}\right) < 0
yn+1=yngdyf(xn)⋅f(xn+yn2)≥0.y_{n+1} = y_n \quad gdy \quad f(x_n) \cdot f\left(\frac{x_n + y_n}{2}\right) \geq 0 .

A teraz najciekawsze (dla matematyka, a najważniejsze dla informatyka): to, czy te ciągi są zbieżne i to do wspólnej granicy będącej miejscem zerowym funkcji ff w przedziale [a,b][a,b], zależy od własności funkcji ff. Czyli: konkretny algorytm metody ma swoje założenia - jak każde z twierdzeń...

Dokładniej da się to wprowadzić albo na metodach numerycznych, albo zajęciach z analizy matematycznej.

Rekurencja - kolejne zadanie

Dane są ciągi rekurencyjne (an)(a_n), (bn)(b_n) i (sn)(s_n):

an+1=(an)2  o ile (an)2<2  oraz  an+1=12an2  o ile  (an)2≥2,a_{n+1} = (a_n)^2 \ \mbox{ o ile } (a_{n})^2 < 2 \ \mbox{ oraz } \ a_{n+1} = \frac{1}{2}a_n^2 \ \mbox{ o ile } \ (a_n)^2 \geq 2 ,
bn+1=bn2,b_{n+1} = \frac{b_n}{2} ,
 sn+1=sn  o ile  (an)2<2  oraz  sn+1=sn+bn+1  o ile  (an)2≥2.\ s_{n+1} = s_n\ \mbox{ o ile } \ (a_{n})^2 < 2 \ \mbox{ oraz } \ s_{n+1} = s_n + b_{n+1} \ \mbox{ o ile } \ (a_n)^2 \geq 2 .

Pytania

Czy istnieje i jaka jest granica ciągu (sn)(s_n)?

Odp. zbieżne do log⁡2x\log_2{x} (dla x∈[1,2]x \in [1,2])

Kiedy istnieje (dla jakich wartości początkowych: rozpocznij od a0=x>0a_0 = x > 0, b0=1b_0 = 1 i s0=0s_0 = 0)? Jak zakończyć obliczenia typu ‘‘while do’’ (warunek stopu)?

Kolejny ciąg określamy rekurencyjnie:

c1=a2,cn+1=12⋅(a+cn2),c_1 = \frac{a}{2} \quad , \quad c_{n+1} = \frac{1}{2} \cdot ( a + c_n^2 ) ,

przy czym 0<a<10 < a < 1. Wykazać, że (cn)(c_n) jest ograniczony i cn<1−1−ac_n < 1 - \sqrt{1 - a} oraz, że jest zbieżny. Obliczyć jego granicę.

Czym różni się metoda jego rozwiązywania od tej z poprzedniego zadania?

Rekurencja liniowa: od wzoru rekurencyjnego do ogólnego

Podamy, jak sobie radzić w 2 najprostszych (ale typowych) przypadkach. Dotyczyć to będzie rekurencji liniowej I i II rzędu i wyjaśnimy też, na czym polega trudność dla wyższych rzędów (dla przypadku ogólnego rekurencji liniowej). A dlaczego takie rekurencje? Z pewnością wszyscy poznają (lub poznali) algorytmy sortowania, złożoność czasowa takich algorytmów wyraża się w naturalny sposób rekurencjami liniowymi.

Zbadamy rekurencje o stałych współczynnikach.

Rekurencja liniowa I rzędu. Dotyczy to przypadku

an+1=k⋅an+s ,a1=aa_{n+1} = k\cdot a_n + s \ , a_1 = a

dla pewnych stałych kk i ss. Zobaczmy pierwsze wyrazy

a1=aa_1 = a
a2=k⋅a1+s=ka+sa_2 = k \cdot a_1 + s = ka + s
a3=k⋅a2+s=k2a+ks+sa_3 = k \cdot a_2 + s = k^2 a + ks + s
a4=k⋅a3+s=k3a+k2s+ks+sa_4 = k \cdot a_3 + s = k^3 a + k^2 s + ks + s
a5=k⋅a4+s=k4a+k3s+k2s+ks+sa_5 = k \cdot a_4 +s = k^4 a + k^3 s + k^2 s + ks + s
…\ldots

Wygląda to na zasadę

an=kn−1a+s⋅(kn−2+kn−3+...+k+1)=kn−1a+s⋅kn−1−1k−1.a_n = k^{n-1} a + s \cdot (k^{n-2} + k^{n-3} + ... + k + 1) = k^{n-1} a + s \cdot \frac{k^{n-1} - 1}{k - 1} .

Warto powtórzyć zasadę indukcji zupełnej - dowód prawdziwości powyższego wzoru proszę przeprowadzić samodzielnie poprzez indukcję matematyczną... Udało się więc zamienić wzór rekurencyjny na ogólny.

Kolejny ważny przypadek (dwa ciągi rekurencyjne - już takie napotkaliśmy):

xn+1=k⋅xn+yn .x_{n+1} = k \cdot x_n + y_n \ .

Stosujemy ponownie rozumowanie krok po kroku

x1=k x0+y0,x2=k x1+y1=k⋅(k x0+y0)+y1=k2 x0+k y0+y1,x3=k x2+y2=k⋅(k2 x0+k y0+y1)+y2=k3 x0+k2 y0+k y1+y2,...................................................xn=k xn−1+yn−1=k⋅(kn−1 x0+∑i=0n−2kn−2−i⋅yi)+yn−1=kn x0+∑i=0n−1kn−1−i⋅yi.\begin{array}{l} x_1 = k \,x_0 + y_0,\\ x_2 = k \,x_1 + y_1 = k \cdot(k \,x_0+y_0) + y_1 = {k}^2\,x_0 + k \,y_0+y_1,\\ x_3 = k \,x_2 + y_2 = k \cdot(k^2\,x_0+k \,y_0+y_1) +y_2 = {k}^3\,x_0 + k^2\,y_0+k \,y_1+y_2,\\ ................................................... \\ x_n = k \,x_{n-1} + y_{n-1} = k \cdot \left(k^{n-1}\,x_0 + \sum\limits_{i=0}^{n-2} k^{n-2-i}\cdot y_i\right) + y_{n-1} = {k}^n\,x_0 + \sum\limits_{i=0}^{n-1} k^{n-1-i}\cdot y_i. \end{array}

Oczywiście jako szczególny przypadek yn=sy_n = s mamy nasz pierwszy wzór.

Uwaga: działanie nieskończone. Procedury z ciągami rekurencyjnymi - niekoniecznie liniowymi - będą napotykane w trudniejszych problemach, tu jeszcze za wcześnie na wszystkie przypadki. Warto zwrócić uwagę na:

(a) Ułamki łańcuchowe

Rn=[a0;a1,a2,…,an−2,an−1,an]R_n = [a_0;a_1,a_2,\ldots,a_{n-2},a_{n-1},a_n]

nn-ty redukt ułamka łańcuchowego

[a0;a1,a2,a3,…]=a0+1a1+1a2+1a3+⋱,[a_0; a_1, a_2, a_3, \ldots] = a_0 + \cfrac{1}{a_1+\cfrac{1}{a_2+\cfrac{1}{a_3+{\ddots}}}},

zakładamy przy tym an>0a_n >0. Wartością ułamka łańcuchowego nazywamy granicę

lim⁡n→∞Rn.\lim_{n\to\infty} R_n .

Ciekawy jest przypadek [a0;a1,a2,…][a_0; a_1, a_2, \ldots], gdy liczby ana_n są całkowite. Liczby wymierne posiadają skończone rozwinięcie w taki ułamek łańcuchowy. Liczby niewymierne mogą mieć rozwinięcia okresowe.

Ułamek 25348\frac{253}{48} zapisujemy w postaci ułamka łańcuchowego następująco:

25348=5+1348=5+14813=5+13+913=5+13+1139=5+13+11+49=5+13+11+194=5+13+11+12+14 .\frac{253}{48} = 5 + \cfrac{13}{48} = 5 + \cfrac{1}{\frac{48}{13}} = 5 + \cfrac{1}{3 + \cfrac{9}{13}} = 5 + \cfrac{1}{3 + \cfrac{1}{\frac{13}{9}}} = 5 + \cfrac{1}{3 + \cfrac{1}{1 + \cfrac{4}{9}}} = 5 + \cfrac{1}{3 + \cfrac{1}{1 + \cfrac{1}{\frac{9}{4}}}} = 5 + \cfrac{1}{3 + \cfrac{1}{1 + \cfrac{1}{2 + \cfrac{1}{4}}}} \, .

Ćwiczenie. Rozwinąć w ułamek łańcuchowy liczbę 113\frac{11}{3}.

(b) Nieskończone pierwiastki.

Wzór

xn+1=a+xn,x_{n+1} = \sqrt{a+x_n},

gdzie x0=0,a>0x_0=0 , a > 0 - ustalona liczba, opisuje nn-te przybliżenie pierwiastka nieskończonego

a+a+a+…  .\sqrt{a+\sqrt{a+\sqrt{a+\ldots}\,}\,} .

Analogicznie

xn+1=a⋅xnp,x_{n+1} = \sqrt[p]{a\cdot x_n},

gdzie x0=1,a>0,p>1x_0=1 ,a > 0 , p>1 - zadane liczby, opisuje nn-te przybliżenie pierwiastka

a⋅a⋅a⋅…p p p.\sqrt[p]{a\cdot\sqrt[p]{a\cdot\sqrt[p]{a\cdot \ldots}\,}\,}.

Zadania (samodzielne)

(1) Znaleźć wzór ogólny dla ciągu rekurencyjnego

a1=3 , an+1=3⋅an−1 .a_1 = 3 \ , \ a_{n+1} = 3\cdot a_n - 1 \ .

Oczywiście: nie posługujemy się wzorem ogólnym, tylko ćwiczymy całą procedurę!

(2) Rozwiązać równania rekurencyjne:

(a) xn+1=xn+15n+1,(b) xn+1=xn+2n,(c) xn+1=xn+(−1)n,(d) xn+1=xn+2n+1.\begin{array}{ll} % \mbox{(a)}\odst x_{n+1}=x_n + \frac{1}{(n+1)(n+2)},& \mbox{(a)}\ x_{n+1}=x_n + \frac{1}{5^{n+1}},& % \mbox{(c)}\odst x_{n+1}=x_n + 6^{n+1},\\ \mbox{(b)}\ x_{n+1}=x_n + 2n,\\ \mbox{(c)}\ x_{n+1}=x_n+(-1)^n,& \mbox{(d)}\ x_{n+1}=x_n + 2^{n+1}. % \mbox{(f)}\odst x_{n+1}=x_n+\frac{1}{(n+1)(n+2)(n+3)}.\\ \end{array}

Rekurencja liniowa II rzędu

Dotyczy to przypadku

an+2=k⋅an+1+m⋅an , a0=A , a1=B (n=0,1,2...)a_{n+2} = k\cdot a_{n+1} + m\cdot a_n \ , \ a_0 = A \ , \ a_1 = B \ (n = 0,1,2...)

dla pewnych stałych k,mk, m. Podamy tylko jedną z metod - zainteresowani znajdą inne. Teraz czeka nas zdecydowanie więcej pracy, ale za to mamy dobry algorytm. Będziemy szukali rozwiązań postaci an=xna_n = x^n (nie będziemy tego uzasadniali - pozostawimy to zainteresowanym).

Rozpoczniemy (bez uzasadniania...) od poszukiwań ana_n w postaci potęgi:

an=qn.a_n = q^n .

Przy przyjęciu ustalonych 2 wyrazów początkowych (a wiemy, że to istotne)

a0=A , a1=Ba_0 = A \ , \ a_1 = B

i po podstawieniu do równania uzyskujemy

q2⋅qn=k⋅q⋅qn+m⋅qn ⇒ q2=k⋅q+mq^2\cdot q^n = k \cdot q \cdot q^n + m \cdot q^n \ \Rightarrow \ q^2 = k \cdot q + m

i te ostatnie równanie nazwiemy równaniem charakterystycznym. To trójmian kwadratowy, więc ma 2 pierwiastki (niestety - być może zespolone, do czego wrócimy po wprowadzeniu liczb zespolonych) i rozpatrzymy te 3 przypadki:

a) 2 pierwiastki rzeczywiste,

b) 1 pierwiastek rzeczywisty podwójny,

c) dwa pierwiastki zespolone (sprzężone).

ad a) Skoro mamy 2 pierwiastki równania charakterystycznego α\alpha i β\beta, to z liniowości wynika, że ich kombinacje liniowe

an=v⋅(α)n+w⋅(β)n , v,w∈Ra_n = v\cdot (\alpha)^n + w\cdot (\beta)^n \ , \ v,w \in {\mathbb{R}}

spełniają równanie. Pozostaje dobrać vv i ww tak, aby pierwsze wyrazy były uzyskane

A=a0=v+w,B=a1=v⋅α+w⋅βA = a_0 = v + w \quad , \quad B = a_1 = v \cdot \alpha + w \cdot \beta

i rozwiązujemy ten układ równań liniowych wyznaczając vv i ww.

ad b) Teraz mamy tylko jeden pierwiastek (podwójny) α\alpha, a więc ciągi rozwiązań to (α)n(\alpha)^n oraz (n⋅(α)n)(n\cdot (\alpha)^n), czyli

an=v⋅(α)n+w⋅n⋅(α)n , v,w∈R.a_n = v\cdot (\alpha)^n + w\cdot n \cdot (\alpha)^n \ , \ v,w \in {\mathbb{R}} .

Także tu dobieramy vv i ww w celu uzgodnienia pierwszych wyrazów:

A=a0=v,B=a1=v⋅α+w⋅α.A = a_0 = v \quad , \quad B = a_1 = v \cdot \alpha + w \cdot \alpha .

Łatwo to rozwiązujemy...

ad c) Uwaga - jeśli nie znamy jeszcze liczb zespolonych - pominąć ten przypadek i dokończyć te zadanie po ich wprowadzeniu!

Teraz skorzystamy, że trójmian ma 2 pierwiastki zespolone sprzężone: z=z1+iz2z = z_1 + i z_2 oraz zˉ=z1−iz2\bar{z} = z_1 - i z_2. Bierzemy ich kombinację liniową o współczynnikach zespolonych (!):

an=v⋅zn+w⋅zˉn , v,w∈C.a_n = v\cdot z^n + w\cdot \bar{z}^n \ , \ v,w \in {\mathbb{C}} .

To nie zmienia dalszego rozumowania, ponownie szukamy vv i ww tak, aby dwa pierwsze wyrazy były zgodne z danymi wejściowymi:

A=a0=v+w ,B=a1=v⋅z+w⋅zˉ.A = a_0 = v + w \ , B = a_1 = v\cdot z + w\cdot \bar{z} .

Jak widać - rozwiązujemy układ równań zespolonych, mogą się przydać np. wzór Moivre’a... O tym - w jednym z kolejnych ćwiczeń.

Wersja a): Rozpatrzmy ciąg rekurencyjny

a0=5 , a1=13 , an+2=2⋅an+1+3⋅an.a_0 = 5 \ , \ a_1 = 13 \ , \ a_{n+2} = 2\cdot a_{n+1} + 3 \cdot a_n .

Odpowiednie równanie charakterystyczne jest więc w postaci

x2=2x+3 ⇒ x2−2x−3=0.x^2 = 2x + 3 \ \Rightarrow \ x^2 - 2x - 3 = 0 .

Rozwiązujemy równanie: Δ=4+12=16\Delta = 4 + 12 = 16, czyli Δ=4\sqrt{\Delta} = 4, a więc

x1=3 , x2=−1.x_1 = 3 \ , \ x_2 = -1 .

Rozwiązaniami są więc również funkcje postaci

an=v⋅3n+w⋅(−1)n.a_n = v \cdot 3^n + w \cdot (-1)^n .

Ponieważ a0=5a_0 = 5, a1=13a_1 = 13, to

v+w=5,3v−w=13.v + w = 5 \quad , \quad 3v - w = 13.

Rozwiązujemy prosty układ równań:

v=92,w=12.v = \frac{9}{2} \quad , \quad w = \frac{1}{2} .

Ostatecznie

an=92⋅3n+12⋅(−1)n.a_n = \frac{9}{2} \cdot 3^n + \frac{1}{2} \cdot (-1)^n .

Ćwiczenie (F)

A teraz - na koniec proszę taką właśnie metodą znaleźć wyraz ogólny ciągu Fibonacciego (z równaniem charakterystycznym x2=x+1x^2 = x +1)!

Wersja b): Rozpatrzmy ciąg rekurencyjny

a0=1 , a1=2 , an+2=2⋅an+1−an.a_0 = 1 \ , \ a_1 = 2 \ , \ a_{n+2} = 2\cdot a_{n+1} - a_n .

Odpowiednie równanie charakterystyczne jest więc w postaci

x2−2x+1=0 ⇒ (x−1)2=0.x^2 - 2x + 1 = 0 \ \Rightarrow \ (x-1)^2 = 0 .

Rozwiązaniem jest

x1=1.x_1 = 1 .

Rozwiązaniami są więc również funkcje postaci

an=v⋅1n+w⋅n⋅1n=v+n⋅w.a_n = v \cdot 1^n + w \cdot n \cdot 1^n = v + n\cdot w.

Ponieważ a0=1a_0 = 1, a1=2a_1 = 2, to

v=1,v+w=2 ⇒ w=1.v = 1 \quad , \quad v + w = 2 \ \Rightarrow \ w = 1.

Ostatecznie

an=1+n.a_n = 1 + n .

Wersja c): Uwaga - jeśli nie było jeszcze liczb zespolonych - pominąć ten przypadek i dokończyć te zadanie po ich wprowadzeniu!

Rozpatrzmy ciąg rekurencyjny

a0=1 , a1=14 , an+2=an+1−2⋅an.a_0 = 1 \ , \ a_1 = \frac{1}{4} \ , \ a_{n+2} = a_{n+1} - 2\cdot a_n .

Odpowiednie równanie charakterystyczne jest więc w postaci

x2−x+2=0.x^2 - x + 2 = 0 .

Rozwiązujemy równanie: Δ=1−8=−7\Delta = 1 - 8 = -7, czyli Δ=i⋅7\sqrt{\Delta} = i\cdot \sqrt{7}, a więc

x1=1−i72 , x2=1+i72.x_1 = \frac{1-i\sqrt{7}}{2} \ , \ x_2 = \frac{1+i\sqrt{7}}{2} .

Rozwiązaniami są więc również funkcje postaci

an=v⋅(1−i72)n+w⋅(1+i72)n.a_n = v \cdot \left( \frac{1-i\sqrt{7}}{2}\right)^n + w \cdot \left( \frac{1+i\sqrt{7}}{2}\right)^n .

Korzystamy ze znajomości pierwszych wyrazów ciągu:

v+w=1,v⋅(1−i72)+w⋅(1+i72)=14,v + w = 1 \quad , \quad v \cdot \left( \frac{1-i\sqrt{7}}{2}\right) + w \cdot \left( \frac{1+i\sqrt{7}}{2}\right) = \frac{1}{4} ,

czyli oczywiście

v=12−i47,w=12+i47.v = \frac{1}{2} - \frac{i}{4\sqrt{7}} \quad , \quad w = \frac{1}{2} + \frac{i}{4\sqrt{7}} .

Ostatecznie

an=(12−i47)⋅(1−i72)n+(12+i47)⋅(1+i72)n.a_n = \left(\frac{1}{2} - \frac{i}{4\sqrt{7}}\right) \cdot \left( \frac{1-i\sqrt{7}}{2}\right)^n + \left(\frac{1}{2} + \frac{i}{4\sqrt{7}}\right) \cdot \left( \frac{1+i\sqrt{7}}{2}\right)^n .

Ale teraz mamy kolejne zadanie: nasz ciąg składa się z wartości rzeczywistych, a więc powinniśmy z powyższego ciągu wyeliminować liczby zespolone. Co będzie potrzebne? Ponieważ potęgujemy liczby zespolone, to skorzystamy ze wzoru de Moivre’a.

Mamy ∣1−i72∣=∣1+i72∣=2\left|\frac{1-i\sqrt{7}}{2}\right| = \left|\frac{1+i\sqrt{7}}{2}\right| = \sqrt{2}. Postać trygonometryczna to 1−i72=2⋅(cos⁡ϕ+isin⁡ϕ)\frac{1-i\sqrt{7}}{2} = \sqrt{2} \cdot (\cos{ \phi} + i\sin{ \phi}) oraz 1+i72=2⋅(cos⁡ϕ−isin⁡ϕ)\frac{1+i\sqrt{7}}{2} = \sqrt{2} \cdot (\cos{ \phi} - i\sin{ \phi}) dla pewnego kąta ϕ\phi, gdzie możemy go wyliczyć w danych funkcji trygonometrycznych, nie obliczamy, to ćwiczenie z algebry...) Czyli

an=v⋅(1−i72)n+w⋅(1+i72)n=(2)n⋅(cos⁡nϕ+127sin⁡nϕ).a_n = v \cdot \left( \frac{1-i\sqrt{7}}{2}\right)^n + w \cdot \left( \frac{1+i\sqrt{7}}{2}\right)^n = \left( \sqrt{2}\right)^n \cdot \left( \cos{ n \phi} + \frac{1}{2\sqrt{7}} \sin{ n \phi} \right) .

Zadania (wzory ogólne rekurencji)

Znajdź wzory ogólne ciągów rekurencyjnych:

a)

a0=5,a1=7,an+2=5⋅an+1−6⋅an,a_0 = 5, a_1 = 7, \quad a_{n+2} = 5\cdot a_{n+1} - 6\cdot a_n ,

b)

b0=0,b1=2,bn+2=−2bn+1−2bn,b_0 = 0, b_1 = 2 , \quad b_{n+2} = -2b_{n+1} - 2b_n ,

c)

c0=1,c1=−4,cn+2=4⋅cn+1−4⋅cn.c_0 = 1, c_1 = -4 , \quad c_{n+2} = 4\cdot c_{n+1} - 4 \cdot c_n .

Przypadek ogólny.

To wskazuje, że w ogólnym przypadku an+k=F(a1,...,an+k−1)a_{n+k} = F(a_1, ... , a_{n+k-1}) uzyskamy

a=F(a,a,...,a),a = F(a,a,...,a) ,

a takich (dowolnych) równań nie potrafimy rozwiązywać...

Na ogół ograniczamy się do sytuacji, gdy FF jest wielomianem.

A tu wprowadzenie do równań rekurencyjnych w terminologii ciągów geometrycznych (a nie funkcji tworzących) jak kto woli... - autor: prof. J. Matkowski. A symulacje... ponownie przypomnę o ‘‘Geogebrze’’. Tym razem ładny skrypt o rekurencji liniowej i to niejednorodnej... I może kolejny materiał.

Układy równań liniowych rekurencyjnych

Jak się okaże - nawet na tym wykładzie często zamiast ciągu zadanego rekurencyjnie mamy np. dwa ciągi (choćby przy obliczeniach x\sqrt{x} na komputerze).

Metoda: sprowadzić do jednego równania poprzez redukcję zmiennej.

Przykład. a0=2,b0=3,an+1=6an+4bn,bn+1=an+3bna_0 = 2, b_0 = 3, a_{n+1} = 6a_n + 4 b_n , b_{n+1} = a_n + 3b_n.

Weźmy pierwsze równanie an+1=6an+4bna_{n+1} = 6a_n + 4 b_n i liczymy

an+2=6an+1+4bn+1=6an+1+4⋅(an+3bn)=6an+1+4an+12bn.a_{n+2} = 6a_{n+1} + 4 b_{n+1} = 6a_{n+1} + 4\cdot (a_n + 3b_n ) = 6 a_{n+1} + 4 a_n + 12 b_n .

Ale z pierwszego równania an+1−6an=4bna_{n+1} - 6a_n = 4 b_n, czyli

an+2=6an+1+4an+12bn=6an+1+4an+3⋅(an+1−6an)=9an+1−14an,a_{n+2} = 6 a_{n+1} + 4 a_n + 12 b_n = 6 a_{n+1} + 4 a_n + 3\cdot ( a_{n+1} - 6a_n ) = 9 a_{n+1} - 14 a_n ,

skąd

an+2−9an+1+14an=0a_{n+2} - 9 a_{n+1} + 14 a_n = 0

i równanie charakterystyczne jest postaci

x2−9x+14=0.x^2 - 9x + 14 = 0 .

Z trójmianu

x2−9x+14=0.x^2 - 9x + 14 = 0 .

uzyskujemy

(x−2)⋅(x−7)=0,(x-2)\cdot (x-7) = 0 ,

a więc an=c⋅7n+d⋅2na_n = c\cdot 7^n + d\cdot 2^n . Wstawiając a0a_0 i a1a_1 uzyskamy układ równań:

c+d=a0=2,7c+2d=a1=24.c + d = a_0 = 2 \qquad , \qquad 7c + 2d = a_1 = 24 .

Ostatecznie c=4c = 4 i d=−2d = -2, czyli

an=4⋅7n−2n+1a_n = 4\cdot 7^n - 2^{n+1}

i dalej

bn=7n+2n+1.b_n = 7^n + 2^{n+1} .

Uwaga: można było inaczej, ale taka jest ogólna metoda...

Zauważmy, że metoda tu podawana ograniczyła się do przypadku rekurencji liniowych (o stałych współczynnikach). To ograniczenie pozwala na pominięcie całego aparatu matematycznego szeregów potęgowych (o tym: na analizie matematycznej)! Zamiast tego uzyskujemy wyłącznie wielomiany, a więc wystarczy badać ich pierwiastki. To i tak sprawia, że przydatne są liczby zespolone, albo musimy potrafić to zrobić wyłącznie dla wielomianów, dla których znajdziemy pierwiastki - a w ogólnym przypadku to nie jest możliwe!

Np. ciąg dany rekurencyjnie

an+6−5an+5−15an+4+85an+3+10an+2−372an+1+360an=0a_{n+6} - 5a_{n+5} - 15 a_{n+4} + 85 a_{n+3} + 10 a_{n+2} - 372 a_{n+1} + 360 a_n = 0

prowadzi do równania charakterystycznego

x6−5x5−15x4+85x3+10x2−372x+360=0,x^6 - 5x^5 -15x^4 +85 x^3 +10x^2 - 372 x + 360 = 0 ,

ale to jest

(x−2)3⋅(x+3)2⋅(x−5)=0.(x-2)^3 \cdot (x+3)^2 \cdot (x - 5) = 0 .

Tu się uda, ale...

Ćwiczenie. (dodatkowe) Rozwiązać układ równań rekurencyjnych niejednorodnych:

{xn+1=3 xn−3 yn+(−8)nyn+1=6 xn−8 yn−1.\left\{\begin{array}{l} x_{n+1} = 3\,x_n - 3\,y_n + (-8)^n\\ y_{n+1} = 6\,x_n - 8\,y_n - 1.\\ \end{array}\right.

Rozwiązanie. Przekształćmy pierwsze z równań:

yn=xn−13 xn+1+13 (−8)ny_n=x_n-\frac{1}{3}\,x_{n+1} + \frac{1}{3}\,(-8)^n

i wstawiamy do drugiego

xn+2=−5xn+1+6xn+3.x_{n+2} = -5x_{n+1} + 6x_n +3.

Równanie charakterystyczne problemu jednorodnego

xn+2=−5xn+1+6xn,t2+5t−6=(t−1) (t+6)=0.\begin{array}{c} x_{n+2}=-5x_{n+1}+6x_n,\\ t^2+5t-6=(t-1)\,(t+6)=0. \end{array}

Rozwiązanie problemu niejednorodnego jest więc postaci

xn=(cn+c) + (dn+d)⋅(−6)n,x_n = (c_n+c) \,+\, (d_n+d)\cdot (-6)^n,

gdzie c,dc,d -- stałe dowolne, a ciągi (cn)(c_n ) i (dn) (d_n) spełniają

{Δcn⋅1+Δdn⋅(−6)n+1=0,Δcn⋅1+Δdn⋅(−6)n+2=3.\left\{\begin{array}{l} \Delta c_n\cdot 1 + \Delta d_n\cdot (-6)^{n+1}=0,\\ \Delta c_n\cdot 1 + \Delta d_n\cdot (-6)^{n+2}=3.\\ \end{array}\right.

Z pierwszego równania Δdn⋅(−6)n+1=−Δcn\Delta d_n\cdot (-6)^{n+1} = - \Delta c_n i wstawiamy do drugiego uzyskując:

Δdn=−Δcn(−6)n+1 , Δcn=37.\Delta d_n = \frac{-\Delta c_n}{(-6)^{n+1}} \ , \ \Delta c_n = \frac{3}{7}.

Stąd

cn=37 n+c0, Δdn=−37⋅(−16)n+1⇔dn=(−37)⋅∑j=1n(−16)j+d0=349⋅(1−(−16)n)+d0.c_n= \frac{3}{7}\,n+c_0, \ \Delta d_n = -\frac{3}{7} \cdot \left(-\frac{1}{6}\right)^{n+1}\\ \Leftrightarrow d_n = \left(-\frac{3}{7}\right)\cdot \sum_{j=1}^{n} \left(-\frac{1}{6}\right)^{j} + d_0 = \frac{3}{49}\cdot\left(1-\left(-\frac{1}{6}\right)^{n}\right) +d_0.

Jeśli np. ustalimy pierwszy wyraz c0=349,c_0=\frac{3}{49} , d0=−349d_0=-\frac{3}{49}, to dostajemy

xn=37 n + c+d⋅(−6)n,yn=(13⋅(−8)n+27 n−17) + 23 c+3d⋅(−6)n.x_n= \frac{3}{7}\,n \,+\, c+d\cdot (-6)^n,\\ y_n= \left(\frac{1}{3}\cdot (-8)^n + \frac{2}{7}\,n - \frac{1}{7}\right) \,+\, \frac{2}{3}\,c+ 3d\cdot (-6)^n.

Ćwiczenie samodzielne. Na wzór tej metody można łatwo rozwiązać wiele zadań. Np. takie:

Wyrazy pewnego ciągu geometrycznego (an)(a_n) spełniają warunki:

{a1+a2+a3=2a4+a5+a6=−2\left\{\begin{array}{l} a_1+a_2+a_3=2 \\ a_4+a_5+a_6=-2\end{array}\right.

Aby wyznaczyć iloraz qq tego ciągu, postąpimy następująco:

(1) Zapisujemy drugie równanie jak przy rekurencjach liniowych: q3(a1+a2+a3)=−2q^{3}(a_1+a_2+a_3)=-2. 2. Korzystając z równania pierwszego uzyskamy a1+a2+a3=2a_1+a_2+a_3=2 3. Teraz mamy: q3=−1q^{3}=-1. 4. Obliczmy, że q=−1q=-1.

A teraz - wyznaczyć iloraz qq ciągu geometrycznego (bn)(b_n), o wyrazach b3,b4,…,b8b_3,b_4,\ldots,b_8 spełniających:

{b3+b4+b5+b6=2b5+b6+b7+b8=8\left\{\begin{array}{l} b_3+b_4+b_5+b_6=2 \\ b_5+b_6+b_7+b_8=8\end{array}\right.

Rekurencja - trudniejsze pytanie. Dane są ciągi:

an+1=(an)2  o ile  (an)2<2  oraz  an+1=12an2  o ile  (an)2≥2,a_{n+1} = (a_n)^2 \ \mbox{ o ile } \ (a_{n})^2 < 2 \ \mbox{ oraz } \ a_{n+1} = \frac{1}{2}a_n^2 \ \mbox{ o ile } \ (a_n)^2 \geq 2 ,
bn+1=bn2,b_{n+1} = \frac{b_n}{2} ,
 sn+1=sn  o ile  (an)2<2  oraz  sn+1=sn+bn+1  o ile  (an)2≥2.\ s_{n+1} = s_n \ \mbox{ o ile } \ (a_{n})^2 < 2 \ \mbox{ oraz } \ s_{n+1} = s_n + b_{n+1} \ \mbox{ o ile } \ (a_n)^2 \geq 2 .

Pytania: czy istnieje i jaka jest granica ciągu (sn)(s_n)? Kiedy istnieje (dla jakich wartości początkowych: rozpocznij od a0=x>0a_0 = x > 0, b0=1b_0 = 1 i s0=0s_0 = 0)? Jak zakończyć obliczenia (warunek stopu)?

Rekurencja jest silnie związana z zastosowaniem pętli bez wskazania liczby przebiegów, a raczej ze sprawdzeniem osiągnięcia założonego celu, czyli pętli ‘‘while... do’’. I tu problem: obliczając symulacje istnienia i wartości granicy mamy dwa problemy: pierwszy, to nie możemy zweryfikować, czy granica istnieje (o czym mówiliśmy), a drugi, to kiedy zakończyć obliczenia (problem ‘‘stopu’’). W tym drugim przypadku możemy uzyskać fałszywą sugestię odnośnie wartości granicy, a na ogół chcemy znać tę wartość z zadaną precyzją ε>0\varepsilon > 0. Nie znając granicy gg nie możemy sprawdzać w pętli warunku z definicji ∣an−g∣<ε|a_n - g| < \varepsilon.

Powinniśmy badać warunek Cauchy’ego, bo on nie wymaga znajomości granicy, a jedynie wyrazów ciągu. Niestety - wszystkich od pewnego miejsca. Tego się nie da, więc często sprawdzamy różnice ∣an−an−1∣<ε|a_n - a_{n-1}| < \varepsilon.

To za mało: proszę zrobić symulację np. dla an=∑k=3n1kln⁡kln⁡(ln⁡k)a_n = \sum_{k=3}^n \frac{1}{k \ln k \ln (\ln k)} lub po prostu dla an=ln⁡na_n = \ln{n}. Problem jest otwarty, a pewne istniejące rozwiązania podamy na analizie matematycznej...

Proszę być świadomym ograniczeń obliczeń komputerowych:

Diagonal arguments are used to prove many fundamental results about the limitations of computation, such as the undecidability of the Halting Problem for programs and the inherent, unavoidable inefficiency (exponential time or worse) of procedures for other computational problems. So computer scientists do need to study diagonal arguments in order to understand the logical limits of computation. A well-educated computer scientist will be comfortable dealing with countable sets, finite as well as infinite. {Mathematics for Computer Science, Eric Lehman, F Thomson Leighton, Albert R Meyer}