[PYTHON] Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica

Zweck / Ziel

Informationen zur Umgebungskonstruktionsmethode finden Sie im Artikel JModelica unter Ubuntu installieren.

Grundlegende Verwendung von JModelica

  1. Bereiten Sie eine Modelldatei vor (* .mo)
  2. Kompilieren Sie zu Function Mockup Units (FMUs)
  3. Laden Sie FMUs
  4. Berechnen Sie die geladenen FMUs
  5. Ergebnisse anzeigen

Natürlich ist es auch möglich, die kompilierten FMUs aus Schritt 3 zu lesen.


Lösen Sie gewöhnliche Differentialgleichungen

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}

Lösen normaler Differentialgleichungen mit JModelica

1. Vorbereitung der Modelldatei

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


2. Kompilieren Sie das Modell in FMUs

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

3. Laden Sie FMUs

ipython


from pyfmi import load_fmu
hello_model = load_fmu(hello_fmu)

4. Berechnen Sie die geladenen FMUs

Berechnen Sie für 1 Sekunde

ipython


res = hello_model.simulate(final_time=1)

5. Ergebnisse anzeigen

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

first_liner_ode.png


Lösen Sie normale Differentialgleichungen mit Assimulo

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

first_liner_ode_assimulo.png


Zusammenfassung

Recommended Posts

Lösung des Anfangswertproblems gewöhnlicher Differentialgleichungen mit JModelica
[Wissenschaftlich-technische Berechnung mit Python] Numerische Lösung gewöhnlicher Differentialgleichungen erster Ordnung, Anfangswertproblem, numerische Berechnung
[Wissenschaftlich-technische Berechnung mit Python] Numerische Lösung der gewöhnlichen Differentialgleichung zweiter Ordnung, Anfangswertproblem, numerische Berechnung
Lösen Sie simultane normale Differentialgleichungen mit Python und SymPy.
Lösen Sie normale Differentialgleichungen in Python
Numerische Analyse gewöhnlicher Differentialgleichungen mit Scipys Odeint und Ode
Versuchen Sie, das N Queen-Problem mit SA von PyQUBO zu lösen
Finden Sie die numerische Lösung der gewöhnlichen Differentialgleichung zweiter Ordnung mit scipy
Die Geschichte der numerischen Berechnung von Differentialgleichungen mit TensorFlow 2.0
Lösen Sie das Problem des Handlungsreisenden mit OR-Tools
Versuchen Sie, das Fizzbuzz-Problem mit Keras zu lösen
[AtCoder] Lösen Sie ein Problem von ABC101 ~ 169 mit Python
Lösen normaler Differentialgleichungen mit Python ~ Universal Gravitation
[Bei Coder] Lösen Sie das Problem der Dichotomie
Anfangswertproblem der NMF (nicht negative Matrixfaktorzerlegung)
Nehmen Sie den Wert des SwitchBot-Thermo-Hygrometers mit Raspberry Pi
Umschalten der Bot-Thermo-Hygrometer-Werte mit Raspberry Pi
Ich habe versucht, das Problem mit Python Vol.1 zu lösen
Beim 15. Offline-Echtzeitversuch habe ich versucht, das Problem des Schreibens mit Python zu lösen
Ihre URL hat nicht mit dem Wert des Challenge-Parameters geantwortet.
Der wahre Wert der Terraform-Automatisierung ab Oracle Cloud
Lösen Sie das Monty Hall-Problem
Lösen Sie das Problem der fehlenden libcudart in Ubuntu 16.04 + CUDA 8.0 + Tensorflow-Umgebung
Finden Sie den optimalen Wert der Funktion mit einem genetischen Algorithmus (Teil 2)
Ich wollte das ABC164 A ~ D-Problem mit Python lösen
Lösen Sie das Python-Rucksackproblem mit der Branch-and-Bound-Methode
Tipps: [Python] Berechnen Sie den Durchschnittswert des angegebenen Bereichs mit Bedgraph
Lösen Sie Teilsummenprobleme mit der vollständigen Suche in Python
Protokollieren Sie die Omron-Umgebungssensorwerte regelmäßig mit Raspberry Pi
Ich möchte das Problem des Speicherverlusts bei der Ausgabe einer großen Anzahl von Bildern mit Matplotlib lösen
Finden Sie die Definition des Wertes von errno
Extrahieren Sie den Maximalwert mit Pandas.
Über den Rückgabewert von pthread_mutex_init ()
Lösen Sie die Verzögerung der Interferometerbeobachtung
Über den Rückgabewert des Histogramms.
Illustration der Ergebnisse des Rucksackproblems
Verwenden Sie Rasppie, um das Problem einer unzureichenden mobilen Wi-Fi-Verbindung zu lösen
Das 16. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Versuchen Sie, das Problem des Handlungsreisenden mit einem genetischen Algorithmus zu lösen (Theorie)
Das 19. Offline-Echtzeit-Schreiben eines Referenzproblems zur Lösung mit Python
Protokollierung der Omron-Umgebungssensorwerte mit Raspberry Pi (USB-Typ)
Versuchen Sie, ein festgelegtes Problem der High-School-Mathematik mit Python zu lösen
Ruft den Rückgabewert eines externen Shell-Skripts (ls) mit python3 ab