Python for realfag, 2. utg. (9788245036695)

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. Nytt i 2. utgave er en introduksjon til objektorientert programmering (OOP) i Python. 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-3669-5




Copyright © 2021 by Vigmostad & Bjørke AS All Rights Reserved 1. utgave 2020 2. utgave 2021 / 1. opplag 2021 ISBN: 978-82-450-3669-5 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? . . . . . . . . . . . . . . . . . . . .

28

1.3.5

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

28

1.4

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

29

1.5

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

30

1.6

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

31

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 . . . . . . . . . . . . . .

39

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 . . . . . . . . . . . . . . . . . . . . . . . . . . . .

47

2.3.5.1

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

47

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

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

49

2.4.1

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

50

2.4.2

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

50

2.4.3

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

52

2.4.4

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

52

2.4.5

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

53

2.4.6

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

54

2.5

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

55

2.6

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

56

2.6.1

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

56

2.6.1.1

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

56

2.6.1.2

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

57

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

57

2.6.2

4


INNHOLD

2.6.3

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

58

2.6.3.1

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

58

2.6.3.2

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

58

2.6.3.3

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

60

2.6.3.4

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

61

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

61

2.7

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

62

2.8

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

64

2.6.4

3 Variabler og datatyper

71

3.1

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

71

3.2

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

71

3.3

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

72

3.3.1

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

72

3.3.2

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

73

3.3.3

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

74

3.4

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

75

3.5

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

77

3.5.1

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

77

3.5.2

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

77

3.5.3

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

79

3.6

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

81

3.7

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

82

3.8

Boolske variabler, logiske operatorer og sammenlikningsoperatorer . . .

84

3.8.1

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

84

3.8.2

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

85

5


PYTHON FOR REALFAG

3.8.3

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

86

3.8.4

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

87

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

88

3.9.1

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

88

3.9.2

Operasjoner på lister . . . . . . . . . . . . . . . . . . . . . . . .

89

3.9.2.1

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

89

3.9.2.2

Hvordan oppdatere listeelementer med nye verdier . .

92

3.9.2.3

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

92

3.9.2.4

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

94

3.9.2.5

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

95

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

96

3.11 Dictionary . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

98

3.12 Arrayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

3.12.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .

99

3.12.2 Hvordan konvertere lister til arrayer og motsatt . . . . . . . . .

99

3.12.2.1 Konvertering fra liste til array . . . . . . . . . . . . . .

99

3.9

3.12.2.2 Konvertering fra array til liste . . . . . . . . . . . . . . 100 3.12.3 Lage arrayer med spesiell utforming . . . . . . . . . . . . . . . . 101 3.12.3.1 Arrayer med like elementverdier . . . . . . . . . . . . . 101 3.12.3.2 Array med fast inkrement mellom elementene . . . . . 103 3.12.3.3 Flerdimensjonale eller n-dimensjonale arrayer . . . . . 104 3.12.4 Operasjoner på arrayer . . . . . . . . . . . . . . . . . . . . . . . 105 3.12.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 105 3.12.4.2 Størrelsen av en array . . . . . . . . . . . . . . . . . . 106 3.12.4.3 Lese elementverdier i en array . . . . . . . . . . . . . . 107 3.12.4.4 Oppdatere elementer i en array . . . . . . . . . . . . . 108 6


INNHOLD

3.12.4.5 Utvide arrayer med nye elementer . . . . . . . . . . . . 109 3.12.4.6 Fjerne elementer fra arrayer . . . . . . . . . . . . . . . 110 3.12.4.7 Finne maksimum og minimum i arrayer . . . . . . . . 110 3.12.5 Matematiske operasjoner på arrayer, inkl. matriser . . . . . . . 111 3.12.5.1 Addisjon med skalar og multiplikasjon med skalar . . . 111 3.12.5.2 Hvordan lage radvektorer og kolonnevektorer og matriser112 3.12.5.3 Vektor- og matrisemultiplikasjoner . . . . . . . . . . . 115 3.12.6 Matrisefunksjoner for lineæralgebra . . . . . . . . . . . . . . . . 118 3.12.7 Vektoriserte beregninger . . . . . . . . . . . . . . . . . . . . . . 119 3.13 Oppgaver til kapittel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 3.14 Løsninger til kapittel 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 4 Plotting med Matplotlib

