Python for realfag (9788245033809)

Page 1

Vil du lære å programmere i Python for å løse numeriske problemer innen realfag? Da har du funnet rett bok! Boken er skrevet for studenter og ansatte ved universiteter og høgskoler, elever og lærere i videregående skoler, samt fagfolk i forskning, utvikling og industri. Boken har to deler: Del 1 Grunnleggende Python-programmering: Gir en trinn-for-trinn-innføring i Python-programmering, inkludert effektive beregninger med Numpy-pakken og plotting med Matplotlib-pakken. Del 2 Anvendt Python-programmering: Dekker spennende og viktige realfaglige anvendelser. Boken inneholder oppgaver med detaljerte løsninger. Alle programmene som inngår i eksempler og løsninger, er tilgjengelige via lenker angitt i boken.

ph.d., dosent i automatiseringsteknikk (teknisk kybernetikk)

ph.d., professor i matematikk med simulering og modellering som hovedområder

Begge arbeider ved Universitetet i Sørøst-Norge (USN), campus Porsgrunn.

ISBN 978-82-450-3380-9

,!7II2E5-addiaj!




Copyright © 2020 by Vigmostad & Bjørke AS All Rights Reserved 1. utgave / 1. opplag 2020 ISBN: 978-82-450-3380-9 Grafisk produksjon: John Grieg, Bergen Omslagsdesign ved forlaget Omslagsillustrasjon ved Paulina Mingiacchi Sats ved Finn Aakre Haugen

Spørsmål om denne boken kan rettes til: Fagbokforlaget Kanalveien 51 5068 Bergen Tlf.: 55 38 88 00 e-post: fagbokforlaget@fagbokforlaget.no www.fagbokforlaget.no Materialet er vernet etter åndsverkloven. Uten uttrykkelig samtykke er eksemplarfremstilling bare tillatt når det er hjemlet i lov eller avtale med Kopinor.


Innhold I

Grunnleggende Python-programmering

1 Innledning 1.1

21 23

Hvorfor lære å programmere? . . . . . . . . . . . . . . . . . . . . . . .

23

1.1.1

Anvendelser . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

23

1.1.2

Undervisning . . . . . . . . . . . . . . . . . . . . . . . . . . . .

24

1.2

Program med inndata og utdata . . . . . . . . . . . . . . . . . . . . . .

24

1.3

Om Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

27

1.3.1

Python – kort fortalt . . . . . . . . . . . . . . . . . . . . . . . .

27

1.3.2

Hvorfor satse på Python? . . . . . . . . . . . . . . . . . . . . .

27

1.3.3

Hvor populært er Python? . . . . . . . . . . . . . . . . . . . . .

27

1.3.4

Når er Python ikke aktuelt? . . . . . . . . . . . . . . . . . . . .

29

1.3.5

Hvem temmer Python? . . . . . . . . . . . . . . . . . . . . . . .

29

1.4

Skrivemåter i boken . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

29

1.5

Om bokens innhold . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

31

1.6

Oppgaver til kapittel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

1.7

Løsninger til kapittel 1 . . . . . . . . . . . . . . . . . . . . . . . . . . .

32

2 Programmeringsmiljøer for Python

33

2.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

2.2

Anaconda . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

33

3


PYTHON FOR REALFAG

2.3

Spyder . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

34

2.3.1

Hvordan åpne Spyder . . . . . . . . . . . . . . . . . . . . . . . .

34

2.3.2

Hvordan kjøre Python-programkode i Spyder . . . . . . . . . . .

36

2.3.2.1

Kjøre programkode på konsollens kommandolinje . . .

36

2.3.2.2

Kjøre programkode via skript . . . . . . . . . . . . . .

38

Eksempler på beregninger med Python . . . . . . . . . . . . . .

40

2.3.3.1

Python som kalkulator . . . . . . . . . . . . . . . . . .

40

2.3.3.2

Et Python-program for beregning og plotting . . . . .

41

2.3.4

Innstilling av Spyder . . . . . . . . . . . . . . . . . . . . . . . .

46

2.3.5

Hjelp i Spyder . . . . . . . . . . . . . . . . . . . . . . . . . . . .

48

2.3.5.1

Hjelp til å finne kode som du kan skrive i ditt program

48

2.3.5.2

Hjelp til å finne syntaksfeil i din programkode . . . . .

48

2.3.5.3

Løpende informasjon i Spyder om funksjoners syntaks

49

2.3.3

2.4

2.5

2.6

Jupyter Notebook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

49

2.4.1

Hvordan starte Jupyter Notebook . . . . . . . . . . . . . . . . .

50

2.4.2

Hvordan lage og redigere Notebook-dokumenter . . . . . . . . .

51

2.4.3

Hvordan kjøre Notebook-dokumenter . . . . . . . . . . . . . . .

52

2.4.4

Hvordan lagre Notebook-dokumenter . . . . . . . . . . . . . . .

53

2.4.5

Formatering av Notebook-dokumenter . . . . . . . . . . . . . .

53

2.4.6

Hjelp i Jupyter Notebook . . . . . . . . . . . . . . . . . . . . .

55

Visual Studio Code . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

56

2.5.1

Hvordan installere og starte Visual Studio Code . . . . . . . . .

56

2.5.2

Kople Python til VS Code

. . . . . . . . . . . . . . . . . . . .

57

2.5.3

Åpne (lage) arbeidsområde . . . . . . . . . . . . . . . . . . . . .

57

2.5.4

Hvordan lage og kjøre et Python-program . . . . . . . . . . . .

58

Python-kommandolinjen i Anaconda-kommandovinduet . . . . . . . . .

59

4


INNHOLD

2.7

Import og bruk av funksjonspakker og -moduler . . . . . . . . . . . . .

60

2.7.1

Pakker og pakkebehandling med conda eller pip . . . . . . . . .

60

2.7.1.1

Pakker . . . . . . . . . . . . . . . . . . . . . . . . . . .

60

2.7.1.2

Pakkebehandling . . . . . . . . . . . . . . . . . . . . .

60

2.7.2

Innebygde funksjoner i Python (standardpakken) . . . . . . . .

