Pour la méthode de construction de l'environnement, reportez-vous à l'article Installation de JModelica sur Ubuntu.
Bien entendu, il est également possible de lire les FMU compilées à partir de l'étape 3.
Selon Google Sensei, lorsque vous dites Hello World dans Modelica, il existe de nombreux problèmes avec la valeur initiale de l'équation différentielle normale linéaire du premier ordre.
\begin{eqnarray}
\frac{dx(t)}{dt} &=& -x(t) \\
x(0) & = & 1
\end{eqnarray}
La méthode de résolution avec du papier et un crayon est laissée au manuel, et la dérivation de la solution analytique se fait avec SymPy. Exécutez ce qui suit dans l'environnement dans lequel SymPy peut être utilisé.
python
import sympy
x = sympy.Function("x"); t,C1 = sympy.symbols("t C1")
#x(t)Résoudre environ x(t) == C1*exp(-t)
ans = sympy.dsolve(x(t).diff(t)+x(t),x(t))
#Calculer la constante d'intégration C1(t=0,x(0)=1)Et substitue à l'expression d'ans
C = {C1:ans.subs(x(t),1).subs(t,0).lhs}
ans.subs(C)
#--> x(t) == exp(-t)
D'après ce qui précède, la solution analytique est la suivante.
\begin{eqnarray}
x(t) & = & \exp(-t)
\end{eqnarray}
Préparez le fichier modèle suivant
ode_test.mo
model HelloWorld
Real x(start=1);
equation
der(x)= -x;
end HelloWorld;
Lignes 1 à 5: définition du modèle (classe) 2ème ligne: Définition de la variable d'état x avec la valeur initiale 1 Ligne 3: L'expression relationnelle de chaque variable est définie ci-dessous. Signal 4ème ligne: Définissez l'équation de dx / dt = -x
Démarrez JModelica dans le répertoire du fichier de modèle. (Modifiez l'emplacement d'installation le cas échéant)
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)
Calculer pendant 1 seconde
ipython
res = hello_model.simulate(final_time=1)
Le résultat de la variable d'état x est accessible avec res [" x "]
.
Tracez ensemble les solutions analytiques ci-dessus.
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
#Définir une fonction qui représente une équation différentielle
def ode_func(t,x):
dxdt = -x[0]
return np.array([dxdt])
#Définir et calculer un modèle qui inclut des problèmes explicites et des intégrateurs
exp_mod = Explicit_Problem(ode_func, 1) #La valeur initiale de x est 1
exp_sim = CVode(exp_mod)
t1, x1 = exp_sim.simulate(1)#Temps de calcul 1 seconde
#Graphique des résultats
plt.plot(t, x, label="$x=\exp(-t)$")#Solution analytique calculée plus tôt
plt.plot(res["time"],res["x"],'--',label="JModelica")#Solution numérique de JModelica
plt.plot(t1,x1,'-.',label="assimulo")#Solution numérique d'Assimulo
plt.legend()
plt.show()