145

4.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145

4.2

Kurveplott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145 4.2.1

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

4.2.2

Flere enn ett figurvindu? . . . . . . . . . . . . . . . . . . . . . . 146

4.2.3

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

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

4.2.3.2

Plottfigur vist i et eksternt vindu . . . . . . . . . . . . 147

4.2.4

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

4.2.5

Subplott . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149

4.2.6

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

4.2.7

Matematiske symboler i diagramtittel o.l. . . . . . . . . . . . . . 151

4.3

Stolpediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153

4.4

Kakediagram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154

4.5

Histogram . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 7


PYTHON FOR REALFAG

4.6

Oppgaver til kapittel 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 157

4.7

Løsninger til kapittel 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . 159

5 Programmering av funksjoner

167

5.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167

5.2

Hvordan programmere funksjoner . . . . . . . . . . . . . . . . . . . . . 168 5.2.1

Grunnleggende funksjonsdefinisjon . . . . . . . . . . . . . . . . 168

5.2.2

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

5.2.3

Funksjonsargumenter med standardverdi . . . . . . . . . . . . . 171

5.2.4

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

5.2.5

*args og **kwargs . . . . . . . . . . . . . . . . . . . . . . . . . . 173

5.2.6

Dokumentasjonstekst (docstring) . . . . . . . . . . . . . . . . . 174

5.2.7

Navnerom (namespace) . . . . . . . . . . . . . . . . . . . . . . . 176

5.3

Programmering av moduler . . . . . . . . . . . . . . . . . . . . . . . . 177

5.4

Lambda-funksjoner . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179

5.5

Oppgaver til kapittel 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 180

5.6

Løsninger til kapittel 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . 184

6 Testing av egen kode

195

6.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195

6.2

Hvordan teste for funksjonsfeil? . . . . . . . . . . . . . . . . . . . . . . 196

6.3

Hvordan kjøre kun en del av programmet? . . . . . . . . . . . . . . . . 200

6.4

Oppgaver til kapittel 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

6.5

Løsninger til kapittel 6 . . . . . . . . . . . . . . . . . . . . . . . . . . . 203

7 Betingede programløp med if-strukturer

207

7.1

if-else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 207

7.2

Et liv uten else . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 8


INNHOLD

7.3

elif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210

7.4

Oppgaver til kapittel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 211

7.5

Løsninger til kapittel 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . 212

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

217

8.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217

8.2

For-løkker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 8.2.1

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

8.2.2

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

8.2.3

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

8.3

While-løkker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224

8.4

Oppgaver til kapittel 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

8.5

Løsninger til kapittel 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . 227

9 Lese og skrive fildata

237

9.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237

9.2

Filformater . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 9.2.1

Tekstbaserte datafiler . . . . . . . . . . . . . . . . . . . . . . . . 237

9.2.2

Binærdatafiler . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239

9.3

Lese dataserier fra fil . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240

9.4

Skrive dataserier til fil . . . . . . . . . . . . . . . . . . . . . . . . . . . 241

9.5

Excel-filer i Python . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243 9.5.1

Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 243

9.5.2

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

9.5.3

Skrive data fra Python til Excel . . . . . . . . . . . . . . . . . . 245

9.6

Oppgaver til kapittel 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 246

9.7

Løsninger til kapittel 9 . . . . . . . . . . . . . . . . . . . . . . . . . . . 251 9


PYTHON FOR REALFAG

10 Databehandling med Pandas

263

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

279