61

2.7.3

Import av pakker i Anaconda-distribusjonen . . . . . . . . . . .

62

2.7.3.1

Tilgjengelige pakker for Python . . . . . . . . . . . . .

62

2.7.3.2

Opplisting av pakker som er installert på PC-en . . . .

62

2.7.3.3

Hvordan importere pakker som er installert på PC-en .

63

2.7.3.4

Hvordan importere moduler som inngår i pakker . . .

64

Installering og import av pakker som ikke følger med Anacondadistribusjonen . . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

2.8

Oppgaver til kapittel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . .

65

2.9

Løsninger til kapittel 2 . . . . . . . . . . . . . . . . . . . . . . . . . . .

67

2.7.4

3 Variabler og datatyper

73

3.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

73

3.2

Hvordan kjøre kodeeksemplene? . . . . . . . . . . . . . . . . . . . . . .

73

3.3

Variabler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

74

3.3.1

Hva er en variabel? . . . . . . . . . . . . . . . . . . . . . . . . .

74

3.3.2

Hvorfor bruke variabler når vi kunne brukt verdier direkte? . . .

75

3.3.3

Hvordan velge variabelnavn . . . . . . . . . . . . . . . . . . . .

76

3.4

Litt om funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

77

3.5

Tall og grunnleggende matematiske operasjoner . . . . . . . . . . . . .

79

3.5.1

Talltyper . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

79

3.5.2

Hvordan formatere tall i print()-funksjonen . . . . . . . . . . . .

79

3.5.3

Matematiske operatorer . . . . . . . . . . . . . . . . . . . . . .

81

5


PYTHON FOR REALFAG

3.6

Tekststrenger (strings) . . . . . . . . . . . . . . . . . . . . . . . . . . .

83

3.7

Fra tall til tekst og fra tekst til tall . . . . . . . . . . . . . . . . . . . .

84

3.8

Boolske variabler, logiske operatorer og sammenlikningsoperatorer . . .

86

3.8.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

86

3.8.2

Boolske variabler . . . . . . . . . . . . . . . . . . . . . . . . . .

87

3.8.3

Logiske operatorer . . . . . . . . . . . . . . . . . . . . . . . . .

88

3.8.4

Sammenlikningsoperatorer . . . . . . . . . . . . . . . . . . . . .

89

Lister (lists) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

3.9.1

Hva er lister? . . . . . . . . . . . . . . . . . . . . . . . . . . . .

90

3.9.2

Operasjoner paĚŠ lister . . . . . . . . . . . . . . . . . . . . . . . .

92

3.9.2.1

Lese listeelementer . . . . . . . . . . . . . . . . . . . .

92

3.9.2.2

Hvordan oppdatere listeelementer med nye verdier . .

94

3.9.2.3

Utvide lister med nye elementer . . . . . . . . . . . . .

95

3.9.2.4

Fjerne listeelementer . . . . . . . . . . . . . . . . . . .

97

3.9.2.5

Listemanipulering med + og * . . . . . . . . . . . . . .

98

3.10 Tupler . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

3.9

3.11 Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 3.12 Arrayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.12.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 3.12.2 Hvordan konvertere lister til arrayer og motsatt . . . . . . . . . 103 3.12.2.1 Konvertering fra liste til array . . . . . . . . . . . . . . 103 3.12.2.2 Konvertering fra array til liste . . . . . . . . . . . . . . 104 3.12.3 Lage arrayer med spesiell utforming . . . . . . . . . . . . . . . . 104 3.12.3.1 Arrayer med like elementverdier . . . . . . . . . . . . . 104 3.12.3.2 Array med fast inkrement mellom elementene . . . . . 106 3.12.3.3 Flerdimensjonale eller n-dimensjonale arrayer . . . . . 108 6


INNHOLD

3.12.4 Operasjoner på arrayer . . . . . . . . . . . . . . . . . . . . . . . 109 3.12.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 109 3.12.4.2 Størrelsen av en array . . . . . . . . . . . . . . . . . . 109 3.12.4.3 Lese elementverdier i en array . . . . . . . . . . . . . . 110 3.12.4.4 Oppdatere elementer i en array . . . . . . . . . . . . . 112 3.12.4.5 Utvide arrayer med nye elementer . . . . . . . . . . . . 113 3.12.4.6 Fjerne elementer fra arrayer . . . . . . . . . . . . . . . 113 3.12.4.7 Finne maksimum og minimum i arrayer . . . . . . . . 114 3.12.5 Matematiske operasjoner på arrayer, inkl. matriser . . . . . . . 115 3.12.5.1 Addisjon med skalar og multiplikasjon med skalar . . . 115 3.12.5.2 Hvordan lage radvektorer og kolonnevektorer og matriser116 3.12.5.3 Vektor- og matrisemultiplikasjoner . . . . . . . . . . . 119 3.12.6 Matrisefunksjoner for lineæralgebra . . . . . . . . . . . . . . . . 122 3.12.7 Vektoriserte beregninger . . . . . . . . . . . . . . . . . . . . . . 123 3.13 Oppgaver til kapittel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 127 3.14 Løsninger til kapittel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 4 Plotting med Matplotlib

149

4.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

4.2

Kurveplott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 4.2.1

Plott av temperaturer i Skien – revisited . . . . . . . . . . . . . 149

4.2.2

Flere enn ett figurvindu? . . . . . . . . . . . . . . . . . . . . . . 150

4.2.3

Vise plott i Plots-fanen i Help-vinduet eller i eksternt vindu? . . 150 4.2.3.1

Plottfigurer vist i Plots-fanen i Help-vinduet . . . . . . 151

4.2.3.2

Plottfigur vist i et eksternt vindu . . . . . . . . . . . . 151

4.2.4

Hvordan lagre figur på fil automatisk . . . . . . . . . . . . . . . 152

4.2.5

Subplott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153 7


PYTHON FOR REALFAG

4.2.6

Hvordan sette størrelsen av figurvinduet . . . . . . . . . . . . . 154

4.2.7

Matematiske symboler i diagramtittel o.l. . . . . . . . . . . . . . 155

