Lab 4 - Python-del
I denna lab skall ni skriva ett program som läser in data från en serie drag-experiment och plottar och behandlar dom. Nedanför finns ett skelett för programmet, där ni måste fylla i några av funktionerna och få dom att funka.
Den första sektionen definierar några variabler som ni sedan kan använda, och dessutom innehåller en funktion read_data()
som tar ett filnamn som parameter och returnerar innehållet i filen som en matris med 5 kolumner. Dessutom finns funktion-prototyp för de övriga funktioner ni kommer behöva, men utan innehåll.
Se dessutom nedanför för lite tips till funktioner ni kanske kommer behöva samt en kort introduktion till NumPy-biblioteket som användas till att behandla matriser och Matplotlib som användas för att plotta data.
Uppgiften:
Fylla i funktionen
calc_strain_load()
så att den plockar ut töjning och spänning från ett dataset och returnerar dom.Fylla i funktionen
find_peak()
så att den returnerar töjning och spänning för toppen av "spännings-spetsen" (enligt dragprovs-beskrivningen). Det räcker om ni antar att spetsen finns där spänningen är högst för töjnings-värde under 0.005%.Fylla i funktionen
find_gradient()
så att den returnerar värden för E-modul, dvs lutningen på linjen mellan utgångspunkten och spännings-spetsen.Fylla i funktionen
find_strain_limit()
så att den returnerar värden av . Ni kan utgå ifrån att detta värde som den lägsta spänningsvärde motsvarende töjnings-värde mellan punkten där spännings-spetsen finns, och 0.05.Fylla i funktionen
process_file()
så att den tar in ett filnamn och använder dem ovan definierade funktioner till att:
Läsa in data från filen.
Plotta töjning och spänning som en graf.
Markera spännings-spetsen och -värdet på grafen.
Skriva ut E-modul (lutningen på kurvan). Kom ihåg att få rätt enhet på värdet.
Anropa funktionen
process_file()
på dom tillgängliga datafilerna. Filerna finns på Python-datorn och har filnamn som "Specimen_RawData_XX.csv" där XX är ett nummer mellan 1 och 28. Emellertid saknas någon av filerna (det finns totalt 19 filer), så ni behöver kolla vilka filer som finns och bara läsa in dom.
Om ni föredrar något annat sätt att strukturera funktionerna får ni modifiera dom (och även göra nya funktioner om så behövs), men funktionaliteten måste kvarstå enligt beskrivningen ovan.
Extra utmaning till dom som är sugna
Ingen av funktionerna i punkt 1-4 ovanför behöver vara längre än 5 linjer/rader kod. Flera av dem behöver faktisk bara vara 2-3 linjer. Om ni försöker optimera detta, så se till att det inte skadar läsbarheten!
Redovisning
Labben ska redovisas för labhandledaren vid ett labtillfälle där alla som labbat tillsammans ska delta och kunna svara på frågor från labhandledaren. Sista ordinarie datum för redovisningen är 2015-01-09. Sen redovisning kan ske efter överenskommelse med labhandledare.
Snabb-intro till NumPy och Matplotlib
NumPy (Numeric Python) är ett bibliotek för att göra beräkningar på numeriska dataset/datamängder som har en serie funktioner vanliga Python-listor saknar. Dessutom funkar NumPy bra för stora dataset. Relevant för er här är att NumPy har en datatyp (array
) som representerar en matris, lik den som MatLab använder.
Funktionen read_data
nedanför returnerar en sådant array; ni kan använda det ungefär som en vanlig lista, förutom att det också går att få ut data från en två-dimensionell matris. Sålunda är array[1,2]
andra rad, tredje kolumn (till skillnad från Matlab börjar arrays räkna från 0). Om man vill ha ut en hel rad eller kolumn är tex array[1,:]
andra rad och array[:,3]
fjärde kolumn. Det går att göra for
-loopar över ett array på samma sätt som med en vanlig lista. Slutligen går det att räkna med hela matriser eller rader/kolumner. array/2
delar tex alla element i array
med två.
Matplotlib är ett bibliotek för att plotta data. Det har många möjligheter (ni skall få se någon av dom på föreläsningen den 8. december), men för att plotta töjning och spänning behöver ni bara känna till funktionen plot( )
som finns i modulen plt
. Den anropas som plt.plot(X,Y)
, där X och Y är antigen siffror eller listor med siffror, och plottar dom angivna X- och Y-värdena. Det går till och med att ange utseende på tredje platsen, så tex plt.plot(X,Y,'o')
plottar X och Y med cirklar (istället för linjer som vanligt). Andra sättet är bra om ni tex skall markera ett enda värde på en graf.
Användbara funktioner
Det kan gå att lösa labben utan att använda dom här funktionerna, men ni kanske tycker dom är bra...
Funktionen
os.path.exists()
tar in ett filnamn och returnerar True om filen existerar, och False annars.Om
a
är en array gera.min()
minsta värden i det array'en, ocha.max()
ger största. På samma sätt gera.argmin()
platsen i array'en där minsta värdet finns, ocha.argmax()
ger platsen där största värdet finns. Dvsa.min() == a[a.argmin()]
ocha.max() == a[a.argmax()]
.Om man anropar
plt.plot()
flera gånga på rad blir alla anrop plottade ovanpå varandra. Detta kan vara bra om man tex skall markera något på en graf, eller vill jämnföra flera dataset. Men det kan också vara förvirrande, särskilt om man har för många grejar att plotta på en gång. I så fall kan det vara bra att splittra upp plottarna i flera figurer.Man tar fram en ny figur genom att anropa
plt.figure()
. Om man sedan anroparplt.plot()
, plottar den på sist skapade figuren.
Funktion till inläsning osv
Evaluera den här koden för att kunna använda funktionen och värdene nedanför. Eller, om ni inte jobbar i iPython, kopiera då koden till er kodfil.
Funktioner ni behöver fylla i
Fyll i dom här funktionerna enligt beskrivningen ovan, och anrop sedan process_file med rätt filnamnar.