11.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 11.2 Lynkurs i symbolske beregninger . . . . . . . . . . . . . . . . . . . . . 280 11.3 Hvordan beregne tallverdier av symbolske uttrykk . . . . . . . . . . . . 281 11.3.1 evalf() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 11.3.2 subs() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 282 11.3.3 lambdify() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 11.4 Løsing av likninger . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 11.4.1 Løsing av likninger med én ukjent . . . . . . . . . . . . . . . . . 285 11.4.2 Løsing av likninger med flere ukjente . . . . . . . . . . . . . . . 287 11.4.3 Løsing av differensiallikninger . . . . . . . . . . . . . . . . . . . 288 11.5 Manipuleringer av symbolske uttrykk . . . . . . . . . . . . . . . . . . . 290 11.6 Symbolsk derivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 11.7 Symbolsk integrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 11.8 Matriseregning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 11.9 Jacobimatrise (partiellderivasjon av vektorfunksjon) . . . . . . . . . . . 295 11.10 Oppgaver til kapittel 11 . . . . . . . . . . . . . . . . . . . . . . . . . . 297 11.11 Løsninger til kapittel 11 . . . . . . . . . . . . . . . . . . . . . . . . . . 298 10


INNHOLD

12 Objektorientert programmering

301

12.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 301 12.2 Klasse, objekter, instanser, typer . . . . . . . . . . . . . . . . . . . . . 301 12.3 Hvordan lage en klasse og bruke instanser av klassen . . . . . . . . . . 303 12.4 Hvordan legge definisjonen av en klasse i en modul . . . . . . . . . . . 306 12.5 Hvordan lage nye klasser med arv fra eksisterende klasser . . . . . . . . 308 12.6 Oppgaver til kapittel 12 . . . . . . . . . . . . . . . . . . . . . . . . . . 310 12.7 Løsninger til kapittel 12 . . . . . . . . . . . . . . . . . . . . . . . . . . 311

II

Anvendelser av Python-programmering

13 Numerisk derivasjon og integrasjon

317 319

13.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 319 13.2 Numerisk derivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 13.2.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320 13.2.2 Foroverderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 320 13.2.3 Bakoverderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 325 13.2.4 Senterderivasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 13.2.5 Valg av skrittlengde . . . . . . . . . . . . . . . . . . . . . . . . . 328 13.3 Numerisk integrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 13.3.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 13.3.2 Foroverintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . 329 13.3.3 Bakoverintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . 333 13.3.4 Trapesintegrasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 335 13.3.5 Negativt areal? . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 13.4 Oppgaver til kapittel 13 . . . . . . . . . . . . . . . . . . . . . . . . . . 338 13.5 Løsninger til kapittel 13 . . . . . . . . . . . . . . . . . . . . . . . . . . 341 11


PYTHON FOR REALFAG

14 Løsing av likninger

347

14.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 14.2 Likningens form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 14.3 En god start: Plott! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 14.4 Newtons metode . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 350 14.5 Oppgaver til kapittel 14 . . . . . . . . . . . . . . . . . . . . . . . . . . 355 14.6 Løsninger til kapittel 14 . . . . . . . . . . . . . . . . . . . . . . . . . . 356 15 Simulering av dynamiske systemer

359

