Simulering av solkraftverk - filhantering
Hej, Jag har stött på ett problem med mitt projekt och vet inte vad som är felet. Projektet går ut på att simulera ett solkraftverk samt ett vindkraftverk för högre betyg. Relevanta data för respektive kraftverk under ett års tid skall sparas i varsin fil. Mitt problem uppstår när jag vill köra programmet, då allt fungerar alldeles utmärkt förutom att om jag exempelvis vill simulera en undersökning, får jag två års resultat istället för ett års. Jag får helt enkelt två års data för en undersökning när tanken är att det ska vara ett år.
Jag har rådfrågat lärarasisstenter men de verkar oeniga om problemet: Den ena påstår att felet ligger i att jag öppnar filen varje dag, den andra påstår att felet ligger i hur jag hanterar min lista. Min fullständiga kod finns nedan, hjälp uppskattas :) PS: under bilderna finns även koden kopierad om det önskas.
import math
import random
class Solkraftverk:
'''Skapar klassen Solkraftverk och beräknar samt presenterar relevant info för dess objekt'''
def __init__(self, latitud = 0, area = 450):
self.area = area
self.latitud = latitud
self.solighetsfaktor = random.random()
self.soltal = random.randrange(5, 7)
# area: solfångarens area (några 100-tal m^2)
# soltal: Proportionalitetskonstant (energi/ytenhet) PS: togs fram via google
# solighetfaktor: slumpas fram ett tal mellan 0 & 1
# latitud: anges av användaren
def energifunktion(self, tid):
# räknar ut energifunktion med parametrar t & latitud
v = ((23.5 * math.sin(((math.pi * (tid - 80)) / 180)) + 90 - self.latitud)) / 90
if 0 < v < 1:
v = v**2
elif v >= 1:
v = 1
elif v <= 0:
v = 0
return v
def energiproduktion(self):
# beräkning av energiproduktion varje dag under ett år
w = 0
for tid in range(0, 360):
self.solighetsfaktor = random.random()
energi = (self.area * self.soltal * self.solighetsfaktor * self.energifunktion(tid))
w += energi
self.spara_info(tid, energi)
return w
def årsmedelproduktion(self):
# Beräknar årsmedelproduktionen
return self.energiproduktion() / 360
def __gt__(self, other):
# jämför värderna för olika scenarion och möjliggör sortering för solkraft
return self.årsmedelproduktion() < other.årsmedelproduktion()
def __repr__(self):
# möjliggör printfunktioner av klassen för solkraft
return f"{self.latitud} {self.årsmedelproduktion()}"
def spara_info(self, tid, energi):
# sparar all relevant information dagligen i filen under formatets struktur för solkraft
lista_månad = ["Januari", "Februari", "Mars", "April", "Maj", "Juni",
"Juli", "Augusti", "September", "Oktober", "November", "December"]
with open("solkraftverk_info.txt", "a") as file:
if tid % 30 == 0: # bestämmer när nästa månad ska skrivas ut i filen, hårdkodad fil***
file.write(f" \n {lista_månad[(tid) // 30]} \n")
file.write(f"{self.area} {self.soltal} {self.latitud} {tid + 1} {self.solighetsfaktor} {self.energifunktion(tid)} {energi}\n")
def format(self):
# skriver ut ett fast och strukturerat format i filen för solkraft
format = ("Format: Area, soltal, latitud, dag, solighetsfaktor, f(t,latitud), W(t)"
+ "\n====================================================================") #JANUARI *******
with open("solkraftverk_info.txt", "w") as file:
file.write(f"{format}")
class Vindkraftverk:
'''Skapar klassen Vindkraftverk och beräknar samt presenterar relevant info för dess objekt'''
def __init__(self, rotordiameter = random.randrange(25, 50), effekt = random.randrange(495, 505)):
self.rotordiameter = rotordiameter
self.effekt = effekt
self.luft_densitet = 1.225
self.effektkoefficient = round(random.uniform(0.40, 0.45), 2) #max är ca 0.59 enligt Betz lag
self.lista = []
'''rotordiameter: mellan 25 & 50 meter
effekt: Runt 500kW'''
def wattfunktion(self, vindhastighet):
# beräkning av effekt baserat på vindförhållanden (höst, vinter, vår & sommar)
w = ((1/2) * self.luft_densitet * math.pi * (self.rotordiameter / 2)**2 * vindhastighet**3 * self.effektkoefficient)
return w
def energiproduktion(self):
# beräkning av energiproduktionen för varje dag i ett år samt den totala energiproduktionen
e = 0
for tid in range (0, 360):
energi = self.wattfunktion(self.årstider(tid)) * 24 # Energi = effekt * tid
e += energi
self.spara_info(tid, energi)
return e
def årstider(self, tid):
# bestämmer vindhastigheten utifrån årstid under året
vindhastighet = 0
if 330 <= tid < 360 or 0 <= tid < 60 or 150 <= tid < 240:
vindhastighet = random.randrange(4, 8) #december -> februari & maj -> augusti (vinter & sommar)
elif 60 <= tid < 150 or 240 <= tid < 330:
vindhastighet = random.randrange(8, 12) #februari -> maj & augusti -> december (vår & höst)
return vindhastighet
def årsmedelproduktion(self):
# beräknar årsmedelproduktionen
return self.energiproduktion() / 360
def format(self):
# skriver ut ett fast och strukturerat format i filen för vindkraft
format = ("Format: dag, vindhastighet, rotordiameter, effektkoefficient, luftdensitet, W, E(t)"
+ "\n====================================================================")
with open("vindkraftverk_info.txt", "w") as file:
file.write(f"{format}")
def spara_info(self, tid, energi):
# sparar all relevant information dagligen i filen under formatets struktur för vindkraft
lista_månad = ["Januari", "Februari", "Mars", "April", "Maj", "Juni",
"Juli", "Augusti", "September", "Oktober", "November", "December"]
with open("vindkraftverk_info.txt", "a") as file:
if tid % 30 == 0: # bestämmer när nästa månad ska skrivas ut i filen
file.write(f" \n {lista_månad[(tid) // 30]} \n")
file.write(f"{tid + 1} {self.årstider(tid)} {self.rotordiameter} "
f" {self.effektkoefficient} {self.luft_densitet} {self.wattfunktion(self.årstider(tid))} {energi} \n")
def __gt__(self, other):
# jämför värderna för olika scenarion och möjliggör sortering för vindkraft
return self.årsmedelproduktion() < other.årsmedelproduktion()
def __repr__(self):
# möjliggör printfunktioner av klassen för vindkraft
return f"{self.rotordiameter} {self.årsmedelproduktion()}"
# ___________________________ Funktioner _________________________________
def kolla_positiva_int(data):
# kollar om den givna datan innehåller bokstäver
while True:
try:
index = int(input(data))
if index > 0:
return index
else:
print("Bara positiva nummer, försök igen ")
except ValueError:
print("Bara positiva nummer, försök igen ")
def kolla_float(data):
# kollar om den givna datan innehåller bokstäver
while True:
try:
index = float(input(data))
return index
except ValueError:
print("Bara positiva nummer, försök igen ")
def kolla_text(data):
# kollar om den givna datan innehåller siffror
while True:
index = str(input(data))
if not index.isdigit():
return index
else:
print("Bara bokstäver, försök igen ")
def sortera_resultat_vind(vind_lista):
# sorterar och printar rotordiamter samt årsmedelprodultion i en tabell både i en fil och i terminalen
vind_lista.sort()
print("\n\nVindkraft: Rotordiameter Årsmedelproduktion")
for vindkraftverk in vind_lista:
print(f" {vindkraftverk}")
def sortera_resultat_sol(sol_lista):
# sorterar och printar latituder samt årsmedelprodultion i en tabell både i en fil och i terminalen
sol_lista.sort()
print("\n\nSolkraft: Latitud Årsmedelproduktion")
for solkraftverk in sol_lista:
print(f" {solkraftverk}")
def val_av_solkraft(lista):
# du anger hur många undersökningar du vill genomföra för solkraft samt ange latituderna, därefter börjar simuleringen
val_undersökningar = kolla_positiva_int("hur många undersökningar vill du genomföra för solkraft?: ")
n = 0
while (n < val_undersökningar):
latitud = kolla_float("Vilken latitud vill du simulera (mellan 0 & 90)?: ")
if 0 < latitud < 90:
area = kolla_float("Vilken area för solkraftverket vill du simulera?: ")
solkraftverk = Solkraftverk(latitud, area)
solkraftverk.format()
lista.append(solkraftverk)
n += 1
else:
print("Felaktig inmatning, prova igen ")
def val_av_vindkraft(lista):
# du anger hur många undersökningar du vill genomföra för vindkraft samt ange ev rotordiameter, därefter börjar simuleringen
val_undersökningar = kolla_positiva_int("hur många undersökningar vill du genomföra för vindkraft?: ")
n = 0
while (n < val_undersökningar):
val_ange_data = kolla_text("Vill du ange någon rotordiameter eller"
+ " fortsätta med standard (rotordiameter: 25-50 m)?: ")
if val_ange_data.strip().lower() == "nej":
print("nej")
vindkraftverk = Vindkraftverk()
vindkraftverk.format()
lista.append(Vindkraftverk())
elif val_ange_data.strip().lower() == "ja":
print("ja")
rotordiameter = kolla_float("Vilken rotordiameter vill du simulera?: ")
vindkraftverk = Vindkraftverk()
vindkraftverk.format()
lista.append(Vindkraftverk(rotordiameter))
else:
val_ange_data = kolla_text("Svara 'ja' eller 'nej': ")
n += 1
def val():
# frågar vad man vill simulera
solkraft_lista = []
vindkraft_lista = []
val_mellan_s_v = kolla_text("Vill du simulera solkraft, vindkraft eller båda?: ")
while True:
if val_mellan_s_v.strip().lower() == "solkraft":
val_av_solkraft(solkraft_lista)
sortera_resultat_sol(solkraft_lista)
break
elif val_mellan_s_v.strip().lower() == "vindkraft":
val_av_vindkraft(vindkraft_lista)
sortera_resultat_vind(vindkraft_lista)
break
elif val_mellan_s_v.strip().lower() == "båda":
val_av_solkraft(solkraft_lista)
val_av_vindkraft(vindkraft_lista)
sortera_resultat_sol(solkraft_lista)
sortera_resultat_vind(vindkraft_lista)
break
else:
val_mellan_s_v = kolla_text("Du måste svara solkraft, vindkraft eller båda, försök igen: ")
def main():
# kör programmet med relevanta anrop
val()
if __name__ == "__main__":
main()