Anvendelser
I dette kapitel ser vi på, hvordan python kan bruges til at løse matematiske problemer.
Beregninger med iteration
I matematik betyder iteration, at man gentager anvendelsen af en regel eller en beregning. Man starter med en begyndelsesværdi og bruger en formel eller funktion igen og igen, hvor hvert nyt resultat bruges som input til næste trin.
Et eksempel på en funktion, som kan beregnes ved iteration er fakultet funktionen: \[ n! = n · (n-1) · (n-2) \cdots 3 · 2 · 1\] hvor fx \(5!=5·4·3·2·1=120\). Nu kan \(6!\) beregnes ud fra \(5!\) fordi \[ 6! = 6·5·4·3·2·1 = 6·5!\] På samme måde kan \(n!\) beregnes ud fra \((n-1)!\) \[ n! = n· (n-1) \] Hver ny værdi af \(n!\) kan altså beregnes ud fra den foregående \((n-1)\) ved at bruge samme metode: gang med \(n\).
Hvis man starter med \(0!=1\), kan alle de øvrige værdier beregnes ved at gange med \(n\): \[ 1!=1·0!, \quad 2!=2·1!, \quad 3!=3·2! \quad \text{osv.}\]
Et andet eksempel på iteration er Fibonacci-tallene: \[ 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, \dots \] hvor hver tal i rækken er summen af de to foregående. Dette program beregner det \(n\)’te Fibonacci tal:
Løs en ligning med bisektionsmetoden
Vi vil nu bruge python til at finde en numerisk løsning til en ligning. En numerisk løsning til en ligning er en tilnærmet værdi for løsningen, som findes ved hjælp af beregningsmetoder i stedet for en nøjagtig, eksakt formel. Den ligning, vi vil løse er \[x^2=2\] Vi ved godt at der et to løsninger, \(x=-\sqrt 2\) og \(x=\sqrt 2\), så det er muligt at sammenligne det numeriske resultat med den eksakte løsning. Den metode vi vil bruge kaldes bisektions-metoden. Det er faktisk en metode til at finde nulpunkter (rødder) i en funktion, så første trin er at lave omskrive ligningen til \[ x^2-2=0\] Hvis vi sætter \(f(x)=x^2-2\) kan vores ligning altså skrives som \[ f(x)=0\] Bisektions metoden kræver at vi starter med et interval \([a,b]\), hvor \(f(a)\) og \(f(b)\) har forskelligt fortegn. Derfor ved vi, at må være en rod i intervallet (hvis funktionen er kontinert).
Metoden går ud på at bestemme \(f(c)\), hvor \(c\) ligger midt imellem \(a\) og \(b\). Hvis \(f(a)\) og \(f(c)\) har forskelligt fortegn så er der en rod i intervallet \([a;c]\) og vi fortsætter med at undersøge dette interval. Ellers må der være en rod i intervallet \([c;b]\) og vi fortsætter med at undersøge dette interval. Vi har altså et nyt interval, hvor vi finder midtpunktet og beregner funktionsværdien osv. osv.
Hver gang vi vælger et nyt interval, bliver længden af intervallet halveret. Det er derfor metoden kaldes bisektion = “dele op i to dele”. Intervallerne bliver mindre og mindre, og vi kommer derfor tættere og tættere på den rigtige værdi af roden.
Proceduren er den samme hver gang vi har valgt et interval, og metoder hvor vi gentager den samme procedure igen og igen kaldes iterative. Hver anvendelse af metoden kaldes en iteration. Med mindre man ved et tilfælde rammer et interval, hvor \(f(c)=0\) kan man i princippet fortsætte metoden i det uendelige. Man angiver derfor en tolerance, og afbryder derfor metoden når \(f(c)\) er tættere på 0 end tolerancen angiver. Dermed kan man betragte \(c\) som en tilnærmet løsning til ligningen.
For en sikkerheds skyld sætter man også en grænse for, hvor mange iterationer programmet må foretage. Hvis der ikke er fundet en løsning inden det maksimale antal iterationen fejler metoden.
Det er metoder som disse (med lidt mere avancerede variatoner), som dit CAS-værktøj bruger, hvis det ikke kan finde en eksakt løsning til en ligning ved hjælp af en formel. Men nu til selve programmet:
Newton-Raphsons metode
Newtons-Raphsons metode (den kaldes også nogen gange blot for Newtons metode) er en metode til at finde nulpunkter for en funktion \(f(x)\). Det gøres ved at starte med et gæt på hvor nulpunktet ligger. Det kalder man for \(x_0\).
Nu kan beregne et nyt gæt, som kan beregnes med formlen
\[ x_1=x_0-\frac{f(x_0)}{f'(x_0)} \] Metoden kræver altså at vi kender både \(f(x)\) og \(f'(x)\). Metoden kan udvides til at beregne flere værdier ved iteration. Hvis man kender den \(n\)’te værdi, \(x_n\), kan den næste værdi \(x_{n+1}\) beregnes med formlen
\[ x_{n+1} = \frac{f(x_n)}{f'(x_n)} \]
Eulers metode
Eulers metode er metode til at beregne en tilnærmet løsning til en første-ordens differentialligning.
Hvis en differentialligning er givet ved
\[ y'=f(x,y) \] beregnes \(y\)-værdier ved hjælp iteration ud fra formlen
\[ y_{n+1} = y_n + h·f(x_n,y_n) \] og
\[ x_{n+1} = x_n +h \]
hvor \(h\) kaldes skridtlængden.
Det følgende program beregner en numerisk løsning til differentialligningen
\[ y' = 1{,}1·y \] med begyndelsesbetingelsen \(y(0)=3\).
I programmet er y0 betingelsen \(y(x_0)=3\). x0 er startværdien af \(x\), og xn er den sidste \(x\)-værdi, så programmet beregner en tilnærmet løsning i intervallet \([x_0; x_n]\).
Feigenbaum
Det næste program plotter en figur, som er kendt som Feigenbaums træ. Plottet er baseret på iteration ud fra formlen \[ x_{n+1} = r· x_n · (1- x_n) \] hvor \(r\) er en konstant. Du kan læse mere om plottet i bemærkningerne efter programmet.