15.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 15.2 Hva er dynamiske systemer? . . . . . . . . . . . . . . . . . . . . . . . . 360 15.3 Framgangsmåte for utvikling av simulatorer . . . . . . . . . . . . . . . 361 15.4 Simulator for et termisk system . . . . . . . . . . . . . . . . . . . . . . 362 15.4.1 Systembeskrivelse . . . . . . . . . . . . . . . . . . . . . . . . . . 362 15.4.2 Modellering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 363 15.4.3 Diskretisering (simulatoralgoritmen) . . . . . . . . . . . . . . . 365 15.4.4 Programmering . . . . . . . . . . . . . . . . . . . . . . . . . . . 369 15.4.5 Simulering . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 372 15.4.6 Testing . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 373 15.4.6.1 Statisk test av simuleringen . . . . . . . . . . . . . . . 373 15.4.6.2 Dynamisk test av simuleringen . . . . . . . . . . . . . 374 15.4.7 Valg av simulatoralgoritmens tidsskritt . . . . . . . . . . . . . . 375 15.5 Simulatoralgoritme for mengdesystemer . . . . . . . . . . . . . . . . . . 378 15.6 Simulatoralgoritme for bevegelsessystemer . . . . . . . . . . . . . . . . 385 15.7 Simulator for tidsforsinkelse . . . . . . . . . . . . . . . . . . . . . . . . 390 15.8 Simulering i sann tid eller skalert sann tid . . . . . . . . . . . . . . . . 395 15.8.1 Realisering av simulering i (skalert) sann tid . . . . . . . . . . . 395 12


INNHOLD

15.8.2 Kontinuerlig oppdatert plott . . . . . . . . . . . . . . . . . . . . 397 15.8.3 Justering av parametre mens simulatoren kjører . . . . . . . . . 401 15.9 Oppgaver til kapittel 15 . . . . . . . . . . . . . . . . . . . . . . . . . . 403 15.10 Løsninger til kapittel 15 . . . . . . . . . . . . . . . . . . . . . . . . . . 411

16 Optimering

423

16.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 16.2 Formulering av optimeringsproblemer . . . . . . . . . . . . . . . . . . . 423 16.3 Noen typiske trekk ved objektfunksjonen . . . . . . . . . . . . . . . . . 426 16.4 Hvordan løse optimeringsproblemer . . . . . . . . . . . . . . . . . . . . 428 16.4.1 Oversikt over løsningsmetoder . . . . . . . . . . . . . . . . . . . 428 16.4.1.1 Analytisk metode . . . . . . . . . . . . . . . . . . . . . 428 16.4.1.2 Grid-metoden . . . . . . . . . . . . . . . . . . . . . . . 428 16.4.1.3 Iterativ metode . . . . . . . . . . . . . . . . . . . . . . 429 16.4.1.4 Kombinasjon av grid-metoden og en iterativ metode . 430 16.4.2 Analytisk løsning . . . . . . . . . . . . . . . . . . . . . . . . . . 430 16.4.3 Grid-metoden . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 16.4.3.1 Prinsipp og implementering av grid-metoden . . . . . . 431 16.4.3.2 Optimering med én optimeringsvariabel . . . . . . . . 434 16.4.3.3 Optimering med to optimeringsvariabler uten ulikhetsbegrensning . . . . . . . . . . . . . . . . . . . . . . . . 436 16.4.3.4 Optimering med to optimeringsvariabler med ulikhetsbegrensning . . . . . . . . . . . . . . . . . . . . . . . . 439 16.4.3.5 Lineær objektfunksjon med ulikhetsbegrensninger . . . 440 16.4.4 Har du virkelig funnet minimum? . . . . . . . . . . . . . . . . . 444 16.5 Oppgaver til kapittel 16 . . . . . . . . . . . . . . . . . . . . . . . . . . 446 16.6 Løsninger til kapittel 16 . . . . . . . . . . . . . . . . . . . . . . . . . . 450 13


PYTHON FOR REALFAG

17 Modelltilpassing til data

457

17.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457 17.2 Prinsippet for modelltilpassing . . . . . . . . . . . . . . . . . . . . . . . 457 17.3 Modelltilpassing av statiske modeller . . . . . . . . . . . . . . . . . . . 459 17.4 Modelltilpassing av dynamiske modeller . . . . . . . . . . . . . . . . . . 468 17.5 Oppgaver til kapittel 17 . . . . . . . . . . . . . . . . . . . . . . . . . . 473 17.6 Løsninger til kapittel 17 . . . . . . . . . . . . . . . . . . . . . . . . . . 475 18 Statistikk og sannsynlighetsregning