4.3

Stolpediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156

4.4

Kakediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158

4.5

Histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

4.6

Oppgaver til kapittel 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 160

4.7

Løsninger til kapittel 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 162

5 Programmering av funksjoner

169

5.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169

5.2

Hvordan programmere funksjoner . . . . . . . . . . . . . . . . . . . . . 170 5.2.1

Grunnleggende funksjonsdefinisjon . . . . . . . . . . . . . . . . 170

5.2.2

Hvordan returnere flere enn én verdi . . . . . . . . . . . . . . . 172

5.2.3

Funksjonsargumenter med standardverdi . . . . . . . . . . . . . 173

5.2.4

Funksjonskall med bruk av keyword-argument . . . . . . . . . . 174

5.2.5

*args og **kwargs . . . . . . . . . . . . . . . . . . . . . . . . . . 175

5.2.6

Dokumentasjonstekst (docstring) . . . . . . . . . . . . . . . . . 176

5.2.7

Navnerom (namespace) . . . . . . . . . . . . . . . . . . . . . . . 178

5.3

Programmering av moduler . . . . . . . . . . . . . . . . . . . . . . . . 179

5.4

Lambda-funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181

5.5

Oppgaver til kapittel 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 182

5.6

Løsninger til kapittel 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 186

6 Testing av egen kode

197

6.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197

6.2

Hvordan teste for funksjonsfeil? . . . . . . . . . . . . . . . . . . . . . . 198

6.3

Hvordan kjøre kun en del av programmet? . . . . . . . . . . . . . . . . 202 8


INNHOLD

6.4

Oppgaver til kapittel 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 202

6.5

Løsninger til kapittel 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 205

7 Betingede programløp med if-strukturer

209

7.1

if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209

7.2

Et liv uten else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

7.3

elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

7.4

Oppgaver til kapittel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 213

7.5

Løsninger til kapittel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 214

8 Itererte programløp med for- og while-løkker

219

8.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 219

8.2

For-løkker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 8.2.1

Grunnleggende programmering av for-løkker . . . . . . . . . . . 220

8.2.2

Hvordan skrive til array-elementer i en for-løkke . . . . . . . . . 222

8.2.3

Preallokering av arrayer for sparing av kjøretid . . . . . . . . . . 223

8.3

While-løkker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

8.4

Oppgaver til kapittel 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

8.5

Løsninger til kapittel 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 229

9 Lese og skrive fildata

239

9.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

9.2

Filformater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 9.2.1

Tekstbaserte datafiler . . . . . . . . . . . . . . . . . . . . . . . . 239

9.2.2

Binærdatafiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

9.3

Lese dataserier fra fil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242

9.4

Skrive dataserier til fil . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

9.5

Excel-filer i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 9


PYTHON FOR REALFAG

9.5.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245

9.5.2

Lese data fra Excel-filer inn til Python . . . . . . . . . . . . . . 245

9.5.3

Skrive data fra Python til Excel . . . . . . . . . . . . . . . . . . 247

9.6

Oppgaver til kapittel 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 248

9.7

Løsninger til kapittel 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 253

10 Databehandling med Pandas

265

10.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 10.2 Byggeklossene i Pandas . . . . . . . . . . . . . . . . . . . . . . . . . . . 265 10.3 Manipulering av dataframes . . . . . . . . . . . . . . . . . . . . . . . . 269 10.4 Dataanalyse av dataframes . . . . . . . . . . . . . . . . . . . . . . . . . 272 10.5 Plotting av data i dataframes . . . . . . . . . . . . . . . . . . . . . . . 274 10.6 Oppgaver til kapittel 10 . . . . . . . . . . . . . . . . . . . . . . . . . . 274 10.7 Løsninger til kapittel 10 . . . . . . . . . . . . . . . . . . . . . . . . . . 276 11 Symbolske beregninger med Sympy

281

11.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 281 11.2 Lynkurs i symbolske beregninger . . . . . . . . . . . . . . . . . . . . . 282 11.3 Hvordan beregne tallverdier av symbolske uttrykk . . . . . . . . . . . . 283 11.3.1 evalf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 11.3.2 subs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 11.3.3 lambdify() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 11.4 Løsing av likninger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 11.4.1 Løsing av likninger med én ukjent . . . . . . . . . . . . . . . . . 287 11.4.2 Løsing av likninger med flere ukjente . . . . . . . . . . . . . . . 289 11.4.3 Løsing av differensiallikninger . . . . . . . . . . . . . . . . . . . 290 11.5 Manipuleringer av symbolske uttrykk . . . . . . . . . . . . . . . . . . . 292 10


INNHOLD

11.6 Symbolsk derivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 11.7 Symbolsk integrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 11.8 Matriseregning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 11.9 Jacobimatrise (partiellderivasjon av vektorfunksjon) . . . . . . . . . . . 297 11.10 Oppgaver til kapittel 11 . . . . . . . . . . . . . . . . . . . . . . . . . . 299 11.11 Løsninger til kapittel 11 . . . . . . . . . . . . . . . . . . . . . . . . . . 300

II

Anvendelser av Python-programmering

12 Numerisk derivasjon og integrasjon

305 307

12.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307 12.2 Numerisk derivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 12.2.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 308 12.2.2 Foroverderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 308 12.2.3 Bakoverderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 312 12.2.4 Senterderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . 314 12.2.5 Valg av skrittlengde . . . . . . . . . . . . . . . . . . . . . . . . . 315 12.3 Numerisk integrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 12.3.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 316 12.3.2 Foroverintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . 316 12.3.3 Bakoverintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . 322 12.3.4 Trapesintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 323 12.3.5 Negativt areal? . . . . . . . . . . . . . . . . . . . . . . . . . . . 325 12.4 Oppgaver til kapittel 12 . . . . . . . . . . . . . . . . . . . . . . . . . . 326 12.5 Løsninger til kapittel 12 . . . . . . . . . . . . . . . . . . . . . . . . . . 330 13 Løsing av likninger

335 11


PYTHON FOR REALFAG

