Lær
Python
Brug spyder eller pycharm til at køre nedenstående kode.
Brug spyder eller pycharm til at køre nedenstående kode.
Python er et gratis program som du kan installere kvit og frit fra nettet. Python er et programmeringssprog og skal bruge en GUI (General User Interface) til at køre. Dem er der mange af (spyder, pycharm, jupyter osv) Her bruges der Jupyter og Spyder. Alt kode på disse sider kører direkte i spyder og jupyter og kan klippes frem og tilbage mellem begge programmer.
Start med Jupyter som du starter direkte efter installationen af Anaconda. Du skal have Jupyter eller Spyder oppe at køre med "Hello World" inden du starter her!
Hvis ikke Anaconda virker for dig kan du også installere Jupyter direkte her eller Spyder direkte her
Denne side her er en kort introduktion som primært drejer sig om at modificere eksisterende kode. Hvis du vil lære python så vil jeg anbefale at du starter med denne video som giver en fantastisk pædagogisk grundlæggende introduktion til python.
Læs teksten og lav opgaverne løsningerne er længere nede hvid skrift på hvid baggrund. Du skal trække en mus henover for at se løsningen. Brug det som inspiration. Hvis du bare klipper det over til spyder så lærer du ikke så meget :-)
Variabler er ord, eller bogstaver som representerer noget indhold. Se det her:
antal = 4
tcel1 = "100 grader"
tcel2 = 100
tcel3 = float(100)
jaellernej = True
navn = "Ole Sørensen"
temperaturliste = [10,20,30,50,100,140]
teksten på venstre side af lighedstegnet har jeg fundet på det er navnet på mine variabler antal, tcel1 osv.
Start med at kopiere ovenstående kode ind i jupyter der og kør den ved at trykke på trykke på CTRL + ENTER på tastaturet.
Skriv %whos og se om du kan finde dine variabler på listen. Brug kort tid på at læse hvad der står.
antal er en variabel som indeholder tallet 4. tcel har jeg tænkt skulle stå for "Celsiustemperaturen". Lighedstegnet "tilordner" variablerne en værdi. Kalder jeg "antal" så regner python 4 kalder jeg temperaturliste så kalder jeg hele listen med de 6 input.
Generelt gælder der for variabler at man kan bruge matematiske operationer på variablerne int, float og boolean.
Tekst er altid af typen "str" og kan fx ikke ganges med et tal.
Hvis du vil se et output skal du skrive
print(variable)
Prøv at gange alle talvariabler (int og float) fra ovenstående liste sammen kald resultater y1 og print det.
Du har nu løsningen y1. Lav en ny variable y2 med instruksen:
y2 = jaellernej * y1
print(y2)
Ændre nu jaellernej til "False" og tolk på resultatet.
Læg nu de to string sammen med +. Læg mærke til at man kan sætte to tekstvariabler (strings) sammen med + plus tegnet. Læg mærke til at resultatet ikke har et mellemrum. Overvej hvordan du kunne løse det?
gang også "temperaturliste" med 2 og se hvad der sker, kald den temperaturliste2.
Vi skal senere lære at der er muligheder til at regne direkte med lister hvis man laver dem om til arrays. Det kan man med pakken numpy.
Definer en ny liste med følgende kommando
nyliste = np.array([10,20,30,50,100,140])
nyliste2 = nyliste * 2
print(nyliste2)
Kik på "variabel explorer i spyder eller skriv %whos i Jypyter... hvad står der der ?
Variabler i Jupyter kaldes med kommandoen %whos
Se at antal er en "integer" et helt tal, jaellernej er en boolean altså 0 eller 1
navn og tcel1 er af typen "str" eller string fordi de er tekst som skal angives med anførelsestegn "text" eller 'text'
tcel2 er en integer altså et helt tal. Hvorimod en "float" er et kommatal.
Lister er et stort emne i python og beskrevet nærmere i tips og tricks, men overordnet indeholder en række af elementer som vist her 10,20,30,...
Bruger du "spyder" kan du se variablerne med
"variabel explorer" i som viser indholde af de variabler som i øjeblikket er i spil.
y1 = tcel2*tcel3*antal
print(y1)
løsning:
40000.0
læg mærke til at der står .0 som betyder at variablen er en float altså et kommatal.
Ganger man en float med en int fx 4.4 * 2 så får man en float 8.8.
nystring = tcel1 + navn
print(nystring)
Løsning 1
mellemrum = ' '
nystring = tcel1 + mellemrum + navn
print(nystring)
Løsning 2
nystring = tcel1+' '+navn
print(nystring)
templist2 = temperaturliste * 2
print(templist2)
Surprised?
Det er fordi at lister opfører sig anderledes end tal. Lister er en samling af elementer og det er den samling du ganger med 2 her.
Se til højre hvordan du kan få listen til at opføre sig som en række tal ved at bruge pakken numpy og lave listen om til en array.
Printer noget til skærmen! Læs teksten og prøv opgaven. .format() kommandoen er meget vigtigt at forstå syntaksen af
Man kan printe noget ud til skærmen med kommandoen print! Fx kan man regne direkte i print kommandoen:
print(5+5) vil give 10
print(antal+5) vil give 9
Print variabler ved at skrive
print(tcel1)
man kan printe flere variabler ad gangen ved at skelne dem med komma
print(tcel1,tcel2) osv ..
det samme med strings
print(navn) vil give "Ole Sørensen"
Man kan blande tal og strings i samme print statement fx
print('Ved du at ', navn, 'er',antal, 'år gammel')
Læt mærke til at man kan bruge 'text' og "text" begge virker.
En fin, og meget brugt måde at bruge variabler i print på er .format() kommandoen
print('Ved du at {0} er {1} år gammel'.format(navn,antal))
Resulterer i det samme som ovenstående. I python er det meget almindelig at bruge .format() metoden den har nogle fordele fremfor første metode som senere bliver klare.
Skriv et lille program hvor du
printer en beregning hvor du ganger to variabler sammen
printer en beregning hvor du ganger tallene sammen i print statementet
definerer tre variabler a,b,c til at være forskellige tal. Brug nu .format(a,b,c) kommandoen til at printe:
Variablen a er nice, b er nicere og c er nicest
Variablen b er nice, c er nicere og a er nicest
Variablen c er nice, a er nicere og b er nicest
Du skal ikke lave om på .format(a,b,c) kun ændre teksten du printer.
Man kan faktisk lave om på farven, men det er for kompliceret her :-)
Løsning til A1.5:
a = 4
b = 5
c = 6
print('Variablen {0} er nice {1} er nicere og {2} er nicest'.format(a,b,c))
print('Variablen {1} er nice {2} er nicere og {0} er nicest'.format(a,b,c))
print('Variablen {2} er nice {0} er nicere og {1} er nicest'.format(a,b,c))
Lister er ekstremt vigtige i Python. Igen LÆS TEKSTEN og løs opgaverne. Alt hvad der formateret med skriftypen curier er kode og kan klippes over til Jupyter.
En liste har et navn lige som en variabel kan indeholde alle mulige elementer, int, float, str, boolean, andre lister osv ..
temperaturliste = [10,20,30,50,100,140] #er en liste af tal
navnelist = ['Martin','Knud', 'Maria', 'Amanda', 'Alberte', 'Mathias'] # er en liste af tekst
Man kan vise enkelte elementer af en liste ved at bruge
print(navnelist[0]) som vil give Martin
print(navnelist[3]) som vil give Amanda
læg mærke til følgende:
print(navnelist[-1]) som vil være Mathias
Lister er brugt ekstremt meget i python og hvis du mangler nogle listekommandoer fx at tilføje, slette indsætte ting, tælle eller sortere lister så har jeg samlet de vigtigste kommandoer her.
Brug ovenstående .format() kommandoen og navnelist til at printe de næste tre linjer med tre printstatements. Erstat det der står i parentesen med en variabel.
Listen har (antal listeelemener) elementer.
Det første navn er (1. navn) og det sidste navn er (sidste navn).
(et andet navn) er forelsket i (sidste navn).
Tilføj nu navnet af din nabo til listen med kommandoen .append('navn') og kør ovenstående linje igen.
navnelist = ['Martin','Knud', 'Maria', 'Amanda', 'Alberte', 'Mathias']
print('Listen har {0} elementer)'.format(len(navnelist)))
print('det første Navn er {0} og det sidste navn er {1}.'.format(navnelist[0],navnelist[-1]))
print('{0} er forelsket i {1}.'.format(navnelist[2],navnelist[-1]))
navnelist.append('Louise')
print('Listen har {0} elementer)'.format(len(navnelist)))
print('det første Navn er {0} og det sidste navn er {1}.'.format(navnelist[0],navnelist[-1]))
print('{0} er forelsket i {1}.'.format(navnelist[2],navnelist[-1]))
Det er er en kort liste over de vigigste kommandoer. Skim dem og løs opgave A1:5.
For at tilføje et element til en liste bruger man .append.
xlist = [1, 2, 3, 9]
ylist = [100, 50, 25, 10]
xny=12
yny=4
xlist.append(xny)
ylist.append(yny)
vil gøre at :
xlist = [1, 2, 3, 9, 12]
ylist = [100, 50, 25, 10, 4]
Kommandoen len(xlist):
print(len(xlist))
Giver
5
At flyde en liste op med tallene 0 til 999 kan man bruge et loop:
xlist = []
print(xlist)
for i in range(1000):
xlist.append(i)
print(xlist)
For at se flere liste kommandoer klik her
navnelist.pop() #sletter det sidste element
navnelist.count('Amanda') # tæller hvor ofte navnet 'Amanda' forekommer i listen.
navnelist.insert(3,"Markus")#tilføjer midti listen på 4. position
Leg med ovenstående kommandoer, append, len, insert og pop.
Kopier navnelist over til jupyter og appende navnet Mikkel.
Vi vil gerne vide hvor mange elementer der er i listen. Det gør man med kommandoen len(navneliste)
Prøv at lave et program hvor du viser længden af navnelist før og efter du har tilføjet Mikkel.
navnelist = ['Martin','Knud', 'Maria', 'Amanda', 'Alberte', 'Mathias']
print(len(navnelist))
navnelist.append('Mikkel')
print(len(navnelist))
Infoafsnit om HVORDAN python bruger indryk i stedet for parentes. Med andre ord er det ekstremt vigtig HVORHENNE man skriver sin kode
for i in range(10):
x=i**2
print(x,'er skøn')
er noget helt andet end
for i in range(10):
x=i**2
print(x,'er skøn')
En af de interessante ting ved python er at der ikke er parenteser omkring Loops som det er i stort set alle andre programmeringssprog.
{Tuborg} parenteser er standard ved andre sprog til at fortæller hvad der er inden i loopet. Python fikser det med et kolon og en indrykning på 4 mellemrum eller 1 Tab. Ruby har sin egen måde :-) Spyder og Jupyter gør det her automatisk efter man har sat kolon:
Her kan du se while loops i fire populære computersprog:
int i = 1;
while(i<5){
printf("Hello Egaa");
i++;
}
int i = 1;
while(i<5){
text += "Hello Egaa";
i++;
}
i = 1
while i<5 do
puts "Hello Egaa";
i+=1;
end
i=1
while i<5:
print("Hello Egaa")
i+=1
Læs teksten og løs opgaverne!
Loops eller "Løkker" er en af de vigtiste ting ved programmering fordi man ofte gerne vil
Gøre den samme ting mange gange i træk
Der er mulighed for 3 forskellige loops i python. if, for og while loopet. Ofte kan man opnår det samme ved at erstatte dem med hinanden især for og while loopet kan byttes ud. Læg mærke til at for loopet selv tæller i værdien op det skal gøres manuelt i while.
(i = i + 1 eller i += 1)
Et loop gør følgende:
x = 0
n = 1000
udfør loop n gange
tag variabel x og læg 1 til
print(x)
If statement
if tal < k:
print('lille')
elif tal == k:
print('OK')
else:
print('stor')
For loop
x = 0
n = 1000
for i in range(n):
x=x+1
print(x)
For loop med list
x = [4,5,7,10]
for i in x:
print(i)
Resultat:
(4,5,7,10)
While loop
x = 0
n = 1000
i=0
while i < n:
x=x+1
i=i+1
print(x)
Skriv et lille program som printer "Hello world" 10 gange. Brug både "for" og "while" loopet.
Vigtigt:
Læg mærke til at det er : og INDRYKNINGEN der starter loopet. I mange andre computersprog skal man bruge fx tuborg parenteser { loop } Ikke i python. Det er derfor at "print(x)" står uden indryk. Prøv at indrykke "print(x)" og se hvad der sker.
Brug kun når du virkelig ikke kan komme videre. Teksten er hvid på hvid baggrund.
xlist=[]
ylist=[]
for i in range(101):
xlist.append(i)
ylist.append(xlist[i]*xlist[i])
print(xlist)
print(ylist)
Generer en tom liste xlist = [ ] skriv nu et lille program som fylder tallene 1 til 100 i listen så den bliver til xlist = [1,2,3,4,5,.....100 ].
Du kan tilgå et element i en liste vha xlist[i] hvor i er positionen, fx vil 2-tallet i ovenstående liste kunne kaldes med xlist[1] (lister nummereres 0,1,2,3..)
Modificér nu dit ovenstående program og producer en ylist som indeholder kvadrater af alle tal i xlist.
Du kan tage kvadratet ved at sige xlist[i]*xlist[i] og du sætter ting i en liste ved at bruge listekommandoen append.
xlist.append[i]
Omregning af fahrenheit temperaturen til celsius og omvendt. Dette er dit første lidt større program. Løs opgaverne A4 A5 og A6 efter hinanden. Løsningerne er i næste afsnit. Brug med omhu.
Du lærer hvordan computeren "venter" på dit svar. Læg mærke til at svaret tastes og bliver straks til en variable i python. Python tror ALTID det er en tekst (string) du taster, men siden det er tal i dette eksempel skal du fortælle python at lave tekst om til tal med kommandoen float()
Kopier koden til højre og kør den.
Læg mærke til det nye command "input" som gør at python "venter" på et input fra brugeren.
Ændre koden sådan at programmet skriver fahrenheit temperaturen som svar.
tcel = float(input("Celsiustemperatur = "))
tfar = tcel + 100
print(tfar)
#float omdanner dit input til et tal.
#kommendoen input venter på at du skriver noget på tastaturet.
Ændre ovenstående kode sådan at den printer
"xxx grader i Celsius er yyy grader i Fahrenheit".
Brug siden Tips og Tricks og find .format() kommandoen for at
Du skal nu omskrive programmet sådan at den spørger dig om du vil omregne celsius i fahrenheit eller omvendt. EFTER det skal du spørges om et input som den så omregner. Svaret skal være
"xxx grader i Celsius er yyy grader i Fahrenheit"
eller celsius. Brug if loop fra Tips og Tricks.
Teksten i opgaverne er hvid på hvidt baggrund så du har mulighed for at markere lidt ad gangen for ikke at afsløre det hele på en gang.
tcel = float(input("Celsiustemperatur = "))
tfar = tcel*1.8+32
print(tfar)
print("{0} grader Fahrenheit = {1} grader Celsius".format(tfar,tcel))
hvilkenvej = input("Farenheit til Celsius tryk f, celsius til farenheit tryk c ")
if hvilkenvej == "f":
tfar=float(input("Angiv temperatur i Fahrenheit: "))
tcel=(tfar-32)/1.8
print("{0} grader Fahrenheit = {1} grader Celsius".format(tfar,tcel))
elif hvilkenvej == "c":
tcel=float(input("Angiv temperatur i Celsius"))
tfar=tcel*1.8+32
print("{0} grader Celsius = {1} grader Farenheit".format(tcel,tfar))
else:
print("du skal vælge c eller f")
Læs teksten og løs opgaverne.
Python er genialt til at plotte grafer. For at kunne plotte noget skal man bruge et bibliotek som hedder matplotlib.pyplot. Det skal "importeres" først til python. Se kommandoen til højre hvor der er to lister (med samme længe) som plottes i en graf vha kommandoen plot fra matplotlib.pyplot
Læg mærke til det lille feature 'go' som gør at der plottes 'g' green 'o' runde punkter. Det kan undlades. Vil man have punkter og ikke streger lige meget hvad skal man skrive
plt.scatter i stedet for plt.plot
import matplotlib.pyplot as plt
xlist = [1,2,4,5,7,12,22]
ylist = [3.8,4.8,6.9,7.2,10.2,13.4,23.9]
plt.plot(xlist,ylist,'go')
Generer et plot som viser celsiustemperaturen som funktion af fahrenheittemperaturen.
Brug kommandoen
antalpunkter = 30
for i in range(antalpunkter):
.....
Læg mærke til at i i for-loopet selv bliver talt op hver gang den kører en gang.
Find info og eksempler om for loopet på Tips og Tricks.
Ændr programmet fra opgave 4 til at bruge while loopet i stedt for for
while t < antalpunkter :
....
....
i = i + 1
Læg mærke til at for loopet automatisk forøger i-værdien hvorimod while skal have linjen i = i+1 i loopet.
Skal man plotte noget skal have en x-akse og en y-akse. Jeg forslår at du bruger "lister"
Lister kunne være
minliste = [1,2,3,4,5,6,7,8]
minliste2 =['Michael','Marianne','Amalie']
Den første indeholder tal (variabeltypen = int) den anden liste indeholder tekst (variabeltypen = str). Ændrer du
minliste = [1,2,3,4,5.4,6,7,8] vil det 5 element være en float resten int. Lister kan indeholder en blanding af variabeltyper.
Definér to tomme lister som bliver lister med tal!
antalpunkter = 200
cellist =[]
farlist =[]
For at generere en liste med 200 beregnede punker brug for og range!
for i in range(antalpunkter):
tfar = i-30
..... .....
cellist.append(tcel)
farlist.append(tfar)
Husk at der er
plt.scatter som genererer punkter
plt.plot som genererer en linje
Inden du afslører løsningen se denne her side
Husk du kan plotte label, x og y-akser samt titler snilt med plt funktionen. Jeg har løsningen her men prøv om du ikke kan finde det uden at kikke her.
plt.scatter(farlist,cellist,label="Tcel = (Tfar-32)/1.8")
plt.xlabel('Temperatur i Fahrenheit')
plt.ylabel('Temperatur i Celsius')
plt.legend(loc='upper left')
plt.title('Celsius-Fahrenheit graf')
plt.grid()
plt.savefig('fahrenheit-celsius-graf.png')
plt.show()
while i < (antalpunkter):
tfar=i-30
tcel=(tfar-32)/1.8
farlist.append(tfar)
cellist.append(tcel)
print(i)
i = i+1
Her introduceres numpy og linspace() to vigtige ting når man skal regne og plotte grafer
numpy indeholder funktioner som sinus og cosinus.
Kør koden til højre se plottet og diskutér det.
Hvad er der galt? hvorfor er det ikke en pæn sinus?
import numpy as np
x = [1,2,3,4,5,6]
y = np.sin(x)
import matplotlib.pyplot as plt
plt.plot(x,y,'r--',linewidth=3)
Se her hvis du vil forstå den sidste linje.
Prøv at skrive plt.scatter i stedet for hvad gør det?
For automatisk at generere en x-akse med mange værdier kan du brug den fantastiske funktion
x = np.linspace(0,6,100)
linspace er en funktion fra numpy. Den har tre argumenter og ovenstående genererer 100 værdier ligelig fordelt fra 1 til 6.
Modificér nu koden sådan at du får en "pæn" sinuskurve. Brug linspace funktionen som vister her til højre eller her.
Plot nu to grafer. Ind i hinanden. Listerne nedenunder er kun til inspiration, find gerne på dine egene lister. Måske har du et gammelt forsøg? Hvad med Ohms lov eller Ohms 2. lov?
Graf 1 er en sinuskurve (gang amplituden med 4) fra 0 til 2PI (brug plot)
Graf 2 er en graf bestående af punkter fra følgende to lister: (brug scatter)
list1 =[0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]
list2 =[-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6]
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(0,6,100)
y = np.sin(x)*4
list1 =[0,0.5,1,1.5,2,2.5,3,3.5,4,4.5,5,5.5,6]
list2 =[-6,-5,-4,-3,-2,-1,0,1,2,3,4,5,6]
plt.plot(x,y,'r--',linewidth=3)
plt.scatter(list1,list2)
Tilfældighedsgeneratoren bruges oftere end man tror. Fx en quiz som skal være et random spørgsmål eller radioaktiv henfald er to eksempler.
Python bruger pakken numpy til at generere tilfældige tal.
Kør programmet til højre og se hvad det gør.
import numpy as np
antalgange = 10
for i in range(antalgange):
tal = np.random.random()
print(tal)
Modificer koden sådan at den skriver 1000 random tal mellem 0 og 300 i en liste (brug .append)
Modificer koden sådan at den laver en graf over dine tal x-aksen fra 0 til 1000 og y-aksen fra 0 til 300
Løsning til opgave C2
import numpy as np
antalgange = 1000
tlist=[]
for i in range(antalgange):
tal = round(np.random.random()*300)
tlist.append(tal)
print(tlist)
Løsning til opgave C3
import numpy as np
import matplotlib.pyplot as plt
antalgange = 1000
nlist=[]
tlist=np.linspace(0,600,antalgange)
for i in range(antalgange):
tal = round(np.random.random()*300)
nlist.append(tal)
plt.scatter(tlist,nlist)
#print(tlist)
#print(nlist)
Lineær regression er enormt brugt i kemi og fysik. Python er mester til det på mange måder. Fidusen er at man har to talrækker x og y som i python skal angives enten som lister eller som array. I dette afsnit lærer du at anvende lineær regression. I næste kapitel kommer i til at skrive og læse data direkte fra excel filer.
Jeg har lavet en side hvor jeg har samlet 4 programmer. De har forskellige kvaliteter, REG1 fx er meget nem og hurtig, men kan kun lave lineær og polynomium regression. REG2 er dejlig nem (fra scipy-pakken ikke numpy) den arbejder med lister og kan lave exponentiel regression.
REG3 er klart den bedste til radioaktivitets projektet, men den arbejder med arrays og ikke lister, den kræver startværdier men kan til gengelt også fitte hvad som helst. Så det er den vi arbejder henimod den skal bruges til projektet radioaktivitet.
I skal ikke kunne skrive disse implementeringer fra bunden af. Genbrug koden fra siden og forstå hvad den laver.
Kopier koden fra REG1 og find nogle data fra din fysik eller kemiundervisning. C-vitamin, Ohms 1 eller 2. lov, tyngdeacceleration eller lignende tag tallene og skriv dem ind i REG1
Brug de samme tal nu for REG2. Se om begge metoder giver samme hældning og skæringsværdi.
Hvilken metode vil du foretrække ?
Tag nu ovenstående kode og plot både dine værdier plt.scatter(x,y) og din regressionslinje i samme graf.
Kast dig nu over denne her metode REG3 fra scipy pakken. Klip koden over til spyder og gennemgå den for dig selv linje for linje imens du læser kommentarene på venstre side. Gør det! Det er det hele værd. Du kan forstå ALLE linjer i denne kode.
Kør filen og modificér startværdierne og se om du kan få den til at gå i stykker.
Gennemgå linjen popt,pcov = curve_fit .... vi bruger ikke covariansen til noget (pcov) men prøv at forstå resten.
Definér nu tre startværdier som variabler og erstat dem i ovenstående linje.
Forstå linjen med "minlegende" og hvordan .format bruges
Det største problem med at læse og skrive til excel filer er at finde dem i den rigtige mappe. Start derfor med at klikke på windows stigfinder eller "finder" på MAC og find ud af hvor dine *.py filer er gemt henne. Tag din excelfil og læg den i samme mappe!
Åbn nu DENNE SIDE i et andet browser vindue. Det er herfra vi skal hente kode.
Ligesom numpy hjælper med beregninger og matplotlib bruges til plot er der et bibliotek med navn "Pandas" som samarbejder med filer på harddisken.
import pandas as pd
For at bruge python til excel skal de rigtige data fra excel læses over til lister i python. Se den her linje:
minfil = pd.DataFrame.from_dict({'x-værdier':tlist,'y-værdier':nlist})
minfil.to_excel('radio-1.xlsx',sheet_name='første',header=True,index=False)
minfil er en variabel af typen "DataFrame" som er en slags tabel. Den indeholder 3 søjler.
søjle er rækkeværdien i den kommende excelfil
søjle er x-værdierne med overskrift
søjle er y-værdierne med overskrift
Læs nu i koden her og brug den til at løse nedenstående opgaver
Vil du læse excel filer skal du også bruge panda, (import pandas as pd) men læse til filen df vha følgende linje:
df = pd.read_excel('minexcelfil.xlsx')
Skriv nu print(df) for at se hvordan filen ser ud. Det er klart bedst at have data LODRET i sin excel fil. Se nederst til højre for opgave E3 hvordan en excel fil kan se ud. For at læse en kolonne over til python skal du kende dens overskrift som står i øverste række. fx "tid/S" eller "Gruppe 2" Brug nu følgende linje til at læse kolonnen over til et array i python
tidsarray = df["tid/s"].to_numpy()
gr1sarray = df["Gruppe 1"].to_numpy()
...
Gennemgå DENNE SIDE grundig og forstå hvad der sker.
Generer to lister med tal vha et loop eller numpy (xlist=np.linspace(0,6,100)) som du skriver til en excel fil.
Leg lidt med overskrifterne og se om du kan få filen til at forandre sig.
Hvormange rækker kan excel egentlig klare?
Find en excelfil som du har brugt lineær regression på fra din computer. Joules lov, Ohms lov, densitet, c-vitamin, fing - g, idealgasloven .. whatever.
Brug import pandas as pd (Panda bibliotekerne) til at importere excel filer med
Kopier koden fra denne side og generer et plot i python.
Opgaven går ud på at læse en fil fra harddisken og regne på de læste data. Start med at downloade denne excel fil, som er vist her til højre, og gem det i samme mappe som dine python programmer ligger. Vi bruger kode fra opgave E2. Vi vil gerne skrive et program som læser Række A i en array lad os kalde den tidsarray . Række B C D og E er data over radioaktive henfald lavet med klassen 2y i året 2019.
Prøv at gør så meget som muligt uden at bruge hjælpen på højre side.
Start med at læse filen læser alle 5 søjler ind i 5 lister som du passende kalder tidsarray, chrarray, gr1array .... tjek om programmet læser rigtig ved at bruge fx print(tidsarray)som test om den læser rigtigt.
beregner summen af kolonne B C D og E og plotter tiden i kolonne A som x-akse og summen som y-akse.numpy har en funktion np.add(arr1,arry) som adderer alle elementer i TO arrays, ikke flere, så man skal bruge funktionen et par gange for at få det til at virke.
skriv nu en linje scatter eller plot som du bruger til at se på dine data. Nu kan du stoppe :-) den næste opgave kræver at du kaster dig over eksponentiel regression. Hvis du hellere vil arbejde videre med ovenstående gør det!
Koden som vi skal bruge til denne opgave bliver en modificeret version af koden fra denne side om eksponentiel regression. I opgaven skal du tilpasse koden sådan at den passer til dit input fra ovenstående opgaver. Prøv det INDEN du afslører resultatet til højre.
Vi vil nu bruge eksponentiel regression fra denne side til at fitte vores data fra excel.
Start med at kopiere den relevante kode fra siden over. Du skal erstatte x-vaerdier og y-vaerdier med tidsarray og sumarray. Prøv at tilpasse koden sådan at den kan køre.
Hint 1: INDEN du tjekker koden til højre. Tjek følgende b=popt[1].round(6) det er vigtigt at du ændrer round(2) til round(6) eller mere fordi din henfaldskonstant er meget lille og du mangler decimaler.
Tilpas plottefunktionerne sådan at x og y akserne er korrekte.
Læg mærke til linjen:
plt.plot(tidsarray, func(tidsarray, popt[0],popt[1],popt[2])).
Den kalder funktionen
def func(x, a, b, c):
return a * np.exp(-b * x) + c
np.exp beregner exponentialfunktionen vha numpy. Funktionen har 4 argumenter: x,a,b og c. Funktionen "returnerer" eller beregner y-værdierne en for en i et nyt array. Prøv at skrive
y=func(tidsarray,popt[0],popt[1],popt[2])
print(y)
For at se hvordan funktionen arbejder
I sidste ende er vi interesseret i en størrelse der hedder halveringstiden så den har jeg sat til visning i overskriften.
Tjek også den her linje
y=3606.06exp(-0.004234x)+-21.25
De tre talværdier er output fra curve_fit funktionen. De er sat sammen vha .format så den sidste kommando printer til consollen:
print('The equation of regression line is y={0}exp(-{1}x)+{2}'.format(a,b,c))
Opgaven omhandler henfald af Barium 137 som er en radioaktiv kilde vi har på skolen.
Google halveringstiden på 137Ba og sammenlign med dit resultat!
Hjælp til E3-1:
import pandas as pd
import numpy as np
df = pd.read_excel('2y-Radioaktivitet.xlsx')
tidsarray = df["tid/S"].to_numpy()
gr1array = df["Gruppe 1"].to_numpy()
Hjælp til E3-2:
sumarray1=np.add(gr1array,gr2array)
sumarray2=np.add(gr3array,gr4array)
sumarray=np.add(sumarray1,sumarray2)
print(sumarray)#test om det virker
Hjælp til E3-3:
plt.plot(tidsarray,sumarray,'b:',lw='1')
Hjælp til E4:
from scipy.optimize import curve_fit
def func(x, a, b, c):
return a * np.exp(-b * x) + c
popt, pcov = curve_fit(func, tidsarray,sumarray, p0=[3500, 0.13, 0])
a=popt[0].round(2)# popt indeholder a b og c i en liste med mange decimaler
b=popt[1].round(6)# round runder til 6 decimaler
c=popt[2].round(2)
#beregne halveringstid
halveringstid=np.log(2)/b
t_en_halv=halveringstid.round(3)
minlegende=('y = {0} * exp(-{1}x) + {2}'.format(a,b,c))
#x_plot=np.linspace(0,60,100)
plt.plot(tidsarray, func(tidsarray, popt[0],popt[1],popt[2]), 'r-',label=minlegende)
plt.plot(tidsarray,sumarray,'b:',label='datapunkter')
plt.title('Radioaktiv henfald med T1/2 = {0}s'.format(t_en_halv))
plt.xlabel('tid i sekunder')
plt.ylabel('N(t)')
plt.legend()
plt.grid()
plt.show()
print('The equation of regression line is y={0}exp(-{1}x)+{2}'.format(a,b,c))
print('halveringstid = {0} s'.format(t_en_halv))
slut! :-)
ps læg mærke til at man kan erstatte
plt.plot(tidsarray, func(tidsarray, popt[0],popt[1],popt[2]), 'r-',label=minlegende)
med
plt.plot(tidsarray, func(tidsarray, *popt), 'r-',label=minlegende)
Stjerne * betyder "alt" altså *popt betyder "alt fra popt"
Her er hele koden til opgaverne E3 og E4 som trækker på filen 2y-Radioaktivitet.xlsx som skal ligge i samme mappe som py-filen.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_excel('2y-Radioaktivitet.xlsx')
print(df) #printer det som python har læst fra filen just for check
tidsarray = df["tid/s"].to_numpy() #indlæser første linje fra excelfilen
gr1array = df["Gruppe 1"].to_numpy() #indlæser fra excelfilen
gr2array = df["Gruppe 2"].to_numpy()
gr3array = df["Gruppe 3"].to_numpy()
gr4array = df["Christoph"].to_numpy()
#print(tidsarray)
#print(gr4array)
sumarray1=np.add(gr1array,gr2array) #np.add kan kunn addere to arrays ad gangen
sumarray2=np.add(gr3array,gr4array)
sumarray=np.add(sumarray1,sumarray2) #indeholder nu summen af alle forsøg fra 2y
#print(sumarray)
#plt.plot(tidsarray,sumarray,'b:',lw='1')
from scipy.optimize import curve_fit # curve_fit laver et fit med "func" funktionen
def func(x, a, b, c): #fittefunktionen "func" defineres og kaldese senere med "func"
return a * np.exp(-b * x) + c
#nedenstående linje laver fittet og beregner a, b og c som popt[0], popt[1] osv
#pcov skal vi ikke bruge.
#p0=[3500, 0.13, 0] er startværdierne til fittet, kan faktisk undlades
popt, pcov = curve_fit(func, tidsarray,sumarray, p0=[3500, 0.13, 0])
#popt, pcov = curve_fit(func, tidsarray,gr1array, p0=[3500, 0.13, 0])
#ovenstående linje plotter KUN en fjerde del af data
a=popt[0].round(2)# popt indeholder a b og c i en liste med mange decimaler
b=popt[1].round(6)# round runder henfaldskonstanten til 6 decimaler
c=popt[2].round(2)
#y=func(tidsarray, popt[0],popt[1],popt[2])
#print(y)
#plt.plot(tidsarray,y)
#beregne halveringstid
halveringstid=np.log(2)/b
t_en_halv=halveringstid.round(3)
minlegende=('y = {0} * exp(-{1}x) + {2}'.format(a,b,c))
#minlegende er teksten som skal stå i plottet
plt.plot(tidsarray, func(tidsarray,a,b,c), 'r-',label=minlegende)
plt.plot(tidsarray,sumarray,'b:',label='datapunkter')
#plt.plot(tidsarray,gr1array,'b:',label='datapunkter') #hvis man plotter 1/4 af data
plt.title('Radioaktiv henfald med T1/2 = {0}s'.format(t_en_halv))
plt.xlabel('tid i sekunder')
plt.ylabel('N(t)')
plt.legend()
plt.grid()
plt.show()
print('The equation of regression line is y={0}exp(-{1}x)+{2}'.format(a,b,c))
print('halveringstid = {0} s'.format(t_en_halv))