481

18.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 481 18.2 Utfallsrom og populasjon . . . . . . . . . . . . . . . . . . . . . . . . . . 481 18.3 Simulering av stokastiske forsøk . . . . . . . . . . . . . . . . . . . . . . 482 18.3.1 Hvorfor simulere? . . . . . . . . . . . . . . . . . . . . . . . . . . 482 18.3.2 Simulering med choice() . . . . . . . . . . . . . . . . . . . . . . 483 18.3.3 Repetere samme tilfeldige uttrekk? . . . . . . . . . . . . . . . . 487 18.4 Statistiske mål

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488

18.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 18.4.2 Middelverdi, varians og standardavvik . . . . . . . . . . . . . . 489 18.4.2.1 Middelverdi . . . . . . . . . . . . . . . . . . . . . . . . 489 18.4.2.2 Varians . . . . . . . . . . . . . . . . . . . . . . . . . . 489 18.4.2.3 Standardavvik . . . . . . . . . . . . . . . . . . . . . . 490 18.4.3 Forventningsverdi . . . . . . . . . . . . . . . . . . . . . . . . . . 493 18.5 Sannsynlighetsfordelinger . . . . . . . . . . . . . . . . . . . . . . . . . . 495 18.5.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 495 18.5.2 Noen sannsynlige definisjoner . . . . . . . . . . . . . . . . . . . 495 18.5.3 Diskret sannsynlighetsfordeling . . . . . . . . . . . . . . . . . . 496 18.5.4 Hyppighetsfordeling . . . . . . . . . . . . . . . . . . . . . . . . . 498 14


INNHOLD

18.5.5 Kontinuelig fordeling: Normalfordelingen . . . . . . . . . . . . . 502 18.5.5.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 502 18.5.5.2 Teoretisk normalfordeling . . . . . . . . . . . . . . . . 504 18.5.5.3 Simulering av normalfordeling . . . . . . . . . . . . . . 505 18.5.6 Kontinuelig fordeling: Uniform fordeling . . . . . . . . . . . . . 508 18.5.6.1 Teoretisk uniform fordeling . . . . . . . . . . . . . . . 508 18.5.6.2 Simulering av uniform fordeling . . . . . . . . . . . . . 509 18.6 Hvordan estimere sannsynligheten for hendelser i stokastiske forsøk? . . 512 18.7 Oppgaver til kapittel 18 . . . . . . . . . . . . . . . . . . . . . . . . . . 517 18.8 Løsninger til kapittel 18 . . . . . . . . . . . . . . . . . . . . . . . . . . 521 19 Signalfiltrering

527

19.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527 19.2 Middelverdifilter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528

19.2.1 Filteralgoritmen . . . . . . . . . . . . . . . . . . . . . . . . . . . 528 19.2.2 Noen egenskaper ved middelverdifilteret . . . . . . . . . . . . . 532 19.2.2.1 Filterets lavpassegenskaper . . . . . . . . . . . . . . . 532 19.2.2.2 Tidsforskyvning gjennom filteret . . . . . . . . . . . . 532 19.2.2.3 Støydempning gjennom filteret . . . . . . . . . . . . . 532 19.3 Tidskonstantfilter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 19.3.1 Filteralgoritmen . . . . . . . . . . . . . . . . . . . . . . . . . . . 533 19.3.2 Noen egenskaper ved filteret . . . . . . . . . . . . . . . . . . . . 535 19.3.2.1 Filterets lavpassegenskaper . . . . . . . . . . . . . . . 535 19.3.2.2 Tidsforskyvning gjennom filteret . . . . . . . . . . . . 535 19.3.2.3 Støydempning gjennom filteret . . . . . . . . . . . . . 535 19.3.2.4 En sammenheng mellom tidskonstantfilter og middelverdifilter . . . . . . . . . . . . . . . . . . . . . . . . . 535 15