13.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 13.2 Likningens form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 335 13.3 En god start: Plott! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 336 13.4 Newtons metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 338 13.5 Oppgaver til kapittel 13 . . . . . . . . . . . . . . . . . . . . . . . . . . 343 13.6 Løsninger til kapittel 13 . . . . . . . . . . . . . . . . . . . . . . . . . . 344 14 Simulering av dynamiske systemer

347

14.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 14.2 Hva er dynamiske systemer? . . . . . . . . . . . . . . . . . . . . . . . . 348 14.3 FramgangsmaĚŠte for utvikling av simulatorer . . . . . . . . . . . . . . . 349 14.4 Simulator for et termisk system . . . . . . . . . . . . . . . . . . . . . . 350 14.4.1 Systembeskrivelse . . . . . . . . . . . . . . . . . . . . . . . . . . 350 14.4.2 Modellering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 14.4.3 Diskretisering (simulatoralgoritmen) . . . . . . . . . . . . . . . 353 14.4.4 Programmering . . . . . . . . . . . . . . . . . . . . . . . . . . . 356 14.4.5 Simulering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 14.4.6 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 360 14.4.6.1 Statisk test av simuleringen . . . . . . . . . . . . . . . 361 14.4.6.2 Dynamisk test av simuleringen . . . . . . . . . . . . . 362 14.4.7 Valg av simulatoralgoritmens tidsskritt . . . . . . . . . . . . . . 363 14.5 Simulatoralgoritme for mengdesystemer . . . . . . . . . . . . . . . . . . 366 14.6 Simulatoralgoritme for bevegelsessystemer . . . . . . . . . . . . . . . . 372 14.7 Simulator for tidsforsinkelse . . . . . . . . . . . . . . . . . . . . . . . . 379 14.8 Simulering i sann tid eller skalert sann tid . . . . . . . . . . . . . . . . 383 14.8.1 Realisering av simulering i (skalert) sann tid . . . . . . . . . . . 383 14.8.2 Kontinuerlig oppdatert plott . . . . . . . . . . . . . . . . . . . . 385 12


INNHOLD

14.8.3 Justering av parametre mens simulatoren kjører . . . . . . . . . 388 14.9 Animering med Pygame . . . . . . . . . . . . . . . . . . . . . . . . . . 390 14.10 Oppgaver til kapittel 14 . . . . . . . . . . . . . . . . . . . . . . . . . . 391 14.11 Løsninger til kapittel 14 . . . . . . . . . . . . . . . . . . . . . . . . . . 400 15 Optimering

411

15.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411 15.2 Formulering av optimeringsproblemer . . . . . . . . . . . . . . . . . . . 411 15.3 Noen typiske trekk ved objektfunksjonen . . . . . . . . . . . . . . . . . 414 15.4 Hvordan løse optimeringsproblemer . . . . . . . . . . . . . . . . . . . . 416 15.4.1 Oversikt over løsningsmetoder . . . . . . . . . . . . . . . . . . . 416 15.4.1.1 Analytisk metode . . . . . . . . . . . . . . . . . . . . . 416 15.4.1.2 Grid-metoden . . . . . . . . . . . . . . . . . . . . . . . 416 15.4.1.3 Iterativ metode . . . . . . . . . . . . . . . . . . . . . . 417 15.4.1.4 Kombinasjon av grid-metoden og en iterativ metode . 418 15.4.2 Analytisk løsning . . . . . . . . . . . . . . . . . . . . . . . . . . 418 15.4.3 Grid-metoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419 15.4.3.1 Prinsippet . . . . . . . . . . . . . . . . . . . . . . . . . 419 15.4.3.2 Implementering i et program . . . . . . . . . . . . . . 420 15.4.3.3 Optimering med én optimeringsvariabel . . . . . . . . 422 15.4.3.4 Optimering med to optimeringsvariabler uten ulikhetsbegrensning . . . . . . . . . . . . . . . . . . . . . . . . 424 15.4.3.5 Optimering med to optimeringsvariabler med ulikhetsbegrensning . . . . . . . . . . . . . . . . . . . . . . . . 427 15.4.3.6 Lineær objektfunksjon med ulikhetsbegrensninger . . . 428 15.4.4 Hvordan teste at du virkelig har funnet minimum . . . . . . . . 432 15.5 Oppgaver til kapittel 15 . . . . . . . . . . . . . . . . . . . . . . . . . . 434 15.6 Løsninger til kapittel 15 . . . . . . . . . . . . . . . . . . . . . . . . . . 438 13


PYTHON FOR REALFAG

16 Modelltilpassing til data

445

16.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445 16.2 Prinsippet for modelltilpassing . . . . . . . . . . . . . . . . . . . . . . . 445 16.3 Modelltilpassing av statiske modeller . . . . . . . . . . . . . . . . . . . 447 16.4 Modelltilpassing av dynamiske modeller . . . . . . . . . . . . . . . . . . 456 16.5 Oppgaver til kapittel 16 . . . . . . . . . . . . . . . . . . . . . . . . . . 461 16.6 Løsninger til kapittel 16 . . . . . . . . . . . . . . . . . . . . . . . . . . 463 17 Statistikk og sannsynlighetsregning

469

17.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 17.2 Utfallsrom og populasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 469 17.3 Simulering av stokastiske forsøk . . . . . . . . . . . . . . . . . . . . . . 470 17.3.1 Hvorfor simulere? . . . . . . . . . . . . . . . . . . . . . . . . . . 470 17.3.2 Simulering med choice() . . . . . . . . . . . . . . . . . . . . . . 471 17.3.3 Repetere samme tilfeldige uttrekk? . . . . . . . . . . . . . . . . 475 17.4 Statistiske maĚŠl

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476

