Stikkord:
[Merk et av ordene og bruk søkefunksjonen (Ctrl-F) i nettleseren til å bla opp]
basistrinn differenslikning generell løsning homogen induksjon induksjonstrinn inhomogen iterativ karakteristisk likning lineær Matlab Maxima partikulær løsning rekursiv definisjon rekursjon rekursjonslikning startverdi tallfølge
En gammel fortelling dreier seg om riskorn på et sjakkbrett plassert etter følgende mønster,
Rute 1 har ett korn,
rute 2 har to korn,
rute 3 har fire korn,
- og videre slik at neste rute har dobbelt så mange korn som foregående rute.
Hvor mange korn er det på siste rute? Hvor mange korn er det tilsammen?
1 | 2 | 4 | 8 | 16 | 32 | 64 | 128 |
28 | 29 | 210 | 211 | 212 | 213 | 214 | 215 |
1MB | |||||||
1GB | |||||||
1TB | |||||||
1PB | |||||||
256 | 1EB | 263 |
Et sjakkbrett har 8x8 ruter organisert fra A1 til H8, men her forenkler vi og sier at rutene indekseres i ordningen 1-64. Vi lar heltallet n være ruteindeks. Antall korn på rute nr. n er en funksjon av n. I vanlig matematikk ville vi vel ha uttrykt antallet som en funksjon av n, a(n), slik at a(3)=4, a(5)=16, osv. Men siden det her alltid dreier seg om heltallsverdier av n skriver vi dette funksjonsuttrykket som an, der indeksen n angir den uavhengige variabelen i funksjonen. Holder du riktig telling vil vi her ha at for eksempel a7=64 og a10=512.
Antall korn på en tilfeldig rute k kan vi finne ved å iterere, det vil si stare med a1=1 og fortsette etter mønsteret a2=2⋅a1, a3=2⋅a2=2(2⋅a1), a4=..., til vi kommer til k. Alternativt kan vi bruke det vi vet om geometriske tallfølger til å finne ak. Metoden vi skal lære nedenfor er å sette opp slike problem som en differenslikning og løse denne.
Oppgaven her er å finne et funksjonsuttrykk for an ut fra de to opplysningene
an = 2 ⋅ an-1
a1 = 1 (startbetingelse)
Her går vi rett på sak og henter løsningen, an = 2n-1 - og på siste rute i sjakkbrettet bør det altså være plass til
264-1 = 9223372036854775808 korn.
Hvordan skulle vi tilsvarende sette opp en slik differenslikning for å finne antal korn tilsammen så langt hvis vi nettop har lagt det rette antallet korn på rute n? Her lar vi sumfunksjonen være sn, med altså s1=1, s2=3, s3=7, ...
Oppgaven her er å finne et funksjonsuttrykk for sn ut fra de to opplysningene
sn = sn-1 + 2n-1
s1 = 1 (startbetingelse)
Dette siste likningsoppsettet kan muntlig formuleres omtrent slik:
"Antall korn tilsammen på brettet til og med rute n er lik antall korn på alle de foregående rutene summert med antallet korn som legges på rute n - og på første rute er summen 1 korn."
Igjen går vi rett på sak og viser løsningen, sn = 2n-1. Et pent lite uttrykk som vi senere skal finne som løsningen på den lineære, inhomogene differenslikningen
sn - sn-1= 2n-1 , s1 = 1.
Vi svinger innom nok et begrep før vi går videre, induksjonsbevis. Hvordan kan vi overbevise oss at sn = 2n-1 er løsningen på den siste differenslikningen ovenfor? Jo, vi ser at formelen gir riktig sum for rute nr. 1, og så antar at formelen gir riktig sum for alle ruter tom. en viss rute k - og så legger vi til antall korn på neste rute - og ser om vi kunne ha regnet det hele ut med samme formel. Vi skal nå altså bevise en formel eller et utsagn som en slags alternativ løsningsteknikk. Her er teknikken i korte trekk:
Formelen gir riktig sum for n=1, s1 = 21-1=1.
Vi antar at formelen gjelder for rute nr. k, altså sk = 2k-1
Legger vi til antall korn på neste rute (med indeks k+1) får vi summen til og med rute k+1,
sk+1 = sk + ak+1
Setter inn for sk og ak+1,
sk+1 = 2k-1 + 2(k+1)-1
sk+1 = 2k + 2k - 1 = 2k+1-1
- og vi konkluderer med at hvis formelen gjelder for rute k, så gjelder den også for rute k+1 - og siden den helt sikker gjelder for rute 1, vil den også gjelde for rute 2 - og 3 - og 4 - og iterativt opp til den ruta vi vil.
Antall riskorn på brettet skulle dermed bli 264-1 = 18446744073709551615 - en haug større enn Mount Everest og omtrent 1000 ganger verdens årsproduksjon av ris.
Svak induksjon
Et utsagn P(n) kan vises å være sant for alle n ved matematisk induksjon på følgende måte,
Basistrinnet,
Vis at utsagnet P(1) er sant.
Induksjonsstrinnet,
Vis at dersom P(n) er sann, så er P(n+1) også sann for n=1,2,3,...
Det bygger på et sant basisutsagn og et bevis for at hvis utsagnet P(n) er sant så er P(n+1) også sant for en viss verdi av n. Det bevises ikke direkte at utsagnet er sant for alle verdier av n, men ved å legge til at 'siden P(1) er sann, så er P(2) sann, og siden P(2) er sann, så er P(3) sann, og så videre til et hvilket som helst tilfelle'– så gjelder det for alle.
Basistrinnet, P(1)
Sum = s(1) = 1 = 12, påstanden stemmer.
Induksjonsstrinnet, P(k)
Antar s(k) = k2.
Det k'ende oddetall er 2k-1 og det (k+1)'ende oddetall er 2(k+1)-1.
Induksjonsstrinnet, P(k+1)
Summen av de k+1 første oddetall er s(k+1) = s(k) + 2(k+1)-1 = k2 + 2k + 1 = (k+1)2.
Altså, summen av de k+1 første oddetall lar seg beregne etter samme formel som for de k første oddetall.
Basistrinnet, P(1)
a(1) = 13-4⋅1+6 = 3, som er delelig med 3, P(1) er sann.
Induksjonsstrinnet, P(k)
Antar at a(k) = k3-4k+6 er delelig med 3 slik at a(k)=3m.
Induksjonsstrinnet, P(k+1)
Utvider, a(k+1) = (k+1)3-4(k+1)+6 = k3+3k2-k+3
Ordner, a(k+1) = k3-4k+6 + 3(k2+k-1) = 3m + 3(k2+k-1) = 3q
Som viser at a(k+1) også er delelig med 3.
Basistrinnet, P(5)
VS = 25 = 32 , HS = 4⋅5 = 20, P(5) er sann.
Induksjonsstrinnet, P(k)
Antar at 2k > 4k er sann.
Induksjonsstrinnet, P(k+1)
Omformer VS,
2k+1 = 2⋅2k
2k+1 = 2k + 2k
2k+1 > 4k + 4k (Bruker antagelsen)
2k+1 > 4k + 4 (for k>1)
2k+1 > 4(k+1) , påstanden gjelder også for k+1.
Sterk induksjon
Bevis ved svak induksjon er basert på basistrinnet P(1) og at hvis påstanden P(N) gjelder for en eller annen verdi av n, så kan det vises at P(n+1) også gjelder. For å gjøre beviset komplett må vi formelt i tillegg gjenta at 'P(2) gjelder fordi P(1) gjelder, P(3) gjelder fordi P(2) gjelder, osv...'
Sterk induksjon skiller seg fra svak induksjon ved at induksjonstrinnet skal vise at dersom alle påstander P(1), P(2), ..., P(n) er sanne så må også P(n+1) være sann.
Basistrinnet,
Vis at utsagnet P(1) er sant.
Induksjonsstrinnet,
Vis at dersom P(1), P(2), ..., P(n) alle er sann, så er P(n+1) også sann for n=1,2,3,...
Basistrinnet, P(2)
Tallet 2 er primtall, påstanden stemmer.
Induksjonsstrinnet, P(k)
Antar at alle P(2), P(3), ..., P(k) er sanne.
Induksjonsstrinnet, P(k+1)
Det gir to muligheter for:
a) Tallet k+1 er primtall og P(k+1) er sann,
b) Tallet k+1 er sammensatt tall, k+1 = a⋅b der 1<a<k+1 og 1<b<k+1
- og siden a og b er primtall blir k+1=a⋅b også produktet av primtall.
En tallfølge kan formuleres
eksplisitt
an=2n-1 og n≥1.
rekursivt
an+1=2an+1 og a1=1
Definisjon 1
Den enkleste form for rekursiv definisjon er basert på at verdien av et ledd i en tallfølge kan uttrykkes ved hjelp av det foregående ledd,
basis: y1 er definert
rekursjon: yn er definert ved uttrykk i yn-1.
a) b) 87654321 8765432- 876543-- 876543-- -------- -------- 2------- 21------ -------- 1------- 1------- -------- c) 87654--- 876541-- 876541-- 87654--- 21------ 2------- -------- -------- 3------- 3------- 32------ 321----- d) e) f) 8765---- 876----- // 876----- 4321---- 4321---- // -------- -------- 5------- // 54321---
Starter i a) med alle skiver på en pinne. Etter 3 trekk er vi i b), det tar altså 3 trekk å flytte 2 skiver, y2=3. Etter 7 trekk er vi i c), det tar altså 7 trekk å flytte 3 skiver, y3=7.
Etter at trekk yn-1 er gjort er n-1 skiver (vist med 4321) flyttet til midterste stolpe i d). Gjør så ett trekk til og flytter den største skiva til nederste stolpe - og etter n-1 nye trekk er de n-1 skivene (4321) plassert over 5 på nederste stolpe. Det betyr at det for å flytte n skiver må det først flyttes n-1 skiver, så 1 ny skive og de samme n-1 skivene en gang til, yn = yn–1 + 1 + yn–1 som vi ordner til rekursjonsformelen for Tårnene i Hanoi: yn = 2 yn–1 + 1 , y(1) = 1.
Løsningen på differenslikningen ovenfor er yn = 2n - 1. Setter vi inn for 8 skiver ser vi at det tar 255 trekk. Vi kan vise ved induksjon at yn=2n-1 er løsningen,
yn = 2 yn-1 + 1 (antall trekk for n skiver)
yn+1 = 2 y(n+1-1) + 1 (antall trekk for n+1 skiver)
yn+1 = 2(2n-1) + 1 (setter inn for yn)
yn+1 = 2⋅2n - 2 + 1 = 2n+1-1
Definisjon 2
En tallfølge kan også beskrives ved at verdien av et ledd er gitt av et uttrykk der verdiene av de to foregående (eller flere) leddene inngår:
basis: y1 og y2 er definert
rekursjon: yn er definert ved uttrykk i yn-1 og yn-2.
En differenslikning eller rekursjonslikning er en rekursiv definisjon av en tallfølge der vi skal finne et eksplisitt uttrykk for det generelle leddet som funksjon av indeksvariabelen. Med startverdier vil vi finne en partikulær løsning – uten startverdier kan vi finne en generell løsning.
En homogen differenslikning setter opp sammenhengen mellom to eller flere ledd i en tallfølge og ingen andre konstanter eller variabler, for eksempel
yn = 2yn-1 - yn-2 , n≥2 , y0=0 , y1=1.
En inhomogen differenslikning setter opp sammenhengen mellom to eller flere ledd i en tallfølge og andre konstanter eller variabler, eksempel
yn = 2yn-1 +(n-1)⋅3n , n≥1 , y0=5.
En lineær differenslikning setter opp sammenhengen mellom to eller flere ledd i en tallfølge der leddene er lineære (ikke potenser eller rotuttrykk). Vi løser bare lineære differenslikninger med konstante koeffisienter – slik som de to likningene ovenfor.
Her er tre tallfølger,
n=0 n=1 n=2 n=3 ... { 2, 6, 18, 54, ... } { 5, 15, 45, 135, ... } { C, 3C, 9C, 27C, ... }
Alle følgene er slik at 'verdien av neste ledd er lik 3 ganger foregående ledd', altså yn = 3 yn-1, men de skiller seg på startbetingelsene, y0=2 for den første, y0=5 for den andre og y0=C for den tredje.
Løsningen på den homogene differenslikningen yn = 3 yn-1 er generelt yn = C⋅3n. En spesiell løsning finner vi først når vi kjenner verdien av ett ledd i følgen - og hvilken indeks det har, her for eksempel y0=2.
Dette er en homogen differenslikning av 1. orden med konstant koeffisient. Tallfølgen som beskrives er også kjent som en geometrisk følge - der det er et konstant forhold mellom to naboledd.
Metoden for å løse slike likninger er oppsummert her:
Ordnet likning,
yn - a yn-1 = 0 + def.område + startverdi
Generell løsning,
yn = C an , der C finnes av startverdi.
Her er tre tallfølger,
n=0 n=1 n=2 n=3 ... { 2, 10, 38, 126, ... } { 5, 19, 65, 207, ... } { C, 3*C+4, 9*C+20, 27*C+72, ... }
Alle følgene er slik at 'verdien av neste ledd er lik 3 ganger foregående ledd lagt sammen med 4 ganger indeksen', altså yn = 3 yn-1 + 4n, men de skiller seg på startbetingelsene, y0=2 for den første, y0=5 for den andre og y0=C for den tredje.
Løsningen på den tilsvarende homogene differenslikningen yn = 3 yn-1 er generelt yn = C⋅3n, og leddene som vi får ved å sette inn for n inngår som en del av leddverdiene i tallfølgen for denne inhomogene likningen. Dette betyr at løsningen på en inhomogen differenslikning består av to komponenter: (1) løsningen på den tilsvarende homogene likningen, lagt sammen med (2) en partikulær løsning av den inhomogene likningen. Vi skriver dette som yn = yn(h) + yn(p). Den partikulære løsningen er et uttrykk 'av samme' type som det inhomogene leddet.
Metoden for å løse slike likninger er oppsummert her:
Ordnet likning,
yn - a yn-1 = f(n) + def.område + startverdi
Løsningen er summen av løsingen på den tilsvarende homogene likninga, yn(h)
og en partikulær løsning av den inhomogene likninga av samme uttrykkstype som det inhomogene leddet, yn(p).
Samlet løsning: yn = yn(h) + yn(p)
Den partikulære løsninga prøves 'av samme type' som det inhomogene leddet etter følgende skjema:
Ledd i ytre påtrykk, f(n) | Mulig partikulær løsning, yn(p) |
---|---|
c | K |
c nr r=1,2,3,... | Krnr + Kr-1nr-1+ ... + K1n + K0 |
c αn | K αn |
c nrαn r=1,2,3,... | (Krnr + Kr-1nr-1+ ... + K1n + K0)αn |
Løsningsmetoden er generelt slik:
Resepten starter med å finne generell løsning, men venter med å gå videre med denne. Hvis det er sammenfall mellom yn(p) og yn(h) skal yn(p) multipliseres med n (evt n2, n3, ...).
Tallfølgen som vi får ved å sette inn n=0,1,2,3,... blir {2, 10, 38, 126,...} - som forventet.
En tallkode består av siffer hentet fra mengden {0, 1, 2, 3}. Et kodeord er gyldig dersom det inneholder et like antall nuller. Finn en formel for hvor mange kodeord det kan dannes med n siffer.
Først må vi sette dette opp som en rekursiv sammenheng og lar yn være antall koder med n siffer. Det er to tilfeller som skiller seg ut,
1) Hvis koden starter med 1, 2 eller 3 og resten er en gyldig kode, er det 3⋅yn-1 antall koder.
2) Hvis koden starter med 0 må resten av koden inneholde et odde antall nuller for å bli gyldig. Siden det er i alt yn-1 gyldige koder med n-1 siffer er det 4n-1 - yn-1 ugyldige koder med n-1 siffer - og samme antall gyldige koder på n siffer der det første er 0.
Legger sammen fra 1) og 2): yn = 3⋅yn-1 + 4n-1 - yn-1 = 2⋅yn-1 + 4n-1
En 2. ordens homogen differenslikning er ut uttrykk for verdien av et ledd i en tallfølge gitt av verdiene på de to foregående leddene, yn = a1 yn-1 + a2 yn-2, der a1 og a2 er konstanter. På ordnet form blir det yn - a1 yn-1 - a2 yn-2 = 0 - og gjerne en startverdi. Løsningen på en slik likning er forbausende enkel, yn = C⋅λn. La oss sette denne generelle løsningen inn i likningen, og gjøre noen forenklinger,
yn - a1 yn-1 - a2 yn-2 = 0 (setter inn for yn,)
C⋅λn - a1 C⋅λn-1 - a2 C⋅λn-2 = 0 (dividerer med C⋅λn-2,)
λ2 - a1 λ - a2 = 0 (karakteristisk likning)
Denne karakteristiske likninga har generelt to røtter, λ1 og λ2, med tilhørende løsning på differenslikinga, yn = C1⋅λ1n + C2⋅λ2n. Hvis den karakteristiske likninga har sammenfallende eller komplekse røtter blir det ikke fullt så enkelt. Her er løsningsmetoden oppsummert:
Ordnet likning,
yn - a1 yn-1 - a2 yn-1 = 0 + def.område + startverdier
Likninga har en karakteristisk likning λ2 - a1 λ - a2 = 0 med 3 mulige løsningstyper:
(1) to ulike, reelle røtter, λ1 ≠ λ2:
yn = A λ1n + B λ2n
(2) sammenfallende røtter, λ1 = λ2 = λ:
yn = A λn + B n λn
(3) komplekskonjugerte røtter, λ1,2 = r e±φi
yn = rn(C cos(nφ) + D sin(nφ))
Ordnet likning,
yn - a1 yn-1 - a2 yn-1 = f(n) + def.område + startverdier
Det inhomogene leddet f(n) er gjerne et polynom i n (c nr...), en eksponent i n, (c αn...) eller en kombinasjon (c nr αn...), som tidligere vist for 1. orden.
Løsningen er generelt yn = yn(h) + yn(p),
der yn(h) er løsningen av den homogene likninga yn - a1 yn-1 - a2 yn-1 = 0
og yn(p) er en partikulær løsning av yn - a1 yn-1 - a2 yn-1 = f(n) .
Den partikulære løsningen vil være av samme type som det inhomogene leddet.
Dersom yn(p) inngår i yn(h) multipliseres yn(p) med n, n2, n3, ...
Likninga har en karakteristisk likning λ2 - a1 λ - a2 = 0 med 3 mulige løsningstyper:
(1) to ulike, reelle røtter, λ1 ≠ λ2:
yn = A λ1n + B λ2n
(2) sammenfallende røtter, λ1 = λ2 = λ:
yn = A λn + B n λn
(3) komplekskonjugerte røtter, λ1,2 = r e±φi
yn = rn(C cos(nφ) + D sin(nφ))
Løsningsmetoden er generelt slik:
Resepten ovenfor starter med å finne generell løsning for yn(h), men venter med å gå videre med denne til vi ser uttrykket for yn(p). Hvis det er sammenfall mellom yn(p) og yn(h) skal alle leddene i yn(h) multipliseres med n (evt n2, n3, ...).
Matlab har et symbolsk tillegg med eget GUI, MuPad, som kan løse visse typer differenslikninger, men feiler på de siste eksemplene. Alternativet Maxima løser slike likninger etter at vi laster inn et tillegg. Så taster vi inn oppgaven,
%i. load(solve_rec); %i. solve_rec(y[n]-6*y[n-1]+9*y[n-2]=2^n, y[n], y[0]=1, y[1]=2); %o. y[n]=2^(n+2)+(n-3)*3^n %i. solve_rec(y[n]-y[n-1]-2*y[n-2]=2*n, y[n], y[0]=-1, y[1]=1); %o. y[n]=2^(n+1)-(-1)^n/2-n-5/2
Kjenner du til Matlab/Octave kan vi demonstrere prinsippene iterasjon og rekursjon med et par programeksempler.
Først beregnes fakultet for et tall iterativt etter prinsippet n! = 1⋅2⋅3⋅...⋅n.
Deretter rekursivt etter prinsippet n! = n⋅(n-1)! ∧ 0!=1.
function svar = fak_iter( n )
% FAK_ITER Beregner n! = 1*2*3*4*...*n iterativt.
if n >= 0
svar = 1;
for k = 2:n
svar = svar * k;
end
else
svar = NaN;
end
end
>> fak_iter(10) ans = 3628800 >> fak_iter(0) ans = 1 >> fak_iter(-7) ans = NaN
Det er kommandoen svar = svar * k
som gjør jobben, etter hver runde blir den nye verdien av svar
lik forrige verdi multiplisert med rundenummeret k
. Funksjonen fak_iter beregner riktig for alle n>=0, men er satt til å returnere NaN for n<0. For eksempel vil 5! bli beregnet med gjentakelsene
svar = 1
svar = 1 * 2 = 2
svar = 2 * 3 = 6
svar = 6 * 4 = 24
svar = 24 * 5 = 120
Neste eksempel er funksjonen fak_reku som gjentar seg selv med nye funksjonskall helt til den har gjort jobben,
function svar = fak_reku( n )
% FAK_REKU Beregner n! = n * (n-1)! rekursivt til 0!=1.
if n == 0
svar = 1;
else
svar = n * fak_reku(n-1);
end
end
>> fak_reku(5) ans = 120 >> fak_reku(0) ans = 1 >> fak_reku(-4) error: max_recursion_depth exceeded
Funksjonen fak_reku beregner riktig for alle n>=0, men feiler for negative n-verdier fordi det ikke er tatt hensyn til dette i koden slik som i fak_iter. Her blir 5! beregnet med rekursjonsstegene
5*fak_reku(4) 4*fak_reku(3) 3*fak_reku(2) 2*fak_reku(1) 1*fak_reku(0) = 1 = 2 = 6 = 24 = 120
Det kan se ut som om funksjonen fak_reku
kaller seg selv 5 ganger, men det som skjer er at det er 5 selvstendige utgaver av funksjonen som kjøres. Ved en kjede rekursive funksjonskall vil det ikke bli laget returverdi før det innerste funksjonskallet returnerer med 1 ved testen if n==0. Deretter gir nest innerste funksjonskall returverdi - og slik i en kjede tilbake til ytterste kall.
Det bør også nevnes at for store n-verdier (n > 21) vil vi ikke få et eksakt heltallsvar i Matlab/Octave på grunn av måten tall blir representert på.