PYTHON FOR REALFAG

19.3.2.5 Hvordan skal vi stille inn filtertidskonstanten? . . . . . 536 19.4 Høypassfilter

. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 536

19.5 Oppgaver til kapittel 19 . . . . . . . . . . . . . . . . . . . . . . . . . . 537 19.6 Løsninger til kapittel 19 . . . . . . . . . . . . . . . . . . . . . . . . . . 538 20 Automatisk regulering

541

20.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541 20.2 Reguleringssystemers struktur og virkemåte . . . . . . . . . . . . . . . 541 20.2.1 Manuell regulering . . . . . . . . . . . . . . . . . . . . . . . . . 541 20.2.2 Automatisk regulering . . . . . . . . . . . . . . . . . . . . . . . 542 20.3 Regulatoralgoritmer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 20.3.1 P-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543 20.3.2 PI-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 548 20.3.3 Av/på-regulator . . . . . . . . . . . . . . . . . . . . . . . . . . . 552 20.3.4 Foroverkopling . . . . . . . . . . . . . . . . . . . . . . . . . . . 558 20.4 Hvordan kjøre et regulatorprogram i sann tid

. . . . . . . . . . . . . . 561

20.5 Oppgaver til kapittel 20 . . . . . . . . . . . . . . . . . . . . . . . . . . 561 20.6 Løsninger til kapittel 20 . . . . . . . . . . . . . . . . . . . . . . . . . . 565 21 Programmering av praktisk utstyr

569

21.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 21.2 Microbit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 21.2.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569 21.2.2 Mikrobeskrivelse av Microbit . . . . . . . . . . . . . . . . . . . . 570 21.2.2.1 Oversikt . . . . . . . . . . . . . . . . . . . . . . . . . . 570 21.2.2.2 Programmeringsspråk . . . . . . . . . . . . . . . . . . 570 21.2.2.3 Maskinvare . . . . . . . . . . . . . . . . . . . . . . . . 571 16


INNHOLD

21.2.2.4 Tilleggsutstyr til Microbit . . . . . . . . . . . . . . . . 571 21.2.3 Prosedyre for programmering av Microbit . . . . . . . . . . . . 572 21.2.4 MicroPython . . . . . . . . . . . . . . . . . . . . . . . . . . . . 573 21.2.4.1 Innledning . . . . . . . . . . . . . . . . . . . . . . . . . 573 21.2.4.2 MicroPython-programmering i Microbits editor . . . . 573 21.2.4.3 MicroPython-programmering i editoren Mu . . . . . . 575 21.3 Raspberry Pi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 580 21.3.1 Hva er Raspberry Pi? . . . . . . . . . . . . . . . . . . . . . . . . 580 21.3.2 Hvilket tilleggsutstyr trenger du? . . . . . . . . . . . . . . . . . 580 21.3.2.1 Standard skjerm, tastatur og mus . . . . . . . . . . . . 580 21.3.2.2 Mini-berøringsskjerm . . . . . . . . . . . . . . . . . . . 581 21.3.2.3 Tilleggsutstyr . . . . . . . . . . . . . . . . . . . . . . . 582 21.3.3 Programmering av Raspberry Pi . . . . . . . . . . . . . . . . . . 582 21.4 Oppgaver til kapittel 21 – ingen . . . . . . . . . . . . . . . . . . . . . . 583 Referanser

585

Register

587

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 emnene (fagene) vi underviser ved USN, og vi bruker Python i forskningsprosjekter. Vi har samarbeidet om mange kurs i Python-programmering de siste årene; kurs for realfagslærere i videregående skoler og kurs rettet mot Kompetanse Norges bransjeprogrammer. Python er blitt et av de mest populære programmeringsspråkene i verden. Det skyldes at Python er brukervennlig, kraftig og fritt tilgjengelig! 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. 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 i hovedsak basert på såkalt prosedyreorientert (engelsk: procedural programming), som kan betraktes som tradisjonell programmering. Python gir også mulighet for objektorientert