17.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 476 17.4.2 Middelverdi, varians og standardavvik . . . . . . . . . . . . . . 477 17.4.2.1 Middelverdi . . . . . . . . . . . . . . . . . . . . . . . . 477 17.4.2.2 Varians . . . . . . . . . . . . . . . . . . . . . . . . . . 477 17.4.2.3 Standardavvik . . . . . . . . . . . . . . . . . . . . . . 478 17.4.3 Forventningsverdi . . . . . . . . . . . . . . . . . . . . . . . . . . 481 17.5 Sannsynlighetsfordelinger . . . . . . . . . . . . . . . . . . . . . . . . . . 483 17.5.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 17.5.2 Noen sannsynlige definisjoner . . . . . . . . . . . . . . . . . . . 483 17.5.3 Diskret sannsynlighetsfordeling . . . . . . . . . . . . . . . . . . 484 17.5.4 Hyppighetsfordeling . . . . . . . . . . . . . . . . . . . . . . . . . 486 14


INNHOLD

17.5.5 Kontinuelig fordeling: Normalfordelingen . . . . . . . . . . . . . 490 17.5.5.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 490 17.5.5.2 Teoretisk normalfordeling . . . . . . . . . . . . . . . . 492 17.5.5.3 Simulering av normalfordeling . . . . . . . . . . . . . . 493 17.5.6 Kontinuelig fordeling: Uniform fordeling . . . . . . . . . . . . . 496 17.5.6.1 Teoretisk uniform fordeling . . . . . . . . . . . . . . . 496 17.5.6.2 Simulering av uniform fordeling . . . . . . . . . . . . . 497 17.6 Hvordan estimere sannsynligheten for hendelser i stokastiske forsøk? . . 500 17.7 Oppgaver til kapittel 17 . . . . . . . . . . . . . . . . . . . . . . . . . . 506 17.8 Løsninger til kapittel 17 . . . . . . . . . . . . . . . . . . . . . . . . . . 509 18 Signalfiltrering

515

18.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 18.2 Middelverdifilter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 516

18.2.1 Filteralgoritmen . . . . . . . . . . . . . . . . . . . . . . . . . . . 516 18.2.2 Noen egenskaper ved middelverdifilteret . . . . . . . . . . . . . 520 18.2.2.1 Filterets lavpassegenskaper . . . . . . . . . . . . . . . 520 18.2.2.2 Tidsforskyvning gjennom filteret . . . . . . . . . . . . 520 18.2.2.3 Støydempning gjennom filteret . . . . . . . . . . . . . 520 18.3 Tidskonstantfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 18.3.1 Filteralgoritmen . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 18.3.2 Noen egenskaper ved filteret . . . . . . . . . . . . . . . . . . . . 523 18.3.2.1 Filterets lavpassegenskaper . . . . . . . . . . . . . . . 523 18.3.2.2 Tidsforskyvning gjennom filteret . . . . . . . . . . . . 523 18.3.2.3 Støydempning gjennom filteret . . . . . . . . . . . . . 523 18.3.2.4 En sammenheng mellom tidskonstantfilter og middelverdifilter . . . . . . . . . . . . . . . . . . . . . . . . . 523 15


PYTHON FOR REALFAG

18.3.2.5 Hvordan skal vi stille inn filtertidskonstanten? . . . . . 524 18.4 Høypassfilter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524

18.5 Oppgaver til kapittel 18 . . . . . . . . . . . . . . . . . . . . . . . . . . 525 18.6 Løsninger til kapittel 18 . . . . . . . . . . . . . . . . . . . . . . . . . . 526 19 Automatisk regulering

529

19.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 529 19.2 Reguleringssystemers struktur og virkemåte . . . . . . . . . . . . . . . 529 19.2.1 Manuell regulering . . . . . . . . . . . . . . . . . . . . . . . . . 529 19.2.2 Automatisk regulering . . . . . . . . . . . . . . . . . . . . . . . 530 19.3 Regulatoralgoritmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 19.3.1 P-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 531 19.3.2 PI-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536 19.3.3 Av/på-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . 540 19.3.4 Foroverkopling . . . . . . . . . . . . . . . . . . . . . . . . . . . 546 19.4 Hvordan kjøre et regulatorprogram i sann tid

. . . . . . . . . . . . . . 549

19.5 Oppgaver til kapittel 19 . . . . . . . . . . . . . . . . . . . . . . . . . . 550 19.6 Løsninger til kapittel 19 . . . . . . . . . . . . . . . . . . . . . . . . . . 553 20 Programmering av praktisk utstyr

557

20.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 20.2 Microbit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 20.2.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 557 20.2.2 Mikrobeskrivelse av Microbit . . . . . . . . . . . . . . . . . . . . 558 20.2.2.1 Oversikt . . . . . . . . . . . . . . . . . . . . . . . . . . 558 20.2.2.2 Programmeringsspråk . . . . . . . . . . . . . . . . . . 559 20.2.2.3 Maskinvare . . . . . . . . . . . . . . . . . . . . . . . . 559 16


INNHOLD

20.2.2.4 Tilleggsutstyr til Microbit . . . . . . . . . . . . . . . . 559 20.2.3 Prosedyre for programmering av Microbit . . . . . . . . . . . . 560 20.2.4 MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . 561 20.2.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 561 20.2.4.2 MicroPython-programmering i Microbits editor . . . . 561 20.2.4.3 MicroPython-programmering i editoren Mu . . . . . . 563 20.3 Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568 20.3.1 Hva er Raspberry Pi? . . . . . . . . . . . . . . . . . . . . . . . . 568 20.3.2 Hvilket tilleggsutstyr trenger du? . . . . . . . . . . . . . . . . . 568 20.3.2.1 Standard skjerm, tastatur og mus . . . . . . . . . . . . 568 20.3.2.2 Mini-berøringsskjerm . . . . . . . . . . . . . . . . . . . 569 20.3.2.3 Tilleggsutstyr . . . . . . . . . . . . . . . . . . . . . . . 570 20.3.3 Programmering av Raspberry Pi . . . . . . . . . . . . . . . . . . 570 20.4 Oppgaver til kapittel 20 – ingen . . . . . . . . . . . . . . . . . . . . . . 571 Referanser

573

Register

574

17



