| Text provided under a Creative Commons Attribution license, CC-BY. All code is made available under the FSF-approved MIT license. (c) Marc Spiegelman |
|
In [ ]:
import numpy as np
import scipy.linalg as la
import matplotlib.pyplot as plt
%matplotlib inline
Here we will visualize the Fourier Modes for the eigenfunctions of
$$-\nabla^2 \phi = \lambda\phi$$with dirichlet Boundary conditions on the unit square $\Omega = [0,1]\times[0,1]$. The modes are
$$ \phi_{nm}(x,y)=\sin(n\pi x)\sin(m\pi y) $$with positive eigenvalues
$$ \lambda_{nm} = \pi^2(n^2 + m^2) $$
In [ ]:
x = np.linspace(0,1,200)
X,Y = np.meshgrid(x,x)
def seeMode(n,m,X,Y):
phi_nm = lambda n,m: np.sin(n*np.pi*X)*np.sin(m*np.pi*Y)
plt.figure(figsize=(8,6.2))
plt.contourf(X,Y,phi_nm(n,m))
plt.colorbar()
title = '$\phi_{'+'{},{}'.format(n,m)+'}$'
plt.title(title,fontsize=24)
plt.axis('equal')
plt.show()
seeMode(1,1,X,Y)
seeMode(1,2,X,Y)
seeMode(2,1,X,Y)
seeMode(2,2,X,Y)
seeMode(10,20,X,Y)
S## solution of Poisson's Equation with unit forcing
solve $$ -\nabla^2 u = 1 $$ on $x\in[0,1]\times[0,1]$ with $u=0$ on $\partial\Omega$
In [ ]:
x = np.linspace(0,1,200)
X,Y = np.meshgrid(x,x)
def solvePoisson(N,X,Y,c=0):
phi_nm = lambda n,m: np.sin(n*np.pi*X)*np.sin(m*np.pi*Y)
u = np.zeros(X.shape)
for n in range(1,N+1):
for m in range(1,N+1):
bnm = 4./(np.pi**2*m*n)*(np.cos(n*np.pi)-1.)*(np.cos(m*np.pi) - 1.)
bnm -= 4.*c*m/n*(np.cos(n*np.pi)-1.)
lambda_nm = np.pi**2*(n*n + m*m)
u += bnm/lambda_nm*phi_nm(n,m)
return u
In [ ]:
N=50
u = solvePoisson(N,X,Y)
In [ ]:
plt.figure(figsize=(8,6.2))
plt.contourf(X,Y,u)
plt.colorbar()
title = 'Poisson: $f=1$, N={}, $u_{{max}}={:5.5f}$'.format(N,np.max(u))
plt.title(title,fontsize=24)
plt.axis('equal')
plt.show()
In [ ]:
N=200
u = solvePoisson(N,X,Y,c=.1)
plt.figure(figsize=(8,6.2))
plt.contourf(X,Y,u)
plt.colorbar()
title = 'Poisson: $f=1$, N={}, $u_{{max}}={:5.5f}$'.format(N,np.max(u))
plt.title(title,fontsize=24)
plt.axis('equal')
plt.show()