[1]:
import numpy
import matplotlib.pyplot as plt
%matplotlib inline
11. Read simulation input from a file¶
It is often useful to read simulation inputs from a file. Let’s do this for our standard tank system.
\begin{align}
F_{out} &= kh\\
\frac{\mathrm{d}h}{\mathrm{d}t} &= \frac{1}{A}\left(F_{in} - F_{out}\right)\\
\end{align}
First we define the parameters of the system
[2]:
K = 1
A = 1
Then, we’ll read the values of \(F_{in}\) from an Excel file using pandas.read_excel
.
[3]:
import pandas
[4]:
df = pandas.read_excel('../../assets/tankdata.xlsx')
df
[4]:
Time | Fin | |
---|---|---|
0 | 0 | 1.0 |
1 | 5 | 2.0 |
2 | 10 | 2.0 |
3 | 15 | 1.5 |
4 | 20 | 1.0 |
5 | 25 | 2.0 |
6 | 30 | 2.0 |
We’ll set this function up to interpolate on the above table for the value of \(F_in\) given a known time.
[5]:
def Fin(t):
return numpy.interp(t, df.Time, df.Fin)
We can test for one value at a time
[6]:
Fin(1)
[6]:
1.2
interp
also accepts vector inputs:
[7]:
tspan = (0, 30)
t = numpy.linspace(*tspan)
[8]:
plt.plot(t, Fin(t))
[8]:
[<matplotlib.lines.Line2D at 0x112b4c208>]

Now we’re ready to define our differential equation function:
[9]:
def dhdt(t, h):
Fout = K*h
return 1/A*(Fin(t) - Fout)
[10]:
h0 = 1
[11]:
import scipy.integrate
[12]:
sol = scipy.integrate.solve_ivp(dhdt, tspan, [h0], t_eval=t)
[13]:
plt.plot(sol.t, sol.y.T)
[13]:
[<matplotlib.lines.Line2D at 0x1513ee6b38>]

[ ]: