Introduktion til Python i matematik

Proof. By induction.

Indledning

Python er et programmeringssprog. Det er altså en speciel form for kodesprog, som giver instrukser til en computer om, hvad den skal gøre. Alle apps på din computer eller telefon er opbygget af kommandoer af denne type. De kan dog være skrevet i mange andre programmeringssprog end Python.

Nedenfor finder du en række Python-programmer. Enten helt uden forklaring eller kun med korte forklaringer. Ved at arbejde med øvelserne efter de forskellige programmer, vil du kunne udvikle en forståelse af

  • hvad et program er
  • hvordan et programmeringssprog som Python fungerer
  • hvordan et computer laver matematiske beregninger
  • at alt, hvad en computer kan bruges til, er opbygget af kommandoer som disse.

De enkelte programmer kan køres ved at trykke på “Run Code” knappen over programkoden.

Efter programmet vil der som regel være en boks med bemærkninger og en boks med øvelser. Kommentarne kan være uddybelse af hvad der sker i programmet, eller tekniske detaljer, som ikke er nødvendige i første omgang.

I øvelserne kan du udforske de enkelte programmer, ved at tænke over hvordan de fungerer. Du kan modificere programmet (ændre i koden) og se hvilken forskel dine ændringer gør. Og du kan være helt rolig. Hvis du kludrer rundt i det, kan du bare trykke på “Start over”-knappen over koden. Så kommer du tilbage til udgangspunktet.

Du bliver nok ikke programmør af at følge øvelserne, men hvis du bliver inspireret til at lære mere, er der masser af inspiration af hente på nettet, fx. på youtube: søg på youtube.com. Her kan du både finde instruktioner om, hvordan du kan installere Python på din computer, og hvordan du selv kan lære at skrive programmer.

NoteTeknisk bemærkning
  • Alle programmerne på denne side kører lokalt i browseren på din maskine, men der installeres ikke noget på din computer. Hverken filer eller cookies.

  • Derfor er siden sikker at bruge. Du bliver ikke tracket, og ingen oplysninger om dig bliver gemt nogen steder.

  • Det betyder også, at de ændringer, du laver i et program, ikke bliver gemt nogen steder. Hvis du forlader siden og kommer tilbage, er dine ændringer væk. Hvis du gerne vil huske, hvad du har gjort, kan det være en god idé at kopiere den ændrede kode over i et dokument på din computer. Så kan du altid sætte den ind igen på et senere tidspunkt, hvis du vil eksperimentere videre.

God fornøjelse med programmerne!

Variable og enkle beregninger

Dette er det første Python program, så du får lige lidt forklaring:

Programmet består af en række linjer med instrukser, som udføres en efter en. Linjerne er nummereret 1 til 15, men linjenumrene er ikke en del af selve programmet. De er indsat for at gøre det lettere at referere til et bestemt sted i programmet.

  • I linje 1 og 2 tildeles de to varable a og b talværdier.

  • I linjerne 5 til 9 udskrives værdien af en beregning

  • I linjerne 2 til 15 laves de samme beregninger igen, men udskrives med lidt mere forklaring.

Kig på programmet og overvej, om du kan gennemskue, hvad det gør. Tryk derefter på “Run Code” og se, om du havde ret! Programmets output vises under programmet.

  • I Python skal man ikke skrive := når man vil give en variabel en værdi, som man skal i CAS-værktøjer som Maple, WordMat eller Nspire. Man skal altså blot skrive fx a=5.

  • i Python kan du indsætte kommentarer i programmet ved at indsætte et # i en linje. Alt hvad der står efter det bliver betragtet som en kommentar.

  • I de sidste fire print() kommandoer har indholdet i parenteserne formen f"...". Det kaldes en formatteret streng. I en formatteret stregn bliver indholdet af {} erstattet med resultatet af at beregne indholdet. Fx bliver f"{1+3}" til 4.

  • Indsæt andre værdier for a og b i programmet og kontrollér at det regner rigtigt. Prøv også med decimaltal. Husk at bruge . i stedet for komma.

  • I den sidste print-kommando står der {a/b:.3f}. Prøv at ændre værdien 3 til f.eks. 5, 6 eller 7. Hvad mon denne specielle kode betyder?

  • Prøv at udvide programmet til også at beregne og udskrive (a+b)·(a-b)