19


programmering (engelsk: object-oriented programming – OOP), og vi gir en introduksjon til objektorientert programmering i et eget kapittel. 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. 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. Hvis du underviser studenter eller elever, kan du bruke oppgaver i boken direkte eller som grunnlag for dine egne oppgaver. Boken inneholder et stort antall komplette programmer, i eksempler og i løsningsforslag til oppgaver. Lenker til programmene er angitt i boken. Programmene er også tilgjengelige via bokens hjemmeside på http://techteach.no/python. 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.82 som kjører på en PC med Windows 10. Du leser nå 2. utgave av boken. Nytt i denne utgaven er en introduksjon til objektorientert programmering (kapittel 12). Videre har vi tatt ut introduksjonen til programmeringsmiljøet Visual Studio Code da vi mener at det er tilstrekkelig for denne bokens formål å introdusere Spyder og Jupyter Notebook som programmeringsmiljøer. Det er også noen andre mindre endringer som vi ikke omtaler her. Og selvsagt har vi rettet kjente feil. 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 og Lars André Tokheim for innsatsen med å rapportere feil. En stor takk også til alle de positive folkene i Fagbokforlaget, spesielt fagredaktør Lasse Postmyr for sin imøtekommenhet overfor oss forfattere. 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 2

Marius Lysaker marius.lysaker@usn.no

n-dimensjonal array Enkelte eksempler er allikevel med Spyder 3.7.

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 og bruker programmering til å løse faglige problemer. Vi er også undervisere og slår gjerne et slag for programmering som verktøy for å fremme læring. Slik vi ser det, støtter programmering sentrale undervisningsprinsipper, nemlig motivering, konkretisering, aktivisering, individualisering og samarbeid1:

• 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.8. 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. 21 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.8. 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. 21.

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?

