[PYTHON] Résolution du problème de la valeur initiale des équations différentielles ordinaires avec JModelica

But / but

Pour la méthode de construction de l'environnement, reportez-vous à l'article Installation de JModelica sur Ubuntu.

Utilisation basique de JModelica

  1. Préparez un fichier modèle (* .mo)
  2. Compiler en unités de maquette de fonction (FMU)
  3. Charger les FMU
  4. Calculez les FMU chargées
  5. Afficher les résultats

Bien entendu, il est également possible de lire les FMU compilées à partir de l'étape 3.


Résoudre des équations différentielles ordinaires

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}

Résolution d'équations différentielles normales avec JModelica

1. Préparation du fichier modèle

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


2. Compilez le modèle en FMU

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")

3. Charger les FMU

ipython


from pyfmi import load_fmu
hello_model = load_fmu(hello_fmu)

4. Calculez les FMU chargées

Calculer pendant 1 seconde

ipython


res = hello_model.simulate(final_time=1)

5. Afficher les résultats

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()

first_liner_ode.png


Résoudre des équations différentielles normales avec Assimulo

Qu'est-ce qu'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()

first_liner_ode_assimulo.png


Résumé

Recommended Posts

Résolution du problème de la valeur initiale des équations différentielles ordinaires avec JModelica
[Calcul scientifique / technique par Python] Solution numérique d'équations différentielles ordinaires du premier ordre, problème de valeur initiale, calcul numérique
[Calcul scientifique / technique par Python] Solution numérique d'une équation différentielle ordinaire du second ordre, problème de valeur initiale, calcul numérique
Résolvez des équations différentielles normales simultanées avec Python et SymPy.
Résoudre des équations différentielles normales en Python
Analyse numérique des équations différentielles ordinaires avec l'odeint et l'ode de Scipy
Essayez de résoudre le problème N Queen avec SA de PyQUBO
Trouvez la solution numérique de l'équation différentielle ordinaire du second ordre avec scipy
L'histoire du calcul numérique des équations différentielles avec TensorFlow 2.0
Résolvez le problème du voyageur de commerce avec OR-Tools
Essayez de résoudre le problème du fizzbuzz avec Keras
[AtCoder] Résoudre un problème de ABC101 ~ 169 avec Python
Résolution d'équations différentielles normales avec Python ~ Gravitation universelle
[Chez Coder] Résoudre le problème de la dichotomie
Problème de valeur initiale de NMF (Décomposition en facteurs matriciels non négatifs)
Prenez la valeur du thermo-hygromètre SwitchBot avec Raspberry Pi
Changer les valeurs du thermo-hygromètre Bot avec Raspberry Pi
J'ai essayé de résoudre le problème avec Python Vol.1
Le 15e temps réel hors ligne, j'ai essayé de résoudre le problème de l'écriture avec python
Votre URL n'a pas répondu avec la valeur du paramètre de défi.
La vraie valeur de l'automatisation Terraform à partir d'Oracle Cloud
Résolvez le problème de Monty Hall
Résoudre le problème de la libcudart manquante dans Ubuntu 16.04 + CUDA 8.0 + environnement Tensorflow
Trouvez la valeur optimale de la fonction à l'aide d'un algorithme génétique (partie 2)
Je voulais résoudre le problème ABC164 A ~ D avec Python
Résolvez le problème du sac à dos Python avec la méthode de branche et liée
Astuces: [Python] Calculez la valeur moyenne de la zone spécifiée avec bedgraph
Résolvez les problèmes de somme partielle avec une recherche complète en Python
Consigner périodiquement les valeurs des capteurs d'environnement Omron avec Raspberry Pi
Je souhaite résoudre le problème de fuite de mémoire lors de la sortie d'un grand nombre d'images avec Matplotlib
Trouvez la définition de la valeur de errno
Extraire la valeur maximale avec les pandas.
À propos de la valeur de retour de pthread_mutex_init ()
Résoudre le retard d'observation de l'interféromètre
À propos de la valeur de retour de l'histogramme.
Illustration des résultats du problème du sac à dos
Utilisez Rasppie pour résoudre le problème de connexion Wi-Fi mobile insuffisante
Le 16ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Essayez de résoudre le problème du voyageur de commerce avec un algorithme génétique (théorie)
Le 19ème comment écrire un problème de référence en temps réel hors ligne à résoudre avec Python
Enregistrement des valeurs du capteur d'environnement Omron avec Raspberry Pi (type USB)
Essayez de résoudre un problème défini de mathématiques au lycée avec Python
Obtenez la valeur de retour d'un script shell externe (ls) avec python3