Flere beregninger med variable

Når symboler som a kaldes en variabel, er det fordi man kan ændre deres værdi. Det illustreres af dette program, hvor der også oprettes en ny variabel d ud fra tre andre.

Programmet viser også, hvordan man kan lave simple beregninger med variable og de fire regningsarter (+, -, · og /) og potenser. Man kan selvfølgelig også bruge alle de matematiske funktioner vi kender. Det ser vi på i et andet eksempel.

  • I python betyder ** en potens. Så a**2 betyder a^2.

Betingelser: if-sætningen:

Et program kan ikke kun automatisk udføre en række beregninger efter hinanden (selv om det også kan være rart). En vigtig ting i mange programmer er, at det kan gøre forskellige ting fx afhængigt af værdien af en variabel eller beregning. Det køres med kommandoen if betingelse : som er illustreret i programmet nedenfor. I linje 3 er der en if-sætning. Hvis variablen alder er større end eller lig 13 og samtidig mindre end 20, så udføres kommandoen i næste linje, som printer en besked. Bemærk at den eller de kommandoer, som skal udføres, skal stå lige efter if-sætningen og være indrykket (her med to mellemrum).

  • Hvorfor mon der står alder >= 13 og ikke alder > 12 i linje 3? Hint: overvej hvad det betyder, hvis du ændrer alder til at have en decimalværdi.

  • Kan du udvide programmet til at undersøge, om man er midaldrende?

  • Man kan lave ret komplicerede strukturer med if og else. Prøv at undersøge, hvordan dette program fungerer:

  • Ingen bemærkninger endnu

Beregninger med matematiske funktioner

Hvis vi skal bruge de matematiske funktioner som \mathrm e^x, \sqrt x osv., skal vi først give en Python en kommando for at få adgang til dem. Det gøres i første linje i programmet:

  • Læg mærke til, at den naturlige logaritme \ln(x) skrives som log(x) og at titalslogaritmen \log(x) skrives som log10(x).

  • I den sidste if sætning står der x==0. I Python skal man skrive ==, når man vil undersøge om to størrelser er ens. Hvis du skriver x=1 i betingelsen i en if-sætning, vil Python give en en fejlmeddelelse.

  • Når man indlæser math får variablen e værdien af Eulers tal, e\approx 2,718281828459045, og pi er \pi \approx 3,141592653589793. Du kan sagtens bruge e og pi som almindelige variable. Men det selvfølgelig give dig problemer hvis du definerer pi=4 ét sted i et program, og et andet sted regner med at pi har den sædvanlige værdi. Du kan også sagtens bruge e=-47.11, hvis du har brug for det. Det påvirker ikke den naturlige eksponentialfunktion exp(x) og heller ikke den naturlige logaritme (som i Python hedder log(x)).

Lidt mere teknisk:

  • I den første linje indlæses de matematiske funktionerne med kommandoen from math import *. Teknisk set kaldes mathfor et modul, så kommandoen indlæser modulet math. Den måde vi gør her på er lidt atypisk, men den gør det nemmere at skrive de matematiske formler. Normalt vil man i stedet bruge kommandoen import math as m, men det ville betyde, at man skulle m. foran de matematiske funktioner når man bruger dem. Fx. ville kvadroden være m.sqrt(x).. Og det er lidt besværligt og ligner ikke normale matematiske formler.

  • I eksemplerne her på siden giver det ikke problemer at importere math på den måde, men hvis du vil bruge programmer fra andre kilder, kan det være, at du skal være opmærksom på forskellen. Der findes også en matematikpakke, som kaldes numpy, som vi ikke bruger her. Hvis man vil bruge den, vil man typisk installere den med kommandoen import numpy as np, og kvadratroden vil så fx skulle skrives som np.sqrt(x).

  • Hvad sker der, hvis du ændre programmet, så det prøver at beregne kvadratroden af et negativt tal. Hint: Tilføj en linje efter linje 15, hvor du udskriver kvadratroden som i linje 9.

  • Hvad sker der, hvis du dividerer med nul?