Firmaet TIOBE ( The Importance Of Being Earnest ) vurderer og rangerer programvare (https://www.tiobe.com/tiobe-index/). TIOBE-indeksen (et tall i prosent) er basert på antall profesjonelle programmerere, kurs og tredjeparts leverandører som bruker de ulike programmeringsspråkene. Dataene er iht. TIOBE basert på tall fra søk på Google, Bing, Yahoo!, Wikipedia, Amazon, YouTube og Baidu. Figur 1.4 viser TIOBE-indeksen for velkjente programmeringsspråk. Vi ser at Python er på 2. plass per juni 2021 og er på stigende kurs (på 1. plass om ikke så lenge?). Gjengitt fra TIOBE (https://www.tiobe.com/tiobe-index/):

27


PYTHON FOR REALFAG

Figur 1.4: TIOBE-score for programmeringsspråk. Python is about to take over the first position in the TIOBE index. The gap between the current number one, programming language C, and Python is only 0.7% now. Next month, the TIOBE index is celebrating its 20-year anniversary. Programming languages C and Java are the only 2 languages that reached a number 1 position during these 20 years. So if Python is going to take over the first position in the TIOBE index, this will certainly be a historical moment, which is worth celebrating. There appear to be hardly any interesting moves further down the chart. Possible future champions such as Dart, Kotlin, Julia, Rust, TypeScript, and Elixir didn’t show any significant changes last month. – Paul Jansen CEO TIOBE Software

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 eksempler på grafiske programmeringssspråk. I disse språkene kan du imidlertid inkludere tekstbasert kode. For eksempel kan du inkludere C-, Python- eller MATLAB-kode i LabVIEW.

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. 28


KAPITTEL 1. INNLEDNING

Figur 1.5 viser PSFs hjemmeside.

Figur 1.5: Hjemmesiden for Python Software Foundation (PSF) på http://python.org. 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. Du kan installere Python fra en installeringsfil på PSFs hjemmeside, men de fleste velger i stedet å installere Python gjennom en såkalt Python-distribusjon, som er en samling av selve Python-kompilatoren ( Python-maskinen som kjører Python-kode) og mange slags verktøy til Python-programmering. 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. • Norsk/engelsk i programeksempler: Iht. de såkalte PEP 8-reglene-reglene for god kode-stil skal kommentarer som hovedregel skrives på engelsk. (PEP er forkortelse for 29


PYTHON FOR REALFAG

Python Enhancement Proposal. PEP8: Style Guide for Python Code, se https://www.python.org/dev/peps/pep-0008/.) Ja, det er klart at vi må skrive engelsk dersom vi antar at programmene skal kunne leses og brukes av folk som ikke behersker norsk. Men hvis vi er sikre på at kun folk som forstår norsk skal lese og bruke programmene, mener vi at norsk er ok. Vi har ikke vært konsekvente på norsk eller engelsk i programeksemplene i boken. Du vil altså finne at noen av programmene er engelske , mens andre er norske . • Norske tegn: Vi har valgt å unngå særnorske tegne i både programkode og kommentarer innbakt i programkoden. Noen programmeringsmiljøer for Python, og dokumentverktøy der programmet skal vises, kan ha problemer med disse tegnene. Vi har derfor valgt erstatte de særnorske tegnene slik: – AE for Æ og ae for æ – OE for Ø og oe for ø – AA for Å og aa for å •

1.5

Skriv ut , som vi skriver i mange oppgaver. Vi mener da at du skal bruke print()-funksjonen til å vise verdien i konsollen (også kalt kommandolinjen) i programmeringsmiljøet Spyder. Vi presenterer Spyder i kap. 2.3.

Om bokens innhold

Vi har valgt å strukturere boken i to deler som illustrert i figur 1.6. Strukturen uttrykker at fundamentet for å jobbe med anvendelser av Python-programmering er solide kunnskaper om og ferdigheter i grunnleggende Python-programmering.

Figur 1.6: Anvendelser (del II i boken) bygger på grunnleggende kunnskaper om Pythonprogrammering (del I). Litt mer informasjon om de to delene: • Del I – Grunnleggende Python-programmering , som inneholder bl.a.: 30


KAPITTEL 1. INNLEDNING

– datatyper – plotting – funksjoner – iterasjoner programkode med for-løkker og while-løkker – betingede programløp med if-else-strukturer – skriving og lesing av fildata – databehandling med Pandas – symbolske beregninger – objektorientert programmering • Del II – Anvendelser av Python-programmering . Denne delen viser hvordan vi kan bruke Python-programmeringen fra del I i ulike typer anvendelser, nemlig: – numerisk derivasjon og integrasjon – løsing av likninger – simulering – optimering – modelltilpassing til data – statistikk og sannsynlighetsregning – signalfiltrering – automatisk regulering – praktiske eksperimenter med Microbit og Raspberry Pi Hvis du ønsker å gå enda dypere i numerisk Python-programmering enn du kommer med denne boken, kan vi anbefale (Langtangen 2016) og (Linge & Langtangen 2016).

1.6

Oppgaver til kapittel 1

Oppgave 1.1 Pythons popularitet 1. Finn fram til TIOBE-indeksen. Når hadde Python sin høyeste popularitet (noensinne)? Og den laveste (innenfor det viste tidsintervallet)? 2. Finn fram til Stackoverflows Developer Survey Results 2020. På hvilken plass er Python på oversikten over Most loved languages ?

Oppgave 1.2 Innkanal og utkanal Anta at du har laget et program som leser temperaturmålinger som er lagret som tall i en fil, og plotter målingene i et diagram som vises på PC-skjermen. Hva er innkanalen, og hva er utkanalen? 31


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. Nytt i 2. utgave er en introduksjon til objektorientert programmering (OOP) i Python. 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-3669-5


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