In [1]:
%load_ext autoreload
%autoreload 2
%matplotlib inline
import sys
import casadi as ca
import os
import matplotlib.pyplot as plt
sys.path.insert(0, '../../src')
from pymoca.backends.xml import model, sim_scipy, analysis
from pymoca.backends.xml import parser as parse_xml
from pymoca.backends.xml.generator import generate as generate_xml
from pymoca.parser import parse as parse_mo
This example:
In [2]:
m1_xml = os.path.join(
'..', 'models', 'bouncing-ball.xml')
m1_ca = parse_xml.parse_file(m1_xml)
m1_ca
Out[2]:
In [3]:
m1_ode = m1_ca.to_ode()
m1_ode
Out[3]:
In [4]:
m1_ode.prop['x']['start'] = 1
data1 = sim_scipy.sim(m1_ode, {'dt': 0.01, 'tf': 3.5, 'integrator': 'dopri5'})
plt.figure(figsize=(15, 10))
analysis.plot(data1, marker='.', linewidth=1, markersize=5)
This example:
In [5]:
simple_circuit_file = os.path.join(
'..', 'models', 'SimpleCircuit.mo')
m2_mo = parse_mo(open(simple_circuit_file, 'r').read())
m2_xml = generate_xml(m2_mo, 'SimpleCircuit')
m2_ca = parse_xml.parse(m2_xml)
m2_ca
Out[5]:
In [6]:
m2_ode = m2_ca.to_ode()
m2_ode
Out[6]:
In [7]:
m2_ode.prop.keys()
Out[7]:
In [8]:
m2_ode.prop['AC.f']['value'] = 60
m2_ode.prop['AC.VA']['value'] = 110
In [9]:
data2 = sim_scipy.sim(m2_ode, {'dt': 0.001, 'tf': 0.5, 'integrator': 'dopri5'})
plt.figure(figsize=(15, 10))
analysis.plot(data2, fields=['x'])
This example demonstrates using the string based parser and also noise simulation.
In [61]:
model_txt = """
model Simple
Real x(start=0);
discrete Real y;
discrete Real v;
discrete Real time_last(start=0);
equation
der(x) = v;
when (abs(x) >= 2) then
reinit(x, 0);
end when;
when (time - time_last > 0.1) then
v = 1 + noise_gaussian(0, 0.1);
y = x + noise_gaussian(0, 0.1);
time_last = time;
end when;
end Simple;
"""
m3_mo = parse_mo(model_txt)
m3_xml = generate_xml(m3_mo, 'Simple')
print(m3_xml)
In [62]:
m3_ca = parse_xml.parse(m3_xml)
m3_ca
Out[62]:
In [63]:
m3_ode = m3_ca.to_ode()
m3_ode
Out[63]:
In [64]:
m3_ode.prop['x']['start'] = 0
data = sim_scipy.sim(m3_ode, {'dt': 0.01, 'tf': 3})
plt.figure(figsize=(15, 10))
analysis.plot(data, fields=['m', 'x', 'y'])