Finite Difference Method#
John S Butler john.s.butler@tudublin.ie Course Notes Github#
Overview#
This notebook illustrates the finite different method for a linear Boundary Value Problem.
Example 2 Boundary Value Problem#
To further illustrate the method we will apply the finite difference method to the this boundary value problem
with the boundary conditions
import numpy as np
import math
import matplotlib.pyplot as plt
Discrete Axis#
The stepsize is defined as
here it is
giving
for \(i=0,1,...10.\)
## BVP
N=10
h=1/N
x=np.linspace(0,1,N+1)
fig = plt.figure(figsize=(10,4))
plt.plot(x,0*x,'o:',color='red')
plt.xlim((0,1))
plt.xlabel('x',fontsize=16)
plt.title('Illustration of discrete time points for h=%s'%(h),fontsize=32)
plt.show()
The Difference Equation#
To convert the boundary problem into a difference equation we use 1st and 2nd order difference operators.
The first derivative can be approximated by the difference operators:
or
The second derivative can be approxiamed
Given the differential equation
the difference equation is,
Rearranging the equation we have the system of N-1 equations
where the green terms are the known boundary conditions.
Rearranging the equation we have the system of 9 equations
where the green terms are the known boundary conditions. This is system can be put into matrix form
Where A is a \(9\times 9 \) matrix of the form
which can be represented graphically as:
A=np.zeros((N-1,N-1))
# Diagonal
for i in range (0,N-1):
A[i,i]=-(2/(h*h)-1) # Diagonal
for i in range (0,N-2):
A[i+1,i]=1/(h*h)-2*(i+1)*h/(2*h) ## Lower Diagonal
A[i,i+1]=1/(h*h)+2*(i+1)*h/(2*h) ## Upper Diagonal
plt.imshow(A)
plt.xlabel('i',fontsize=16)
plt.ylabel('j',fontsize=16)
plt.yticks(np.arange(N-1), np.arange(1,N-0.9,1))
plt.xticks(np.arange(N-1), np.arange(1,N-0.9,1))
clb=plt.colorbar()
clb.set_label('Matrix value')
plt.title('Matrix A',fontsize=32)
plt.tight_layout()
plt.subplots_adjust()
plt.show()
\(\mathbf{y}\) is the unknown vector which is contains the numerical approximations of the \(y\).
y=np.zeros((N+1))
# Boundary Condition
y[0]=1
y[N]=2
and the known right hand side is a known \(9\times 1\) vector with the boundary conditions
b=np.zeros(N-1)
for i in range (0,N-1):
b[i]=3*h*(i+1)*h*(i+1)
# Boundary Condition
b[0]=-y[0]*(1/(h*h)-2*1*h/(2*h))+b[0]
b[N-2]=-y[N]*(1/(h*h)+2*9*h/(2*h))+b[N-2]
print('b=')
print(b)
b=
[-9.8970e+01 1.2000e-01 2.7000e-01 4.8000e-01 7.5000e-01 1.0800e+00
1.4700e+00 1.9200e+00 -2.1557e+02]
Solving the system#
To solve invert the matrix \(A\) such that
The plot below shows the graphical representation of \(A^{-1}\).
invA=np.linalg.inv(A)
plt.imshow(invA)
plt.xlabel('i',fontsize=16)
plt.ylabel('j',fontsize=16)
plt.yticks(np.arange(N-1), np.arange(1,N-0.9,1))
plt.xticks(np.arange(N-1), np.arange(1,N-0.9,1))
clb=plt.colorbar()
clb.set_label('Matrix value')
plt.title(r'Matrix $A^{-1}$',fontsize=32)
plt.tight_layout()
plt.subplots_adjust()
plt.show()
y[1:N]=np.dot(invA,b)
Result#
The plot below shows the approximate solution of the Boundary Value Problem (blue v).
fig = plt.figure(figsize=(8,4))
plt.plot(x,y,'v',label='Finite Difference')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='best')
plt.show()