The Rest Frame

FiniteDiffrence

Shyam Sunder

Shyam Sunder

import numpy as np
import matplotlib.pyplot as plt
import math
from scipy.sparse import diags

Let \(y = y(x)\) be a function of x. Then we know from taylor's series: \begin{equation} y(x+h) = y(x) + hy'(x) + h^2y''(x) + \cdots \ y(x-h) = y(x) - hy'(x) + h^2y''(x) - \cdots \end{equation}

Substracting these two we get:

\[$$y'(x) = \frac{y(x+h)-y(x-h)}{2h} + \mathcal{O}(h^3)$$ >This is called **Central Difference Formula for diffrentiation.** By adding these two, we get $$y"(x) = \frac{y(x+h)+y(x-h)-2y(x)}{h^2} + \mathcal{O}(h^4)$$
In context of any diffrential equation, We are given boundries $x_0$ to $X_n$.
So we can simply devide it into N equal parts deffering by h. Let $x_i = x_0 + ih$ represent a point in this intevel. So $y_i = y(x_i)$. We can write the equation

$$y"(x) = \frac{y_{i+1} + y_{i-1} - 2y_{i}}{h^2}$$\ and also $$y'(x) = \frac{y_{i+1}-y_i}{h}$$ We want to solve the boundry value problem $$\frac{d^2 y}{dx^2} -\frac{dy}{dx} - 2y = cos(x)$$ $$y(0) = -0.3 \quad y(\pi/2)= -0.1$$ $$0 \leq x \leq \frac{\pi}{2} $$ We can break the interval $[0, \frac{\pi}{2}]$ into $n$ parts and label them with is where $x_i = 0 + ih$ and $h$ is the diffrence bewteen two terms. We can write the \autoref{pro} as $$y" - y' - 2y = \cos(x)$$ When we apply the finite diffrence method we get \begin{equation*} \frac{y_{i+1} + y_{i-1} - 2y_{i}}{h^2} - \frac{y_{i+1}-y_i}{h} - 2y_i = \cos(x_i) \end{equation*} Now we will put some values of i $$y_0 = -0.3 \quad \quad i =0 $$ $$ \frac{1}{h^2}\left( 1.y_{0} + (-2h^2+h-2)y_1 + (1-h)y_{2}\right) = \cos(x_1) \quad i = 1$$ $$ \frac{1}{h^2}\left( 1.y_{1} + (-2h^2+h-2)y_2 + (1-h)y_{3}\right) = \cos(x_2) \quad i = 2$$ \vdots $$ \frac{1}{h^2}\left( 1.y_{i-1} + (-2h^2+h-2)y_{i} + (1-h)y_{i+1}\right) = \cos(x_i) \quad i = i$$ \vdots $$ \frac{1}{h^2}\left( 1.y_{n-2} + (-2h^2+h-2)y_{n-1} + (1-h)y_{n}\right) = \cos(x_{n-1}) \quad i = n-1$$ $$y_n = -0.1$$ We can Represent this in the Matrix forms as \begin{equation} \frac{1}{h^2} \begin{bmatrix} h^2 & 0 & 0 & \cdots & 0 & 0 \\ 1 & -2+h-2h^2 & 1-h &\cdots & 0 & 0 \\ 0 & 1 & -2+h-2h^2 &\cdots & 0 & 0 \\ \vdots & \vdots & & & & \vdots \\ 0 & 0 & 0 & \cdots & -2+h-2h^2 & 1-h \\ 0 & 0 & 0 & \cdots & 0 & h^2 \end{bmatrix} \begin{bmatrix} y_0 \\ y_1 \\ y_2 \\ \vdots \\ y_{n-1} \\ y_n \end{bmatrix} = \begin{bmatrix} -0.3 \\ cos(x_1) \\ cos(x_2) \\ \vdots \\ cos(x_{n-1}) \\ -0.1 \end{bmatrix} \end{equation} \begin{equation} MY = b \end{equation} ```python pi = math.pi xs = np.linspace(0, math.pi/2,100) h = np.diff(xs)[0] #size of each step N = xs.size #number of steps ``` To desging the M matrix we would take a different approach. I will design the diagoals of the matrix sperately and then I will put them into a empty matrix using diag. ```python #desging the diagonals of the matrix d1 = np.ones(N-1) d0 = (-2+h-2*h**2)*np.ones(N) d3 = (1-h)*np.ones(N-1) # d1 = np.ones(N-1) # d0 = -2*np.ones(N) # d3 = d1 #Putting the dignoals into a empty matrix M = diags([d1,d0,d3],[-1,0,1]).toarray() #multiplying by 1/h^2 fector M = (1/h**2)*M #putting in the boundry Coditions M[0][0]=1 M[0][1]=0 M[-1][-1]=1 M[-1][-2] = 0 ``` ```python #desing the left matrix b = np.zeros(N) for i in range(len(b)): b[i] = math.cos(xs[i]) b[0]=-0.3 b[-1]=-0.1 ``` We will use the gaussian elimination method to solve the equation ```python def gaussianElimination(A, B): n = len(A) A = np.c_[A, B] #getting echilion matrix: for i in range(n): for j in range(i+1,n): fector = A[j][i]/A[i][i] for k in range(i, n+1): A[j][k] -= A[i][k]*fector c = [0 for _ in B] #backSubstitution string = '' for i in range(n-1,-1,-1): sum = 0 for j in range(i,n): sum += A[i][j]*c[j] c[i] = (A[i][-1] -sum)/A[i][i] return c ``` ```python ys = gaussianElimination(M,b) ``` ```python plt.plot(xs, ys, label='From fintie Difference Method') plt.plot((0,pi/2),(-.3,-.1), '*') plt.legend() plt.show() ``` ![png](/assets/FiniteDiffrence-1.png) The Theoritical solution for this problem is: $$y(x) = \frac{1}{10}(-sin(x)-3(cos(x))$$ ```python def theory(x): return (1/10)*(-math.sin(x)-3*math.cos(x)) ``` ```python y_th = [theory(x) for x in xs] ``` ```python plt.plot(xs, ys, label='From fintie Difference Method') plt.plot(xs, y_th, label='From Theory') plt.plot((0,pi/2),(-.3,-.1), '*') plt.legend() plt.show() ``` ![png](/assets/FiniteDiffrence-2.png) So as we can see that our solution exactly matches with the theorictical value\]