{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 1: NumPy Basics\n",
"\n",
"### Explore NumPy array\n",
"\n",
"- [NumPy ndarray](https://numpy.org/devdocs/reference/arrays.ndarray.html)\n",
"- [Array indexing](https://numpy.org/devdocs/reference/arrays.indexing.html)\n",
"- [Argwhere](https://numpy.org/doc/stable/reference/generated/numpy.argwhere.html)\n",
"- [arange](https://numpy.org/doc/stable/reference/generated/numpy.arange.html)\n",
"- [zeros](https://numpy.org/doc/stable/reference/generated/numpy.zeros.html)\n",
"\n",
"#### Using the above links and NumPy documentation to complete the following tasks:\n",
"\n",
"- use np.arange to make an array of time steps beginning at 0, ending at 10, with a step of 0.1\n",
"- print out the values of those time steps\n",
"- print out the shape of the time step.\n",
"- use np.argwhere to find the first time step > 0.52, and print out the value of that time step.\n",
"- use np.zeros to make fake data as a 2D ndarray. Think of it as the concentrations of 3 proteins over those timesteps. Initialize a ndaray of zeros should be 3 x time.size large.\n",
"- then loop over the rows and coumns, thus\n",
"\n",
"for i in range(fakeY.shape[0]): # loop over rows\n",
" for j in range(fakeY.shape[1]): # loop over columns\n",
" fakeY[i,j] = i + 0.001*j\n",
"\n",
"- and print out its size and contents"
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
" 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5\n",
" 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3\n",
" 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1\n",
" 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
" 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]\n",
"(100,)\n",
"(3, 100)\n",
"[[0.000e+00 1.000e-03 2.000e-03 3.000e-03 4.000e-03 5.000e-03 6.000e-03\n",
" 7.000e-03 8.000e-03 9.000e-03 1.000e-02 1.100e-02 1.200e-02 1.300e-02\n",
" 1.400e-02 1.500e-02 1.600e-02 1.700e-02 1.800e-02 1.900e-02 2.000e-02\n",
" 2.100e-02 2.200e-02 2.300e-02 2.400e-02 2.500e-02 2.600e-02 2.700e-02\n",
" 2.800e-02 2.900e-02 3.000e-02 3.100e-02 3.200e-02 3.300e-02 3.400e-02\n",
" 3.500e-02 3.600e-02 3.700e-02 3.800e-02 3.900e-02 4.000e-02 4.100e-02\n",
" 4.200e-02 4.300e-02 4.400e-02 4.500e-02 4.600e-02 4.700e-02 4.800e-02\n",
" 4.900e-02 5.000e-02 5.100e-02 5.200e-02 5.300e-02 5.400e-02 5.500e-02\n",
" 5.600e-02 5.700e-02 5.800e-02 5.900e-02 6.000e-02 6.100e-02 6.200e-02\n",
" 6.300e-02 6.400e-02 6.500e-02 6.600e-02 6.700e-02 6.800e-02 6.900e-02\n",
" 7.000e-02 7.100e-02 7.200e-02 7.300e-02 7.400e-02 7.500e-02 7.600e-02\n",
" 7.700e-02 7.800e-02 7.900e-02 8.000e-02 8.100e-02 8.200e-02 8.300e-02\n",
" 8.400e-02 8.500e-02 8.600e-02 8.700e-02 8.800e-02 8.900e-02 9.000e-02\n",
" 9.100e-02 9.200e-02 9.300e-02 9.400e-02 9.500e-02 9.600e-02 9.700e-02\n",
" 9.800e-02 9.900e-02]\n",
" [1.000e+00 1.001e+00 1.002e+00 1.003e+00 1.004e+00 1.005e+00 1.006e+00\n",
" 1.007e+00 1.008e+00 1.009e+00 1.010e+00 1.011e+00 1.012e+00 1.013e+00\n",
" 1.014e+00 1.015e+00 1.016e+00 1.017e+00 1.018e+00 1.019e+00 1.020e+00\n",
" 1.021e+00 1.022e+00 1.023e+00 1.024e+00 1.025e+00 1.026e+00 1.027e+00\n",
" 1.028e+00 1.029e+00 1.030e+00 1.031e+00 1.032e+00 1.033e+00 1.034e+00\n",
" 1.035e+00 1.036e+00 1.037e+00 1.038e+00 1.039e+00 1.040e+00 1.041e+00\n",
" 1.042e+00 1.043e+00 1.044e+00 1.045e+00 1.046e+00 1.047e+00 1.048e+00\n",
" 1.049e+00 1.050e+00 1.051e+00 1.052e+00 1.053e+00 1.054e+00 1.055e+00\n",
" 1.056e+00 1.057e+00 1.058e+00 1.059e+00 1.060e+00 1.061e+00 1.062e+00\n",
" 1.063e+00 1.064e+00 1.065e+00 1.066e+00 1.067e+00 1.068e+00 1.069e+00\n",
" 1.070e+00 1.071e+00 1.072e+00 1.073e+00 1.074e+00 1.075e+00 1.076e+00\n",
" 1.077e+00 1.078e+00 1.079e+00 1.080e+00 1.081e+00 1.082e+00 1.083e+00\n",
" 1.084e+00 1.085e+00 1.086e+00 1.087e+00 1.088e+00 1.089e+00 1.090e+00\n",
" 1.091e+00 1.092e+00 1.093e+00 1.094e+00 1.095e+00 1.096e+00 1.097e+00\n",
" 1.098e+00 1.099e+00]\n",
" [2.000e+00 2.001e+00 2.002e+00 2.003e+00 2.004e+00 2.005e+00 2.006e+00\n",
" 2.007e+00 2.008e+00 2.009e+00 2.010e+00 2.011e+00 2.012e+00 2.013e+00\n",
" 2.014e+00 2.015e+00 2.016e+00 2.017e+00 2.018e+00 2.019e+00 2.020e+00\n",
" 2.021e+00 2.022e+00 2.023e+00 2.024e+00 2.025e+00 2.026e+00 2.027e+00\n",
" 2.028e+00 2.029e+00 2.030e+00 2.031e+00 2.032e+00 2.033e+00 2.034e+00\n",
" 2.035e+00 2.036e+00 2.037e+00 2.038e+00 2.039e+00 2.040e+00 2.041e+00\n",
" 2.042e+00 2.043e+00 2.044e+00 2.045e+00 2.046e+00 2.047e+00 2.048e+00\n",
" 2.049e+00 2.050e+00 2.051e+00 2.052e+00 2.053e+00 2.054e+00 2.055e+00\n",
" 2.056e+00 2.057e+00 2.058e+00 2.059e+00 2.060e+00 2.061e+00 2.062e+00\n",
" 2.063e+00 2.064e+00 2.065e+00 2.066e+00 2.067e+00 2.068e+00 2.069e+00\n",
" 2.070e+00 2.071e+00 2.072e+00 2.073e+00 2.074e+00 2.075e+00 2.076e+00\n",
" 2.077e+00 2.078e+00 2.079e+00 2.080e+00 2.081e+00 2.082e+00 2.083e+00\n",
" 2.084e+00 2.085e+00 2.086e+00 2.087e+00 2.088e+00 2.089e+00 2.090e+00\n",
" 2.091e+00 2.092e+00 2.093e+00 2.094e+00 2.095e+00 2.096e+00 2.097e+00\n",
" 2.098e+00 2.099e+00]]\n",
"[0.6]\n"
]
}
],
"source": [
"import numpy as np\n",
"\n",
"# use np.arange to make an array of time steps beginning at 0, ending at 10, with a step of 0.1\n",
"time = np.arange( 0, 10, 0.1 )\n",
"# print out the values of those time steps\n",
"print( time )\n",
"# print out the shape of the time step.\n",
"print( time.shape )\n",
"\n",
"# use np.argwhere to find the first time step > 0.52, and print out the value of that time step.\n",
"idx = np.argwhere( time > 0.52 )\n",
"print( time[idx[0]] )\n",
"\n",
"# make fake data using a 2D ndarray.\n",
"# think of it as the concentrations of 3 proteins over those timesteps.\n",
"fakeY = np.zeros( (3,time.size) )\n",
"print( fakeY.shape )\n",
"for i in range(fakeY.shape[0]):\n",
" for j in range(fakeY.shape[1]):\n",
" fakeY[i,j] = i + 0.001*j\n",
"print( fakeY )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### More practice with ndarrays\n",
"\n",
"- Print the elements of the time array that are at indices 11, 12, 13, ..., 20\n",
"- Print the result of subtracting 1 from fakeY\n",
"- Replace all elements in the first column of fakeY with the number 2 and print the result.\n",
"- Print a tuple with just one element"
]
},
{
"cell_type": "code",
"execution_count": 38,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"a slice of time\n",
"[1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.8 1.9 2. ]\n",
"fakeY - 1\n",
"[[ 1.000e+00 -9.990e-01 -9.980e-01 -9.970e-01 -9.960e-01 -9.950e-01\n",
" -9.940e-01 -9.930e-01 -9.920e-01 -9.910e-01 -9.900e-01 -9.890e-01\n",
" -9.880e-01 -9.870e-01 -9.860e-01 -9.850e-01 -9.840e-01 -9.830e-01\n",
" -9.820e-01 -9.810e-01 -9.800e-01 -9.790e-01 -9.780e-01 -9.770e-01\n",
" -9.760e-01 -9.750e-01 -9.740e-01 -9.730e-01 -9.720e-01 -9.710e-01\n",
" -9.700e-01 -9.690e-01 -9.680e-01 -9.670e-01 -9.660e-01 -9.650e-01\n",
" -9.640e-01 -9.630e-01 -9.620e-01 -9.610e-01 -9.600e-01 -9.590e-01\n",
" -9.580e-01 -9.570e-01 -9.560e-01 -9.550e-01 -9.540e-01 -9.530e-01\n",
" -9.520e-01 -9.510e-01 -9.500e-01 -9.490e-01 -9.480e-01 -9.470e-01\n",
" -9.460e-01 -9.450e-01 -9.440e-01 -9.430e-01 -9.420e-01 -9.410e-01\n",
" -9.400e-01 -9.390e-01 -9.380e-01 -9.370e-01 -9.360e-01 -9.350e-01\n",
" -9.340e-01 -9.330e-01 -9.320e-01 -9.310e-01 -9.300e-01 -9.290e-01\n",
" -9.280e-01 -9.270e-01 -9.260e-01 -9.250e-01 -9.240e-01 -9.230e-01\n",
" -9.220e-01 -9.210e-01 -9.200e-01 -9.190e-01 -9.180e-01 -9.170e-01\n",
" -9.160e-01 -9.150e-01 -9.140e-01 -9.130e-01 -9.120e-01 -9.110e-01\n",
" -9.100e-01 -9.090e-01 -9.080e-01 -9.070e-01 -9.060e-01 -9.050e-01\n",
" -9.040e-01 -9.030e-01 -9.020e-01 -9.010e-01]\n",
" [ 1.000e+00 1.000e-03 2.000e-03 3.000e-03 4.000e-03 5.000e-03\n",
" 6.000e-03 7.000e-03 8.000e-03 9.000e-03 1.000e-02 1.100e-02\n",
" 1.200e-02 1.300e-02 1.400e-02 1.500e-02 1.600e-02 1.700e-02\n",
" 1.800e-02 1.900e-02 2.000e-02 2.100e-02 2.200e-02 2.300e-02\n",
" 2.400e-02 2.500e-02 2.600e-02 2.700e-02 2.800e-02 2.900e-02\n",
" 3.000e-02 3.100e-02 3.200e-02 3.300e-02 3.400e-02 3.500e-02\n",
" 3.600e-02 3.700e-02 3.800e-02 3.900e-02 4.000e-02 4.100e-02\n",
" 4.200e-02 4.300e-02 4.400e-02 4.500e-02 4.600e-02 4.700e-02\n",
" 4.800e-02 4.900e-02 5.000e-02 5.100e-02 5.200e-02 5.300e-02\n",
" 5.400e-02 5.500e-02 5.600e-02 5.700e-02 5.800e-02 5.900e-02\n",
" 6.000e-02 6.100e-02 6.200e-02 6.300e-02 6.400e-02 6.500e-02\n",
" 6.600e-02 6.700e-02 6.800e-02 6.900e-02 7.000e-02 7.100e-02\n",
" 7.200e-02 7.300e-02 7.400e-02 7.500e-02 7.600e-02 7.700e-02\n",
" 7.800e-02 7.900e-02 8.000e-02 8.100e-02 8.200e-02 8.300e-02\n",
" 8.400e-02 8.500e-02 8.600e-02 8.700e-02 8.800e-02 8.900e-02\n",
" 9.000e-02 9.100e-02 9.200e-02 9.300e-02 9.400e-02 9.500e-02\n",
" 9.600e-02 9.700e-02 9.800e-02 9.900e-02]\n",
" [ 1.000e+00 1.001e+00 1.002e+00 1.003e+00 1.004e+00 1.005e+00\n",
" 1.006e+00 1.007e+00 1.008e+00 1.009e+00 1.010e+00 1.011e+00\n",
" 1.012e+00 1.013e+00 1.014e+00 1.015e+00 1.016e+00 1.017e+00\n",
" 1.018e+00 1.019e+00 1.020e+00 1.021e+00 1.022e+00 1.023e+00\n",
" 1.024e+00 1.025e+00 1.026e+00 1.027e+00 1.028e+00 1.029e+00\n",
" 1.030e+00 1.031e+00 1.032e+00 1.033e+00 1.034e+00 1.035e+00\n",
" 1.036e+00 1.037e+00 1.038e+00 1.039e+00 1.040e+00 1.041e+00\n",
" 1.042e+00 1.043e+00 1.044e+00 1.045e+00 1.046e+00 1.047e+00\n",
" 1.048e+00 1.049e+00 1.050e+00 1.051e+00 1.052e+00 1.053e+00\n",
" 1.054e+00 1.055e+00 1.056e+00 1.057e+00 1.058e+00 1.059e+00\n",
" 1.060e+00 1.061e+00 1.062e+00 1.063e+00 1.064e+00 1.065e+00\n",
" 1.066e+00 1.067e+00 1.068e+00 1.069e+00 1.070e+00 1.071e+00\n",
" 1.072e+00 1.073e+00 1.074e+00 1.075e+00 1.076e+00 1.077e+00\n",
" 1.078e+00 1.079e+00 1.080e+00 1.081e+00 1.082e+00 1.083e+00\n",
" 1.084e+00 1.085e+00 1.086e+00 1.087e+00 1.088e+00 1.089e+00\n",
" 1.090e+00 1.091e+00 1.092e+00 1.093e+00 1.094e+00 1.095e+00\n",
" 1.096e+00 1.097e+00 1.098e+00 1.099e+00]]\n",
"what we just changed\n",
"[2. 2. 2.]\n",
"all of fakeY\n",
"[[2.000e+00 1.000e-03 2.000e-03 3.000e-03 4.000e-03 5.000e-03 6.000e-03\n",
" 7.000e-03 8.000e-03 9.000e-03 1.000e-02 1.100e-02 1.200e-02 1.300e-02\n",
" 1.400e-02 1.500e-02 1.600e-02 1.700e-02 1.800e-02 1.900e-02 2.000e-02\n",
" 2.100e-02 2.200e-02 2.300e-02 2.400e-02 2.500e-02 2.600e-02 2.700e-02\n",
" 2.800e-02 2.900e-02 3.000e-02 3.100e-02 3.200e-02 3.300e-02 3.400e-02\n",
" 3.500e-02 3.600e-02 3.700e-02 3.800e-02 3.900e-02 4.000e-02 4.100e-02\n",
" 4.200e-02 4.300e-02 4.400e-02 4.500e-02 4.600e-02 4.700e-02 4.800e-02\n",
" 4.900e-02 5.000e-02 5.100e-02 5.200e-02 5.300e-02 5.400e-02 5.500e-02\n",
" 5.600e-02 5.700e-02 5.800e-02 5.900e-02 6.000e-02 6.100e-02 6.200e-02\n",
" 6.300e-02 6.400e-02 6.500e-02 6.600e-02 6.700e-02 6.800e-02 6.900e-02\n",
" 7.000e-02 7.100e-02 7.200e-02 7.300e-02 7.400e-02 7.500e-02 7.600e-02\n",
" 7.700e-02 7.800e-02 7.900e-02 8.000e-02 8.100e-02 8.200e-02 8.300e-02\n",
" 8.400e-02 8.500e-02 8.600e-02 8.700e-02 8.800e-02 8.900e-02 9.000e-02\n",
" 9.100e-02 9.200e-02 9.300e-02 9.400e-02 9.500e-02 9.600e-02 9.700e-02\n",
" 9.800e-02 9.900e-02]\n",
" [2.000e+00 1.001e+00 1.002e+00 1.003e+00 1.004e+00 1.005e+00 1.006e+00\n",
" 1.007e+00 1.008e+00 1.009e+00 1.010e+00 1.011e+00 1.012e+00 1.013e+00\n",
" 1.014e+00 1.015e+00 1.016e+00 1.017e+00 1.018e+00 1.019e+00 1.020e+00\n",
" 1.021e+00 1.022e+00 1.023e+00 1.024e+00 1.025e+00 1.026e+00 1.027e+00\n",
" 1.028e+00 1.029e+00 1.030e+00 1.031e+00 1.032e+00 1.033e+00 1.034e+00\n",
" 1.035e+00 1.036e+00 1.037e+00 1.038e+00 1.039e+00 1.040e+00 1.041e+00\n",
" 1.042e+00 1.043e+00 1.044e+00 1.045e+00 1.046e+00 1.047e+00 1.048e+00\n",
" 1.049e+00 1.050e+00 1.051e+00 1.052e+00 1.053e+00 1.054e+00 1.055e+00\n",
" 1.056e+00 1.057e+00 1.058e+00 1.059e+00 1.060e+00 1.061e+00 1.062e+00\n",
" 1.063e+00 1.064e+00 1.065e+00 1.066e+00 1.067e+00 1.068e+00 1.069e+00\n",
" 1.070e+00 1.071e+00 1.072e+00 1.073e+00 1.074e+00 1.075e+00 1.076e+00\n",
" 1.077e+00 1.078e+00 1.079e+00 1.080e+00 1.081e+00 1.082e+00 1.083e+00\n",
" 1.084e+00 1.085e+00 1.086e+00 1.087e+00 1.088e+00 1.089e+00 1.090e+00\n",
" 1.091e+00 1.092e+00 1.093e+00 1.094e+00 1.095e+00 1.096e+00 1.097e+00\n",
" 1.098e+00 1.099e+00]\n",
" [2.000e+00 2.001e+00 2.002e+00 2.003e+00 2.004e+00 2.005e+00 2.006e+00\n",
" 2.007e+00 2.008e+00 2.009e+00 2.010e+00 2.011e+00 2.012e+00 2.013e+00\n",
" 2.014e+00 2.015e+00 2.016e+00 2.017e+00 2.018e+00 2.019e+00 2.020e+00\n",
" 2.021e+00 2.022e+00 2.023e+00 2.024e+00 2.025e+00 2.026e+00 2.027e+00\n",
" 2.028e+00 2.029e+00 2.030e+00 2.031e+00 2.032e+00 2.033e+00 2.034e+00\n",
" 2.035e+00 2.036e+00 2.037e+00 2.038e+00 2.039e+00 2.040e+00 2.041e+00\n",
" 2.042e+00 2.043e+00 2.044e+00 2.045e+00 2.046e+00 2.047e+00 2.048e+00\n",
" 2.049e+00 2.050e+00 2.051e+00 2.052e+00 2.053e+00 2.054e+00 2.055e+00\n",
" 2.056e+00 2.057e+00 2.058e+00 2.059e+00 2.060e+00 2.061e+00 2.062e+00\n",
" 2.063e+00 2.064e+00 2.065e+00 2.066e+00 2.067e+00 2.068e+00 2.069e+00\n",
" 2.070e+00 2.071e+00 2.072e+00 2.073e+00 2.074e+00 2.075e+00 2.076e+00\n",
" 2.077e+00 2.078e+00 2.079e+00 2.080e+00 2.081e+00 2.082e+00 2.083e+00\n",
" 2.084e+00 2.085e+00 2.086e+00 2.087e+00 2.088e+00 2.089e+00 2.090e+00\n",
" 2.091e+00 2.092e+00 2.093e+00 2.094e+00 2.095e+00 2.096e+00 2.097e+00\n",
" 2.098e+00 2.099e+00]]\n",
"(3,)\n"
]
}
],
"source": [
"print( \"a slice of time\")\n",
"print( time[11:21])\n",
"print( \"fakeY - 1\")\n",
"print( fakeY-1)\n",
"fakeY[:,0] = 2\n",
"print(\"what we just changed\")\n",
"print(fakeY[:,0])\n",
"print(\"all of fakeY\")\n",
"print( fakeY )\n",
"print( (3,))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 2: Scipy Basics\n",
"\n",
"In CS341, we will use scipy.linalg to find the distance between two vectors, scipy.signal to find the peaks in a time-series, and scipy.integrate to solve ordinary differential equations (i.e. simulate a model).\n",
"\n",
"If you have a recent enough version of scipy, then it will have [scipy.integrate.solve_ivp](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.solve_ivp.html), which is short for \"solve initial value problem\". It takes as input the model, the initial value (the concentration of all the proteins at time = 0), the time steps over which you want to simulate the model, and parameter values. It returns the concentration of proteins at those time steps.\n",
"\n",
"If you have an older version of scipy, then you will need to use [scipy.integrate.odeint](https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.odeint.html#scipy.integrate.odeint), which takes the model in a different form (the order of arguments is different).\n",
"\n",
"We are going to begin with the simplest model typically used. In this model, we have one protein $P$, whose concentration we will model over time. The process we will model is called degradation - the process by which the protein is destroyed. At any given moment in time, a given proportion of that protein will be destroyed. If we start with a lot of protein, then early in the simulation we will be losing lots of it (it will be degrading quickly). Once we have just a little protein, we lose less at any given moment, so the process is slower. We capture that with the ordinary differential equation\n",
"\n",
"$\\frac{dP(t)}{dt} = -k P(t)$\n",
"\n",
"where k is the constant that determines the proportion of protein $P$ that is degraded. I read this as \"the rate of change of P depends is proportional to the amount of P\" and, if we assume that k>=0 (which is usually the case in these models), then we see that the rate of change of P is negative, and will be more negative (bigger) when P is bigger\".\n",
"\n",
"Below, use scipy.integrate.solve_vip to simulate the degradation model when $k=2$. $P(0)$ should be 3, and use timesteps 0 to 10 with a step of 0.1."
]
},
{
"cell_type": "code",
"execution_count": 39,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
" 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5\n",
" 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3\n",
" 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1\n",
" 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
" 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]\n",
"(100,)\n",
"(1, 100)\n"
]
}
],
"source": [
"import scipy.integrate\n",
"def degradation_model(t,y):\n",
" return -2*y\n",
"\n",
"sol = scipy.integrate.solve_ivp(fun=degradation_model, t_span=(0,10), y0=(3,), \n",
" t_eval=np.arange(0,10,0.1) )\n",
"\n",
"print( sol.t )\n",
"print( sol.t.shape )\n",
"print( sol.y.shape )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"For the purposes of parameter-fitting, we want to avoid hard-coding the coefficients. I will refer to these as the model parameters or just \"parameters\". We should re-write the model to use parameters. And then supply them to solve_ivp in the \"args\" argument."
]
},
{
"cell_type": "code",
"execution_count": 40,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
" 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5\n",
" 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3\n",
" 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1\n",
" 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
" 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]\n",
"(100,)\n",
"(1, 100)\n"
]
}
],
"source": [
"def degradation_model2(t,y,params):\n",
" return -params[0]*y\n",
"\n",
"d1 = 2\n",
"params = (d1,)\n",
"sol = scipy.integrate.solve_ivp(fun=degradation_model2, t_span=(0,10), y0=(3,), \n",
" t_eval=np.arange(0,10,0.1), args=(params,) )\n",
"\n",
"print( sol.t )\n",
"print( sol.t.shape )\n",
"print( sol.y.shape )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Part 3: MatPlotLib Basics\n",
"\n",
"- [MatPlotLib](https://matplotlib.org/)\n",
"- [matplotlib.pyplot introduction](https://matplotlib.org/tutorials/introductory/pyplot.html)\n",
"\n",
"#### Using the above links and MatPlotLib documentation to complete the following tasks:\n",
"\n",
"Visualize the ODE output with Matplotlib. All plots should include a title, axis labels and a legend when applicable.\n"
]
},
{
"cell_type": "code",
"execution_count": 41,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot( sol.t, sol.y.T )\n",
"plt.title( \"simulation\" )\n",
"plt.xlabel( 'Time')\n",
"plt.ylabel( \"Concentration\")\n",
"plt.legend( [\"P\"] );"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## For older versions of Scipy\n",
"\n",
"If you don't have solve_ivp, then we need to make a couple of adjustments. First swap the order of t and y in the model function. Then, update the call to odeint. the function is called \"func\" instead of \"fun\". It takes the entire t array in just one parameter. Also, it returns just the y values."
]
},
{
"cell_type": "code",
"execution_count": 30,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[0. 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1. 1.1 1.2 1.3 1.4 1.5 1.6 1.7\n",
" 1.8 1.9 2. 2.1 2.2 2.3 2.4 2.5 2.6 2.7 2.8 2.9 3. 3.1 3.2 3.3 3.4 3.5\n",
" 3.6 3.7 3.8 3.9 4. 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 5. 5.1 5.2 5.3\n",
" 5.4 5.5 5.6 5.7 5.8 5.9 6. 6.1 6.2 6.3 6.4 6.5 6.6 6.7 6.8 6.9 7. 7.1\n",
" 7.2 7.3 7.4 7.5 7.6 7.7 7.8 7.9 8. 8.1 8.2 8.3 8.4 8.5 8.6 8.7 8.8 8.9\n",
" 9. 9.1 9.2 9.3 9.4 9.5 9.6 9.7 9.8 9.9]\n",
"[[3.00000000e+00]\n",
" [2.45619230e+00]\n",
" [2.01096019e+00]\n",
" [1.64643494e+00]\n",
" [1.34798693e+00]\n",
" [1.10363835e+00]\n",
" [9.03582656e-01]\n",
" [7.39790909e-01]\n",
" [6.05689566e-01]\n",
" [4.95896668e-01]\n",
" [4.06005846e-01]\n",
" [3.32409465e-01]\n",
" [2.72153848e-01]\n",
" [2.22820720e-01]\n",
" [1.82430171e-01]\n",
" [1.49361199e-01]\n",
" [1.22286610e-01]\n",
" [1.00119809e-01]\n",
" [8.19711664e-02]\n",
" [6.71123153e-02]\n",
" [5.49469173e-02]\n",
" [4.49867325e-02]\n",
" [3.68320222e-02]\n",
" [3.01555100e-02]\n",
" [2.46892439e-02]\n",
" [2.02138437e-02]\n",
" [1.65496959e-02]\n",
" [1.35497452e-02]\n",
" [1.10935934e-02]\n",
" [9.08266630e-03]\n",
" [7.43625837e-03]\n",
" [6.08829358e-03]\n",
" [4.98467329e-03]\n",
" [4.08110541e-03]\n",
" [3.34132659e-03]\n",
" [2.73564689e-03]\n",
" [2.23975846e-03]\n",
" [1.83375945e-03]\n",
" [1.50135506e-03]\n",
" [1.22920475e-03]\n",
" [1.00638725e-03]\n",
" [8.23959953e-04]\n",
" [6.74601188e-04]\n",
" [5.52316636e-04]\n",
" [4.52198483e-04]\n",
" [3.70228466e-04]\n",
" [3.03117309e-04]\n",
" [2.48171427e-04]\n",
" [2.03185527e-04]\n",
" [1.66354191e-04]\n",
" [1.36199268e-04]\n",
" [1.11510457e-04]\n",
" [9.12970151e-05]\n",
" [7.47474996e-05]\n",
" [6.11976931e-05]\n",
" [5.01050138e-05]\n",
" [4.10230439e-05]\n",
" [3.35875688e-05]\n",
" [2.74990759e-05]\n",
" [2.25142193e-05]\n",
" [1.84332109e-05]\n",
" [1.50917422e-05]\n",
" [1.23561236e-05]\n",
" [1.01164563e-05]\n",
" [8.28243625e-06]\n",
" [6.77991484e-06]\n",
" [5.55053745e-06]\n",
" [4.54398628e-06]\n",
" [3.72062947e-06]\n",
" [3.04627495e-06]\n",
" [2.49421577e-06]\n",
" [2.04205521e-06]\n",
" [1.67166205e-06]\n",
" [1.36829387e-06]\n",
" [1.12070187e-06]\n",
" [9.17855923e-07]\n",
" [7.52010792e-07]\n",
" [6.15976364e-07]\n",
" [5.04542357e-07]\n",
" [4.13133518e-07]\n",
" [3.37701730e-07]\n",
" [2.77059700e-07]\n",
" [2.26970368e-07]\n",
" [1.86022500e-07]\n",
" [1.52574117e-07]\n",
" [1.25124906e-07]\n",
" [1.02629399e-07]\n",
" [8.42068970e-08]\n",
" [6.88412882e-08]\n",
" [5.61962496e-08]\n",
" [4.58513653e-08]\n",
" [3.67840084e-08]\n",
" [3.03311852e-08]\n",
" [2.48059637e-08]\n",
" [2.01636889e-08]\n",
" [1.63292818e-08]\n",
" [1.33015468e-08]\n",
" [1.08974358e-08]\n",
" [8.92223254e-09]\n",
" [7.37452620e-09]]\n",
"(100, 1)\n"
]
}
],
"source": [
"def degradation_model2_old(y,t,params):\n",
" return -params[0]*y\n",
"\n",
"d1 = 2\n",
"params = (d1,)\n",
"t = np.arange(0,10,0.1)\n",
"y = scipy.integrate.odeint(func=degradation_model2_old, t=t, y0=(3,),args=(params,) )\n",
"\n",
"print( t )\n",
"print( y )\n",
"print( y.shape )"
]
},
{
"cell_type": "code",
"execution_count": 31,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"import matplotlib.pyplot as plt\n",
"\n",
"plt.plot( t, y ) # notice that we don't need to transpose it.\n",
"plt.title( \"simulation\" )\n",
"plt.xlabel( 'Time')\n",
"plt.ylabel( \"Concentration\")\n",
"plt.legend( [\"P\"] );"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.8.5"
}
},
"nbformat": 4,
"nbformat_minor": 4
}