Modelica auselsen und plotten

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
Kyko
User
Beiträge: 1
Registriert: Montag 4. März 2019, 11:10

Montag 4. März 2019, 11:21

Hallo zusammen,

ich hoffe ich bin im richtigen Forum, anderenfalls möchte ich um Entschuldigung bitten.

Ich möchte mit Python auf ein Model von Modelica zugreifen einen Paramter mit einer Schleife ändern und anschließend plotten. Hier mein Code:

Code: Alles auswählen

import os

import buildingspy.simulate.Simulator as si
import matplotlib as mpl
mpl.rcParams["text.latex.preamble"] = ["\\usepackage{siunitx}"]
mpl.rc('font',
       family ='sans-serif',
       serif = ['Computer Modern Roman'],
       size = 11)
mpl.rc('text', usetex=True)  # Damit werden alle strings mit LATEX compiliert
import matplotlib.pyplot as plt
from buildingspy.io.outputfile import Reader
#import numpy as np

#model = 'ZweiteHausaufgabe.HeizkoerperReglungEntwerfen'  # Mode"
#path_M =  "/home/pget2018-w5eg4b2cpx/Regler"

model = 'Hauptphase.Parameterstudie_bef'
path_M="/home/pget2018-w5eg4b2cpx/Schreibtisch/Hauptphase"

#/home/pget2018-w5eg4b2cpx/Schreibtisch/Hauptphase/Hauptphase/Parameterstudie_bef.mat

path=[]
res=[]

#Temperatur
T_start= 10
T_stop=10 #34
T_step=2
#relative Luftfeuchte
phi_start=0
phi_end=94
phi_step=94 #2

simulatingtime = 3600*24#*365

datenx = range(phi_start,phi_end+1,phi_step)
daten = range(T_start,T_stop+1,T_step)
anzahl= len(daten)
anzahlx=len(datenx)


plt.figure(figsize=(10,5))

def CaseStudy(s):
    s.setStopTime(simulatingtime)
    s.setTimeOut(simulatingtime)
    s.showProgressBar(False)
    s.printModelAndTime()
    s.setSolver("dassl")
    s.simulate()

for i in daten:
    for j in datenx:
        s=si.Simulator(model,"dymola",str(i), path_M)
        s.addParameters({'T_AUL': i})
        CaseStudy(s)
        path.append(os.path.join(str(i), "Parameterstudie_bef.mat"))
        
for u in range(anzahl):
    res = Reader(path[u], 'dymola')
    res = Reader(path, "dymola")
    time, y = res.values("V_AUL1.dp")
    plt.plot(time/3600,y/1000,
    label=str('10' + r' $\si{\celsius}$'))

plt.plot()
plt.xlabel(r'Zeit t / $\si{\hour}$')
plt.ylabel(r' Druck $\p $ / $ \si{\Pascal}$')
plt.grid(True)
plt.legend()

plt.savefig("Bef.svg")
plt.ylabel(r'Heizenergie E / $\si{\kilo\watt\hour}$')
plt.grid(True)
plt.legend()


plt.savefig("Parameterstudie.svg")
Als Fehlermeldung bekomme ich "FileNotFoundError: [Errno 2] No such file or directory: '10/Parameterstudie_bef.mat'".
Meine Vermutung liegt also bei

Code: Alles auswählen

 path.append(os.path.join(str(i), "Parameterstudie_bef.mat"))
Jedoch weis ich nicht was ich falsch mache, vielleicht kann mir jemand weiterhelfen.

Danke für eure Zeit.

Gruß
Max
Benutzeravatar
sparrow
User
Beiträge: 1023
Registriert: Freitag 17. April 2009, 10:28

Montag 4. März 2019, 11:38

Offensichtlich wird eine Datei nicht gefunden.

Es ist schlecht Variablen "i" oder "j" zu nennen, weil dann niemand weiß, was sich dahinter verbirgt. (Das gilt auch für alle anderen nichtssagenden Variablennamen in deinem Code). "j" wird in der for-Schleife gar nicht verwendet. Soll das so? Dann nenne die Variable _, das ist per Konvention eine Variable, die nicht benötigt wird. Auf der anderen Seite: Wenn man die Variable nicht braucht, braucht man auch die Schleife nicht.
In deinem Fall solltest du herausfinden, ob das Ergebnis von os.path.join(str(i), "Parameterstudie_bef.mat") tatsächlich das ist, was du erwartest.

Variablennamen sollen sprechend sein und zu erkennen geben, was sie repräsentieren.
Namen von Methoden werden klein_mit_unterstrich geschrieben. Klassennamen GroßAlsCamelCase und Konstanten KOMPLETTGROSS.

Übrigens wäre die vollständige Fehlermeldung hilfreich. Die sagt nämlich auch _wo_ der Fehler auftritt.

Und Methoden bekommen Parameter übergeben und geben per return etwas zurück.
Dass die als Parameter übergebenen Objekte verändert werden, ist unüblich.

Die Pseudo-Funktion CaseStudy kann weg, die paar Zeilen darin, dort eingefügt werden wo die Funktion im Moment aufgerufen wird.
Allerdings machen sie da auch keinen Sinn, weil s dort ja nicht verwendet wird. Es wird bei jedem Schleifendurchlauf zwar gebaut, hat aber mit dem, was da in der Schleife passiert (das anhängen eines Pfades) nichts zu tun. Mit dem Ergebnis wird einfach nichts gemacht.

In der Schleife, in der du über die Anzahl von "anzahl" per range iterierst, kannst du auch direkt über die Objekte in der Liste iterieren. Mit range einen Index-Zugriff in der for-Schleife zu bauen ist ein Anti-Pattern in Python. Das macht man so nicht. Außerdem bindest du da einmal "res" an einen Listeneintrag per Index, eine Zeile später bindest du die ganze Liste an "res"?!?

Insgesamt ist der Code sehr kaputt.
Antworten