Forord Vi har skrevet denne boken for alle som vil lære å programmere løsninger på realfaglige problemer i Python. Vi tror at boken vil være nyttig for studenter og ansatte ved universiteter og høgskoler, elever og lærere i videregående skoler og fagfolk i forskning, utvikling og industri. Litt om vår bakgrunn: • Finn: Jeg er dosent ved Universitetet i Sørøst-Norge (USN), campus Porsgrunn. Min utdanning er sivilingeniør i elektro/teknisk kybernetikk fra tidligere Norges tekniske høgskole i 1986 og doktorgrad (ph.d.) fra tidligere Høgskolen i Telemark. Jeg har lang erfaring fra undervisning ved universiteter og høgskoler og kursvirksomhet for industrien og har også arrangert fagdager for elever ved videregående skoler i Grenland. Jeg har brukt programmering til problemløsing i teknisk kybernetikk siden 80-tallet. • Marius: Jeg er professor i matematikk med simulering og modellering som hovedområder ved USN, campus Porsgrunn. Siden 2010 har jeg undervist i matematikk, algoritmisk tenkning og programmering i Python ved ingeniørstudiet. I perioden 2004–2012 jobbet jeg med matematiske modeller og utvikling av algoritmer ved Simula Research Laboratory i Oslo. Jeg har gjennom flere år vært partner i senteret for fremragende undervisning – Center for Computing in Science Education, UiO. Jeg har en doktorgrad (ph.d.) i anvendt matematikk fra Universitet i Bergen (2004). Programmering i Python inngår i fagene vi underviser, og vi bruker Python i forskningsprosjekter. Python er blitt et av de mest populære programmeringsspråkene i verden. Det skyldes at Python er brukervennlig, kraftig og helt gratis! Python er et engelskspråklig programmeringsspråk i den forstand at terminologien i programmeringsmiljøene og i dokumentasjonen er på engelsk. Etter vår mening er det fornuftig å bruke den opprinnelige engelske terminologien og ikke finne opp norsk Python-terminologi, med mindre det faller helt naturlig. En alternativ skyggeterminologi kan skape misforståelser. Ellers bruker vi selvsagt norske ord og uttrykk der det er naturlig. 19


I boken viser vi hvordan du kan programmere algoritmer fra scratch, f.eks. algoritmer for numerisk integrasjon og simulering. Vi tror at du dermed vil utvikle en grunnleggende forståelse av matematisk problemløsing med algoritmer samtidig som du lærer programmering. Boken er basert på såkalt prosedyreorientert (engelsk: procedural programming), som vi kan betrakte som tradisjonell programmering. Python gir også mulighet for objektorientert programmering (engelsk: object-oriented programming – OOP), men boken beskriver ikke slik programmering. Boken har to deler. Del 1 – Grunnleggende Python-programmering omfatter bl.a. plotting med Matplotlib-pakken og numerisk databehandling med Numpy-pakken basert på sin array-datatype, eller strengt tatt: numpy.ndarray1 , og sine funksjoner for effektiv matematisk programmering. Del 2 – Anvendt Python-programmering dekker viktige og spennende realfaglige anvendelser. Boken inneholder mange eksempler. Noen av eksemplene illustrerer en metode eller framgangsmåte og følger etter at den aktuelle metoden er forklart. I andre eksempler introduserer vi en metode. Lenker til programmene er angitt i boken. Programmene er også listet opp på bokens hjemmeside på http://techteach.no/python. Et undervisningsopplegg for læring av Python-programmering må selvsagt inkludere øvingsoppgaver. Vi har lagt inn oppgaver med detaljerte løsninger i slutten av hvert kapittel. I løsningene til oppgavene i del 1 av boken er programkoden gjengitt. I løsningene i del 2 har vi valgt kun å angi lenker til programmene fordi programmene i del 2 gjerne er relativt store. Programmene er også listet opp på bokens hjemmeside på http://techteach.no/python. Hvis du underviser studenter eller elever, kan du bruke oppgaver i boken direkte eller som grunnlag for dine egne oppgaver. Vi har valgt å bruke samme fonttype og fontstørrelse på både vanlig tekst og pythonske (Python-spesifikke) navn og begreper. Det framgår av konteksten hva som er norsk og hva som er pythonsk. Boken er basert på Python 3.7 som kjører på en PC med Windows 10. Takk til alle som har bidratt med kommentarer og innspill til boken! Vi nevner spesielt Adrian Bergflødt for nitidig sjekk av kode og tekst. Vi håper boken er lærerik og lett å lese. Dersom du har kommentarer til boken, kan du gjerne sende dem til en av våre e-postadresser angitt nedenfor.

Med hilsen Finn Aakre Haugen finn.haugen@usn.no 1

Marius Lysaker marius.lysaker@usn.no

n-dimensjonal array

20


Del I

Grunnleggende Python-programmering

21



Kapittel 1

Innledning 1.1

Hvorfor lære å programmere?

Det kan være gode grunner for å lære å programmere, enten du er student, elev, lærer, forsker, systemutvikler, ingeniør, kunstner o.a. Nedenfor gir vi noen stikkord med anvendelser og undervisning som perspektiv.

1.1.1

Anvendelser

Her er noen anvendelsesområder av programmering: • Informasjonsdeling • Kommunikasjon • Underholdning • Datalagring og databehandling • Spill • Løsing av matematiske problemer • Simulering, inkl. prediksjon • Optimering • Matematisk modellering • Monitorering • Automatisk styring • Signalbehandling, f.eks. støyfiltrering 23


PYTHON FOR REALFAG

• Eksperimentering med praktisk utstyr • m.m. Nå er det er ganske opplagt at programmering er viktig for anvendelser av programmering. Spørsmålet er heller om anvendelsene, som ovenfor, er nyttige for enkeltmennesker og samfunnet? Hva mener du?

1.1.2

Undervisning

