Informationen zur Umgebungskonstruktionsmethode finden Sie im Artikel JModelica unter Ubuntu installieren.
Natürlich ist es auch möglich, die kompilierten FMUs aus Schritt 3 zu lesen.
Laut Google Sensei gibt es viele Probleme mit dem Anfangswert der linearen normalen Differentialgleichung erster Ordnung, wenn Sie in Modelica Hallo Welt sagen.
\begin{eqnarray}
\frac{dx(t)}{dt} &=& -x(t) \\
x(0) & = & 1
\end{eqnarray}
Die Methode zum Lösen mit Papier und Bleistift bleibt dem Lehrbuch überlassen, und die Ableitung der analytischen Lösung erfolgt mit SymPy. Führen Sie die folgenden Schritte in der Umgebung aus, in der SymPy verwendet werden kann.
python
import sympy
x = sympy.Function("x"); t,C1 = sympy.symbols("t C1")
#x(t)Löse ungefähr x(t) == C1*exp(-t)
ans = sympy.dsolve(x(t).diff(t)+x(t),x(t))
#Berechnen Sie die Integrationskonstante C1(t=0,x(0)=1)Und ersetzen Sie den Ausdruck von ans
C = {C1:ans.subs(x(t),1).subs(t,0).lhs}
ans.subs(C)
#--> x(t) == exp(-t)
Aus dem Obigen ergibt sich die analytische Lösung wie folgt.
\begin{eqnarray}
x(t) & = & \exp(-t)
\end{eqnarray}
Bereiten Sie die folgende Modelldatei vor
ode_test.mo
model HelloWorld
Real x(start=1);
equation
der(x)= -x;
end HelloWorld;
Zeilen 1-5: Modelldefinition (Klassendefinition) 2. Zeile: Definition der Zustandsvariablen x mit Anfangswert 1 Zeile 3: Der relationale Ausdruck jeder Variablen ist unten definiert. Signal 4. Zeile: Definieren Sie die Gleichung von dx / dt = -x
Starten Sie JModelica im Modelldateiverzeichnis. (Ändern Sie den Installationsort entsprechend)
bash
/home/ubuntu/JModelica/bin/jm_ipython.sh
ipython
from pymodelica import compile_fmu
hello_fmu = compile_fmu("HelloWorld","./ode_test.mo")
ipython
from pyfmi import load_fmu
hello_model = load_fmu(hello_fmu)
Berechnen Sie für 1 Sekunde
ipython
res = hello_model.simulate(final_time=1)
Auf das Ergebnis der Zustandsvariablen x kann mit res [" x "]
zugegriffen werden.
Stellen Sie die obigen analytischen Lösungen zusammen grafisch dar.
ipython
import numpy as np
from matplotlib import pyplot as plt
t = np.linspace(0,1,101)
x = np.exp(-t)
plt.plot(t, x, label="$x=e^(-t)$")
plt.plot(res["time"],res["x"],"--",label="JModelica")
plt.legend()
plt.show()
conda install -c https://conda.binstar.org/chria assimulo
ipython
from assimulo.solvers import CVode
from assimulo.problem import Explicit_Problem
#Definieren Sie eine Funktion, die eine Differentialgleichung darstellt
def ode_func(t,x):
dxdt = -x[0]
return np.array([dxdt])
#Definieren und berechnen Sie ein Modell, das explizite Probleme und Integratoren enthält
exp_mod = Explicit_Problem(ode_func, 1) #Der Anfangswert von x ist 1
exp_sim = CVode(exp_mod)
t1, x1 = exp_sim.simulate(1)#Berechnungszeit 1 Sekunde
#Ergebnisplot
plt.plot(t, x, label="$x=\exp(-t)$")#Analytische Lösung früher berechnet
plt.plot(res["time"],res["x"],'--',label="JModelica")#Numerische Lösung von JModelica
plt.plot(t1,x1,'-.',label="assimulo")#Numerische Lösung von Assimulo
plt.legend()
plt.show()
Recommended Posts