diff options
Diffstat (limited to 'tutorials/module_3/3_1_numerical_differentiation.md')
| -rw-r--r-- | tutorials/module_3/3_1_numerical_differentiation.md | 92 |
1 files changed, 92 insertions, 0 deletions
diff --git a/tutorials/module_3/3_1_numerical_differentiation.md b/tutorials/module_3/3_1_numerical_differentiation.md new file mode 100644 index 0000000..2158c3b --- /dev/null +++ b/tutorials/module_3/3_1_numerical_differentiation.md @@ -0,0 +1,92 @@ +# Numerical Differentiation +Finding a derivative of tabular data can be done using a finite difference. Here we essentially pick two points on a function or a set of data points and calculate the slope from there. You may have done this before in spreadsheets, we're going to do this using python. Let's imagine a time range $t$ as a vector such that $\vec{t}$ = $\pmatrix{t_0, t_1, t_2, ...}$ and a displacement domain as a function of time. We can represent the range and domain as two python arrays `t` and `s` respectively. + +```python +import numpy as np + +# Initiate time domain +t = np.linspace(0, 2, 100) +s = 34 * np.exp(3 * t) +``` + +Then we can use the following methods to approximate the definitive derivatives as follows. + +## Finite Difference +### Forward Difference +Uses the point at which we want to find the derivative and a point forwards in the array. +$$ +f'(x_i) = \frac{f(x_{i+1})-f(x_i)}{x_{i+1}-x_i} +$$ +*Note: If we apply this to an array, consider what happens at the last point.* + +```python +for s in t: + ds_dt = f(x+) +``` + + + +```python +# Forward difference using python arrays +dsdt = (s[1:] - s[:-1]) / (t[1:] - t[:-1]) + +import matplotlib.pyplot as plt + +# Plot the function +plt.plot(t, s, label=r'$s(t)$') +plt.plot(t, dsdt, label=b'$/frac{ds}{dt}$') +plt.xlabel('Time (t)') +plt.ylabel('Displacement (s)') +plt.title('Plot of $34e^{3t}$') +plt.grid(True) +plt.legend() +plt.show() +``` + + +### Backwards Difference +Uses the point at which we want to find the derivative and the previous point in the array. +$$ +f'(x_i) = \frac{f(x_{i})-f(x_{i-1})}{x_i - x_{i-1}} +$$ + + +```python +dsdt = (s[1:] - s[:-1]) / (t[1:] - t[:-1]) + +# Plot the function +plt.plot(t, s, label=r'$s(t)$') +plt.plot(t, dydx, label=b'$/frac{ds}{dt}$') + +plt.xlabel('Time (t)') +plt.ylabel('Displacement (s)') +plt.title('Plot of $34e^{3t}$') +plt.grid(True) +plt.legend() +plt.show() +``` +Try plotting both forward and backwards + +### Central Difference +$$ +f'(x_i) = \frac{f(x_{i+1})-f(x_{i-1})}{x_{i+1}-x_{i-1}} +$$ +### Problem 1 +Use the forward difference formula to approximate the derivative of $f(x)$ at $x = 1$ using step sizes: $h=0.5$ and $h=0.1$ for the following function. +$$ +f(x) = \ln(x^2 + 1) +$$ +Compare your results with the analytical solution at $x=1$. Comment on how the choice of $h$ affects the accuracy. +```python + +``` +### Problem 2 +Use the central difference formula to approximate the derivative of $f(x)$ at $x = 1.2$ using step sizes: $h=0.5$ and $h=0.1$ for the following function. +$$ +f(x) = e^{-x^2} +$$ +Compare your results with the analytical solution at $x=1.2$. Comment on how the choice of $h$ affects the accuracy. +```python + +``` + |