Vi (forfattere) er fagfolk innen teknologi, men også undervisere. Vi mener at programmering kan spille en viktig rolle i undervisning, siden programmering støtter sentrale undervisningsprinsipper, nemlig motivering, konkretisering, aktivisering, samarbeid og individualisering1 : • Motivering : Programmering motiverer for teori i matematikk og realfag fordi elever og studenter ser at programmering er nyttig for å anvende og konkretisere teori. Det er også motiverende å se at programmering er et svært viktig verktøy for å løse praktiske problemstillinger innen ulike fagfelt, som dataanalyse, matematisk modellering, simulering, automatisering m.m. med anvendelser innen teknologi og industri o.a. • Aktivisering : Gjennom programmering vil elever og studenter arbeide aktivt med teorien, og forståelse og læring av teorien utvikles. Programmering gir også økt mulighet til eksperimentering. En kan ha mye nytte av ferdiglagede programmer, men det er vår erfaring at det er mer lærerikt å programmere løsninger selv enn å bruke ferdiglagde programmer, som illustrert i figur 1.1. • Konkretisering : Programmering er en bro mellom teori og anvendelser, se figur 1.2. Med programmering kan teori og anvendelser knyttes sammen gjennom arbeid med konkrete problemstillinger. Dette utvikler forståelse og læring av teorien, og en kan også se i hvilken grad teorien duger i praksis. • Individualisering : Programmering gir gode muligheter til individuell tilpasning av undervisningen siden en kan arbeide eller prøve seg fram i eget tempo. • Samarbeid : Programmering gir også gode muligheter for samarbeid ved at elever eller studenter diskuterer løsninger og/eller bidrar i felles programmeringsoppgaver.

1.2

Program med inndata og utdata

Vi beskriver her programmering og data med et overordnet perspektiv. Et (Python-)program er en abstrakt ting . Du kan ikke ta på et program, og derfor kalles gjerne programvare for bløtvare, eller software på godt norsk. Når datamaskinens 1

= MAKIS

24


KAPITTEL 1. INNLEDNING

Figur 1.1: Gjennom programmering vil elever og studenter arbeide aktivt med teorien, og forståelse og læring utvikles.

Figur 1.2: Programmering er en bro mellom teori og anvendelser. mikroprosessor utfører instruksjonene som er uttrykt i programkoden, kjører (engelsk: run) programmet. Det er når det kjører, at det gjør noe, og det kan da betraktes som en prosess . Dette kapitlet skal utvikle en forståelse av de fundamentale aspektene ved denne prosessen, altså det kjørende programmet. Et Python-program som kjører, produserer utdata (engelsk: output) fra inndata (engelsk: input). Programmet har et arbeidsområde (pythonsk: workspace) som fungerer som et slags arbeidsbord for programmet. Figur 1.3 illustrerer programmet med inndata og utdata. Typiske Python-funksjoner som brukes for å håndtere dataene er angitt, f.eks. loadtxt() for å lese data fra fil. Du møter disse og mange andre funksjoner utover i boken. Her følger en beskrivelse av figur 1.3: • Arbeidsområdet (pythonsk: workspace) inneholder alle variablene med sine verdier. Arbeidsområdets innhold beholdes etter at programmet er stoppet og eksisterer fremdeles når det samme eller et annet program startes. Arbeidsområdet slettes automatisk når du går ut av programmeringsverktøyet (f.eks. Spyder). • Inndata (engelsk: input) er typisk tall- eller tekstdata som programmet bruker i sin databehandling. Inndatene eksisterer i arbeidsområdet. Inndatene kan ha flere kilder: 25


PYTHON FOR REALFAG

Figur 1.3: Et program med inndata og utdata. – Variabler med verdier definert i selve programmet, f.eks. array-variablene mnd og temp i programmet vist i figur 2.9. Dette er nok den vanligste inndatakilden til programmer. – Tastaturet der vi har skrevet tekst eller tall. Dataene kan leses inn til arbeidsområdet med Pythons input()-funksjon, som er nærmere beskrevet i kap. 3.7. – Fil med tekst- eller talldata. Dataene kan leses inn fra filen til arbeidsområdet med den generelle open()-funksjonen. Hvis dataene er talldata i form av tekst som vi kan lese med det blotte øye, er loadtxt()-funksjonen i numpy-pakken mer hensiktsmessig enn open()-funksjonen. Bruk av loadtxt() beskrives i kap. 9.3. – Port, dvs. en kommunikasjonsport på datamaskinen. En typisk anvendelse er kontinuerlig innlesing av måledata fra måleelementer (sensorer) som genererer spenningsverdier som, etter at de er omdannet til digitale verdier, leses inn via en USB-port. Kap. 20 går nærmere inn på dette. • Utdata (engelsk: output) er typisk tall- eller tekstdata som programmet genererer når det kjører. Utdataene eksisterer i arbeidsområdet. Utdataene kan ha flere mottakere: – Arbeidsområdet selv. Variabler som får sine verdier som resultat av programkjøringen, er tilgjengelige for bruk i programkoden som kjører. – Konsollen e.l. i det aktuelle programmeringsverktøyet, f.eks. konsollen i Spyder, se nede til høyre i figur 2.9. print()-funksjonen, som vi møter gjennom hele boken, brukes til å skrive tall- eller tekstverdier til konsollen. plot()-funksjonen i numpy-pakken kan brukes til å plotte data i figurer i konsollen (ev. i eksterne figurer). – Fil. Data i arbeidsområdet kan skrives til fil vha. den generelle open()-funksjonen. Hvis dataene er talldata i form av tekst , er savetxt()-funksjonen i numpy-pakken mer hensiktsmessig enn open()-funksjonen. Bruk av savetxt() beskrives i kap. 9.4. 26


KAPITTEL 1. INNLEDNING

– Port. En typisk anvendelse er kontinuerlig skriving av styresignaler som vårt Python-program har beregnet, til såkalte pådragsorganer som motorer, pumper, ventiler, varmeelementer, lamper, brytere osv. via en USB-port. Jf. kap. 20.

1.3 1.3.1

Om Python Python – kort fortalt

Python er et programmeringsspråk utviklet av Guido van Rossum. Python ble lansert i 1991 og utvikles kontinuerlig. Gjennom denne boken vil du lære grunnleggende Python-programmering og å bruke Python til å finne numeriske løsninger på matematiske problemer. Python kan også brukes til mange andre anvendelser enn beregninger, bl.a. tekstprosessering, filbehandling og datakommunikasjon, men denne boken fokuserer altså på bruk av Python til beregninger.