Løkker: Tæl til ti

En anden vigtig funktion i et programmeringssprog som Python, er at gentage det samme flere gange. Enten et bestemt antal gange, eller indtil en bestemt betingelse er opfyldt. Det kaldes en løkke.

Python har to forskellige kommandoer, som kan bruges til at lave løkker. for-kommandoen og while-kommandoen. Vi ser på dem begge.

for-kommandoen

for-kommandoen er i sin grundfunktion meget enkel: Den udfører en eller flere kommandoer et bestemt antal gange. Antallet af gange bestemmes ofte ved hjælp af range som er en speciel funktion, som genererer heltal i et interval.

Det næste program bruger også en for-løkke, men antallet af gennemløb styres på en lidt anden måde. Variablen tegn indeholder en tekst (afgrænset af anførselstegn) og hvert tegn opfattes af computeren som et tal. Så tegn er egentlig en liste af talværdier. Programmet uskriver talværdien for hvert tegn i teksten.

while-løkken

Den anden løkke-kommando er while-kommandoen som udfører kommandoer så længe en betingelse er opfyldt. I det næste program benyttes det til at tælle til ti på en anden måde, end vi gjorde med for-løkken:

  • Modificer programmet, så det både printer i og værdien af \sqrt{i^2+1} for i fra 1 til 25. Hint: det kræver at du importerer math modulet som vi på i et tidligere eksempel.

Vi vil nu bruge while-kommandoen til at opbygge en liste over x-værdier (det vil vi bruge i næste eksempel til at lave en graf for en funktion). I python skrives en liste som en række værdier adskilt af komma og omgivet af kantede parenteser. Fx [4, 7, 11]. En tom liste skrives som []. Programmet tilføjer x-værdier til listen fra en startværdi til en slutværdi og udskriver derefter listen:

Tekniske bemærkninger:

  • Når du kører programmet kan det se ud som om det ikke regner rigtigt: Det sidste tal i listen er ikke 2,0, men omkring 1,95. Det skyldes at tal i en computer bliver gemt i et format, der kaldes flydende kommatal. Det gør at tallene ikke er helt præcise, men meget tæt på. Hvis skridt bliver gemt som et tal, som er lidt større end 0,05, vil der være en lille fejl, som vokser, hvergang vi lægger det til x-værdien. Derfor ender vi i den situation, at det sidste tal er lidt større end 1,95 og hvis vi lægger skridt til det får vi et tal, som er lidt større end 2.0 og derfor stopper while-løkken.

  • Hvis det er vigtigt at få det sidste punkt i listen til at være slutværdien, kan sørge for at stoppe lidt førs slurtværdien, og så tilføje den bagefter, som vist i dette program:

Lav en graf

Vi skal nu se på, hvad der sker bag kulisserne, når du beder dit CAS-værktøj om at lave en graf for en funktion. Programmet laver både en liste over x-værdier og en liste over til tilhørende funktions-værdier for en funktion f(x). De to lister bruges så til at plotte grafen for f(x).

Vi får derfor brug for at definere en funktion. Det sker i linjerne 7 og 8 i programmet. I linjerne 26-32 laves grafen for funktionen. Når du bruger dit CAS-værktøj til at lave en graf, gør det netop som

  • Modificer programmet så det det tegner grafen for funktionen f(x)= 2·(1-\mathrm e^{-x}) fra x=-2 til x=5

  • Hvad sker der med grafen, hvis du fjerner en eller flere af linjerne fra 27 til 31? Hint: Du behøver ikke slette linjerne. Du kan bare indsætte et # i starten af linjen. Det laver den om til en kommentar.

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ærdie 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 beregenes 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

Eulers metode

Feigenbaum