"""
Created on Tue Apr 28 08:07:25 2020
@author: Mr
"""
"""
函数形如 狄利克雷条件
Ut=a**2*Uxx (0<x<l, t>0)
U(0,t)=0 t>0
U(l,t)=0 t>0
U(x,0)=φ(x) 0<x<l
例子:
Ut=a**2*Uxx (0<x<pi, t>0)
U(0,t)=0 t>0
U(l,t)=0 t>0
U(x,0)=100 0<x<pi
"""
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D
from sympy import symbols,integrate
import seaborn as sns
def Main_f(X,T,N,m,InitialCondition,Boundary_left,Boundary_right,D):
if(D==1):
n=N
x1=np.linspace(0,1,50)
y1=InitialCondition(x1)
plt.figure(figsize=(10,6))
plt.plot(x1,y1)
plt.xlabel('$x$',fontsize=15)
plt.ylabel('$f(x)$',fontsize=15)
plt.title('1DHeat Equation Initial Condition')
x=X
t=T
h=(max(x)-min(x))/n
k=(max(t)-min(t))/m
kappa=1
rho=kappa*k/h/h
print('rho')
'''
显式格式不能任意取时间和空间的网格点数,即M与N不能随意取值。
我们称显式格式为条件稳定。特别地,需 要满足所谓CFL条件(Courant–Friedrichs–Lewy):
'''
if(rho<=0.5):
print('显示格式此时满足条件稳定:')
print('rh0=%f' % (rho))
U=np.zeros((n+1,m+1))
for i in range(1,n):
U[i][0]=InitialCondition(x[i])
for j in range(0,m+1):
U[0][j]=Boundary_left(t[j])
U[n][j]=Boundary_right(t[j])
for j in range(0,m):
for i in range(1,n):
U[i][j+1]=rho*U[i+1][j]+(1-2*rho)*U[i][j]+rho*U[i-1][j]
plt.figure(figsize=(10,6))
plt.plot(x, U.T[0,:])
plt.plot(x, U.T[int(0.10/ k),:])
plt.plot(x, U.T[int(0.15/ k),:])
plt.plot(x, U.T[int(0.20/ k),:])
plt.xlabel('$x$', fontsize = 15)
plt.ylabel(r'$U(dot, tau)$', fontsize = 15)
plt.title(u'1D Heat equation', fontsize = 15)
plt.legend([r'$t = 0.$', r'$t = 0.10$', r'$t = 0.15$', r'$t = 0.20$'], fontsize = 15)
fig=plt.figure(figsize=(10,6))
ax=Axes3D(fig)
x1,y1=np.meshgrid(t,x)
surf=ax.plot_surface(x1,y1,U,rstride=1,cstride=1,cmap=cm.coolwarm,alpha=0.9)
ax.set_xlabel('t')
ax.set_ylabel('x')
ax.set_zlabel('U')
ax.set_xticks([0,0.05,0.1,0.15,0.2])
ax.set_yticks([0,0.2,0.4,0.6,0.8,1])
ax.set_zticks([0,0.2,0.4,0.6,0.8,1])
ax.set_title('Hot equation$ u_t=A u_{xx} $')
ax.grid(False)
cbar=plt.colorbar(surf,shrink=0.5,aspect=5)
plt.show()
fig1=plt.figure(figsize=(10,6))
ax1=fig1.add_subplot(1,1,1,projection='3d')
x1,y1=np.meshgrid(x,t)
surf1=ax1.plot_surface(x1,y1,U.T,cmap=cm.coolwarm)
ax1.set_xlabel('x',fontdict={"size":16})
ax1.set_ylabel('t',fontdict={"size":16})
ax1.set_zlabel('U',fontdict={"size":16})
ax1.set_xticks([0,0.2,0.4,0.6,0.8,1])
ax1.set_yticks([0,0.05,0.1,0.15,0.2])
ax1.set_xticks([0,0.2,0.4,0.6,0.8,1])
ax1.set_title('Hot equation$ u_t=A u_{xx} ,$')
ax1.grid(False)
cbar=fig1.colorbar(surf1,shrink=0.75,aspect=5)
plt.show()
if(D==2):
n = N[0]
o = N[1]
m = m
nu = 0.05
h = (max(X[0])-min(X[0])) / (n)
h1 = (max(X[1])-min(X[1])) / (o)
sigma = 0.25
k =T/(m)
x = X[0]
y = X[1]
u = Boundary_left
un = Boundary_right
u[int(0.5/h):int(1/h+1),int(0.5/h1):int(1/h1+1)] = 2
for n in range(m + 1):
un = u.copy()
u[1:-1,1:-1] = (un[1:-1,1:-1] +
nu * k / h**2 * (un[2: ,1:-1] - 2 * un[1:-1,1:-1] + un[0:-2,1:-1]) +
nu * k / h1**2 * (un[1:-1,2:] - 2 * un[1:-1,1:-1] + un[1:-1, 0:-2]) )
u[0, :] = 1
u[-1, :] = 1
u[:, 0] = 1
u[:, -1] = 1
fig = plt.figure(figsize=(8,4))
ax = Axes3D(fig)
x, y = np.meshgrid(x,y)
surf1=ax.plot_surface(x,y,u[:],rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False)
ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(1,2.5)
ax.set_xlabel('$x$',fontdict={"size":14})
ax.set_ylabel('$y$',fontdict={"size":14})
ax.set_zlabel('U',fontdict={"size":14})
ax.set_xticks([0,0.4,0.8,1.2,1.6,2])
ax.set_yticks([0,0.4,0.8,1.2,1.6,2])
ax.set_zticks([1,1.5,2,2.5])
ax.set_title('Hot equation$ u_t=A u_{xx}+A u_{yy} $')
ax.grid(False)
cbar=fig.colorbar(surf1,shrink=0.75,aspect=5)
plt.show()
print('===================')
'''
X一维变量的取值范围为
T 时间变量的取值范围
初始条件的形状
N X方向的网格数
M 时间T方向的网格数
T 最大时间期限
X 最大空间范围
U 用来存储差分网格点上值得矩阵
'''
D=2
if(D==1):
N,m=25,1500
T,x=np.linspace(0,0.2,m+1),np.linspace(0,1,N+1)
Initia=lambda x :4.0*(1-x)*x
Boundary_left=lambda t:0
Boundary_right=lambda t:0
Main_f(x,T,N,m,Initia,Boundary_left,Boundary_right,D=1)
elif(D==2):
n=30
o=30
m=1000
InitialCondition=0
T=0.2
N=np.array([n,o])
Boundary_left= np.ones((n,o))
Boundary_right= np.ones((n,o))
X=np.array([np.linspace(0,2,n),np.linspace(0,2,o)])
Main_f(X,T,N,m,InitialCondition,Boundary_left,Boundary_right,D=2)
else:
print('3D及以上还在努力中,请期待!!!!!!!!!!!!!!!')
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/996c2c9a140322f642c4f4d427b300ab.png)
"""
Created on Tue Apr 28 21:17:39 2020
@author: Mr.Yang
"""
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
def Main_f(X,T,N,m,InitialCondition,Boundary_left,Boundary_right):
n = N[0]
o = N[1]
m = m
nu = 0.05
h = (max(X[0])-min(X[0])) / (n)
h1 = (max(X[1])-min(X[1])) / (o)
sigma = 0.25
k =T/(m)
x = X[0]
y = X[1]
u = Boundary_left
un = Boundary_right
u[int(0.5/h):int(1/h+1),int(0.5/h1):int(1/h1+1)] = 2
for n in range(m + 1):
un = u.copy()
u[1:-1,1:-1] = (un[1:-1,1:-1] +
nu * k / h**2 * (un[2: ,1:-1] - 2 * un[1:-1,1:-1] + un[0:-2,1:-1]) +
nu * k / h1**2 * (un[1:-1,2:] - 2 * un[1:-1,1:-1] + un[1:-1, 0:-2]) )
u[0, :] = 1
u[-1, :] = 1
u[:, 0] = 1
u[:, -1] = 1
fig = plt.figure(figsize=(8,4))
ax = Axes3D(fig)
x, y = np.meshgrid(x,y)
surf1=ax.plot_surface(x,y,u[:],rstride=1,cstride=1,cmap=cm.coolwarm,linewidth=0,antialiased=False)
ax.set_xlim(0,2)
ax.set_ylim(0,2)
ax.set_zlim(1,2.5)
ax.set_xlabel('$x$',fontdict={"size":14})
ax.set_ylabel('$y$',fontdict={"size":14})
ax.set_zlabel('U',fontdict={"size":14})
ax.set_xticks([0,0.4,0.8,1.2,1.6,2])
ax.set_yticks([0,0.4,0.8,1.2,1.6,2])
ax.set_zticks([1,1.5,2,2.5])
ax.set_title('Hot equation$ u_t=A u_{xx}+A u_{yy} $')
ax.grid(False)
cbar=fig.colorbar(surf1,shrink=0.75,aspect=5)
plt.show()
return u
n=30
o=30
m=1000
InitialCondition=0
Boundary_left=0
Boundary_right=0
T=0.2
N=np.array([n,o])
u_xy0=lambda x,y: 0
u_xyt=lambda x,y:x*np.sin(np.pi*y)-y*np.sin(np.pi*x)
Boundary_left= np.ones((n,o))
Boundary_right= np.ones((n,o))
X=np.array([np.linspace(0,2,n),np.linspace(0,2,o)])
Main_f(X,T,N,m,InitialCondition,Boundary_left,Boundary_right)