import numpy as np # numpy importeres her from matplotlib import pyplot as plt # pyplot som plt importeres her import math # math importeres her data = np.loadtxt('waterHeight.txt',skiprows = 1) # Laster inn dataen fra "waterHeight", og hopper over den første # raden. Time = data[:,0] # "Time" listen hentes ut her WaterHeight = data [:,1] # "WaterHeight" listen hentes ut her N = 277 # Det er 277 målinger t0 = 0 # Starttiden er 0 sekunder tSlutt = 276 # Sluttiden er 276 sekunder h = (tSlutt - t0) / (N - 1) # Steglengden er (276 - 0) / (277 - 1) = 276 / 276 = 1 for x in range(N): # For-løkke som kjøres N antall ganger WaterHeight[x] = -WaterHeight[x] + 21.8 - 5.7 + 21.8 # Her snus datasettet opp ned, og det løftes med 21.8cm, til hvor høyt vannet var ved staten av da forsøket ble # gjort. Slik modellerte jeg hva avstanden mellom denne vannhøyden og sensoren var, som var 5.7cm. Så løftet jeg # datasettet opp igjen med 21.8, slik at den kunne vise den reelle vannhøyden plt.plot(Time, WaterHeight, label = "Data") # Disse tallverdiene plottes inn til leseren, og grafens navn settes # til "Data" Ap = ((1/100/2)**2)*math.pi # Regner ut arealet av proppen, der proppens diameter er 1cm A = ((25.5/100/2)**2)*math.pi # Regner ut arealet av grunn/topp-flaten, der flatens diameter er 25.5cm k0 = 100/3 # Konstanten k0 settes til 100/3, altså hundre tredeler k = k0 * (Ap / A) # Regner ut k til bruk for eulermetoden T = np.zeros(N) # En liste av "T" (Time) lages her W = np.zeros(N) # En liste av "W" (WaterHeight) lages her Ti = np.zeros(N) # En liste av "Ti" (TimeIncrease) lages her Wi = np.zeros(N) # En liste av "Wi" (WaterHeightIncrease) lages her Td = np.zeros(N) # En liste av "Td" (TimeDouble) lages her Wd = np.zeros(N) # En liste av "Wd" (WaterHeightDouble) lages her TimeListe = [T, Ti, Td] # TimeListe settes til T, Ti, og Td WaterHeightListe = [W, Wi, Wd] #WaterHeightListe settes til W, Wi, og Wd kListe = [0, 0.4, 0.4] # Dette settes inn, for i den andre og den tredje beregningen er det en konstant tilførsel # av vann (ki), som står for konstantIncrease. Denne konstanten, etter modellering, settes til 0.4 multiplyListe = [1, 1, 2] # Dette settes inn, for i den tredje beregningen er det to hull istedenfor kun ett. # Denne konstanten (kd), som står for konstantDouble, settes til 2 tMove = [37, 37+60, 37+60*2] # Denne listen brukes for å flytte de tre beregnede grafene ett gitt mengde til høyre label = ["Normal", "Increase", "Double"] # Denne listen brukes for å navngi de ulike grafene for z in range(3): # For-løkke som kjøres 3 ganger wStart = [21.8, W[60], Wi[60]] # Disse er for å justere startverdien av grafene, til bruk for eulermetoden w = WaterHeightListe[z] # w her er alle de tre verdiene for WaterHeight t = TimeListe[z] # t her er alle de tre verdiene for Time w[0] = wStart[z] # Den første verdien av "W" er 21.8cm, og de andre verdiene kommer fra de forrige grafene t[0] = 0 # Den første verdien av "T" er 0s. De andre verdiene settes også til 0, men endres senere i koden for i in range(N-1): # For-løkke som kjøres N-1 antall ganger w[i + 1] = w[i] - k*(w[i]**0.5) * h * multiplyListe[z] + kListe[z] # Eulremetoden med diferentiallikningen # for tømming av tank, som den deriverte av w, i tillegg til multiplyListe og kListe. t[i + 1] = t[i] + h # Eulermetoden med tiden for x in range(N): # For-løkke som kjøres N antall ganger t[x] = t[x] + tMove[z] # Alle grafene flyttes til høyre med 37s, andre graf flyttes ytterligere 60s til # høyre, og tredge graf flyttes ytterligere 120s til høyre. Slik flyttes grafene til der de er relevante # å bruke plt.plot(t, w, label = label[z]) # Den kalkulerte verdien, altså vannstanden i forhold til tiden, plottes. # Navnet til grafene blir gitt her plt.xlabel("Tid [Sekunder (s)]") # Navngir x-aksen som "Tid [Sekunder (s)]" plt.ylabel("Vannhøyde [Høyde (h)]") # Navngir y-aksen som "Vannhøyde [Høyde (h)]" plt.legend() # Viser frem alle navngivelsene til grafene