1.3.2

Hvorfor satse på Python?

Det fins mange alternative programmeringsspråk. Hvorfor satse på Python? Noen grunner: • Python er gratis. • Python kan kjøres på ulike plattformer: Windows, Mac og Linux. • Python er et kraftig språk for beregninger (på nivå med MATLAB). • Python får (egentlig: tvinger) programmereren til å lage programkode med god visuell struktur. • Python er populært og utbredt. (Hvis bruk av et programmeringsspråk på en eller annen måte er påtvunget, kan utbredelsen være større enn populariteten, men siden Python er et fritt tilgjengelig språk som har eksistert i snart 30 år, kan vi regne med at popularitet og utbredelse går hånd-i-hånd.) • Svært mye materiell er fritt tilgjengelig på nettet.

1.3.3

Hvor populært er Python?

StackOverflow-vurdering På StackOverflow2 , som driver et populært websted for programmerere (hvis du søker etter programmeringshjelp på Google, er StackOverflow gjerne blant de høyeste på trefflisten – det kan ha ulike årsaker, selvsagt), kan vi lese: 2

https://stackoverflow.blog/2017/09/06/incredible-growth-python/

27


PYTHON FOR REALFAG June 2017 was the first month that Python was the most visited tag on Stack Overflow within high-income nations. This included being the most visited tag within the US and the UK, and in the top 2 in almost all other high income nations (next to either Java or JavaScript). This is especially impressive because in 2012, it was less visited than any of the other 5 languages, and has grown by 2.5-fold in that time.

Figur 1.4 viser populariteten av velkjente programmeringsspråk målt i antall henvendelser til StackOverflow i perioden 2009–2019. Python er på topp i 2019. (Strengt tatt kan en tenke seg at et stort antall henvendelser ikke bare skyldes popularitet.)

Figur 1.4: Populariteten av velkjente programmeringsspråk målt i antall henvendelser til StackOverflow i perioden 2009–2019. TIOBEs vurdering Firmaet TIOBE ( The Importance Of Being Earnest ), som vurderer og rangerer programvare, har en statistikk som gir et litt annet bilde av Pythons popularitet (https://www.tiobe.com/tiobe-index/). TIOBE-indeksen (i prosent) er basert på antall profesjonelle programmerere, kurs og tredjeparts leverandører som bruker de ulike språkene. Dataene er iht. TIOBE basert på tall fra søk på Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube og Baidu. Figur 1.5 viser TIOBE-indeksen for velkjente programmeringsspråk.

Figur 1.5: TIOBE-score for velkjente programmeringsspråk. TIOBE antyder at Python kan passere C og Java i popularitet i 2022–2023: 28


KAPITTEL 1. INNLEDNING TIOBE Index for June 2019 June Headline: Python continues to soar in the TIOBE index This month Python has reached again an all time high in TIOBE index of 8.5%. If Python can keep this pace, it will probably replace C and Java in 3 to 4 years time, thus becoming the most popular programming language of the world. The main reason for this is that software engineering is booming. It attracts lots of newcomers to the field. Java’s way of programming is too verbose for beginners. In order to fully understand and run a simple program such as ’hello world’ in Java you need to have knowledge of classes, static methods and packages. In C this is a bit easier, but then you will be hit in the face with explicit memory management. In Python this is just a one-liner. Enough said.

1.3.4

Når er Python ikke aktuelt?

Python er et tekstbasert programmeringsspråk. Python er ikke aktuelt hvis du vil programmere grafisk. Med grafisk programmering mener vi her at funksjonsblokker sammenkoples via signallinjer i et digitalt tegneark , dvs. at en blokks utgang koples til en annen blokks inngang rent grafisk. (LabVIEW og Simulink er gode eksempler på grafiske programmeringsverktøy.)

1.3.5

Hvem temmer Python?

Hvem sørger for at Python er tam og til å stole på? Det gjør The Python Software Foundation (PSF). PSF holder i trådene når det gjelder utvikling og utgivelse av Python. PSF har hjemmeside på http://python.org. Figur 1.6 viser PSFs hjemmeside. Fra PSFs hjemmeside: The Python Software Foundation is an organization devoted to advancing open source technology related to the Python programming language. På PSFs hjemmeside fins installeringsfiler for Python, dokumentasjon, veiledninger (tutorials), oversikt over Python-pakker m.m. Selv om du kan installere Python fra en installeringsfil på PSFs hjemmeside, er det ganske å installere Python gjennom en såkalt Python-distribusjon, som er en samling av selve Python og mange typer tilleggsverktøy. Den mest populære distribusjonen er Anaconda, som blir nærmere beskrevet i kap. 2.2.

1.4

Skrivemåter i boken

Her er informasjon om skrivemåter i boken: • Desimalkomma og desimalpunktum: På norsk gjelder desimalkomma, f.eks. 3,14. I Python-kode MÅ vi bruke desimalpunktum, f.eks. 3.14. I boken bruker vi som hovedregel desimalkomma, men desimalpunktum der det er nødvendig for å unngå misforståelser. 29


Vil du lære å programmere i Python for å løse numeriske problemer innen realfag? Da har du funnet rett bok! Boken er skrevet for studenter og ansatte ved universiteter og høgskoler, elever og lærere i videregående skoler, samt fagfolk i forskning, utvikling og industri. Boken har to deler: Del 1 Grunnleggende Python-programmering: Gir en trinn-for-trinn-innføring i Python-programmering, inkludert effektive beregninger med Numpy-pakken og plotting med Matplotlib-pakken. Del 2 Anvendt Python-programmering: Dekker spennende og viktige realfaglige anvendelser. Boken inneholder oppgaver med detaljerte løsninger. Alle programmene som inngår i eksempler og løsninger, er tilgjengelige via lenker angitt i boken.

ph.d., dosent i automatiseringsteknikk (teknisk kybernetikk)

ph.d., professor i matematikk med simulering og modellering som hovedområder

Begge arbeider ved Universitetet i Sørøst-Norge (USN), campus Porsgrunn.

ISBN 978-82-450-3380-9

,!7II2E5-addiaj!


Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.