Introduction
1-d Linear heat Equation:
Initial Condition:
Dirichlet Boundary Condition:
Design Algorithm to Solve Problem
Discrete equation: Forward Difference in time, Central Difference in space.
code
def diffusion(nt, nx, tmax, length, c):
dt = tmax/(nt-1)
dx = length/(nx-1)
import numpy as np
u = np.zeros((nx,nt))
x = np.zeros(nx)
# BC
u[0,:] = u[nx-1,:]= 0
# IC
for i in range(1,nx-1):
if(i*dx > 0.5 and i*dx < 1):
u[i,0] = 1
else:
u[i,0] = 0
# Loop
for n in
range(0,nt-1):
for i in
range(1,nx-1):
u[i,n+1] =
u[i,n] + c*(dt/dx**2.0)*(u[i+1,n]-2.0*u[i,n]+u[i-1,n])
# X Loop
for i in range(0,nx):
x[i] = i*dx
return u, x
import matplotlib.pyplot as plt
def plot_diffusion(u,x,nt,title):
plt.figure()
for i in range(0,nt,10):
plt.plot(x,u[:,i],)
plt.xlabel('x(m)')
plt.ylabel('u(m/s)')
plt.ylim([0,2.2])
plt.title(title)
You may find that the solution does not always converge.
I will explain that later (Hopefully)
Analytical solution:
def ana_diffusion(nt, nx, tmax, length, c):
dt = tmax/(nt-1)
dx = length/(nx-1)
import numpy as np
u = np.zeros((nx,nt))
x = np.zeros(nx)
# X Loop
for i in range(0,nx):
x[i] = i*dx
# Loop
for n in range(0,nt-1):
for i in range(1,nx-1):
for k in range(1,1000):
u[i,n] = u[i,n] + 2/(k*math.pi)*(math.cos(k*math.pi*0.25)-math.cos(k*math.pi*0.5))*math.exp(-0.1*0.25*k**2*math.pi**2*dt*n)*math.sin(0.5*k*math.pi*x[i])
return u, x
For analytical solution with Newmann & Robin BC I will do them later (hopefully)