欢迎光临散文网 会员登陆 & 注册

问大佬们一个问题,有限差分相关的,拜谢

2023-07-21 16:04 作者:小道士苏区  | 我要投稿

是这样的,小弟最近在学数值方法,于是参考了以下链接的教程:

案例1:

是谁还在胡说有限差分法?_哔哩哔哩_bilibili

具体问题如下:

问题描述

差分后形式如下:

问题差分

python中,空间步长为0.1,时间步长为0.1时,结果为:

空间步长为0.1,时间步长为0.1

奇怪的来了,按照道理我缩小时间步长结果应该更精确,但是我取空间步长为0.01,时间步长为0.01时,结果如下:


空间步长为0.01,时间步长为0.01

结果完全不对:

代码如下:

import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D as ax
beta=0.01
deltax=0.01
deltat=0.01
lx=1
t=1
p=beta*deltat/(deltax*deltax)
N=lx/deltax
M=t/deltat
print(M,N,p)
M=int(M)
N=int(N)
ans=np.zeros((M,N))
def jisuan(x,y,z):
   u=(x+z-2*y)*p
   return u
for k in range(0,M):
   ans[k][0]=100
   ans[k][N-1]=100
print(ans)
for j in range(1,M):
   for i in range(1,N-1):
       ans[j][i]=ans[j-1][i]+jisuan(ans[j-1][i+1],ans[j-1][i],ans[j-1][i-1])

print(ans)
# plt.matshow(ans, cmap=plt.cm.Reds)#这里设置颜色为红色,也可以设置其他颜色
# plt.title("matrix A")
# plt.show()
fig=plt.figure()
ax=ax(fig)
Y=np.arange(0,t,deltat)
X=np.arange(0,lx,deltax)
X,Y=np.meshgrid(X,Y)

plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# mpl.rcParams['legend.fontsize'] = 30  #线段标签 字体大小

ax.set_xlabel('空间长度',size=10,labelpad=10)
ax.set_ylabel('时间/s',size=10,labelpad=10)
ax.set_zlabel('温度/C',size=10,labelpad=10)
ax.plot_surface(X, Y, ans,  cmap=plt.get_cmap('rainbow'))
plt.show()
案例2:

来源于:微分方程数值求解——有限差分法 - 知乎 (zhihu.com)

具体问题如下:

控制方程

边界条件如下:

边界条件

差分如下:

差分

默认初始场为0;

python中,x步长为0.01,y步长为0.01时:

x步长为0.01,y步长为0.01

x步长为0.025,y步长为0.025时:

x步长为0.025,y步长为0.025

很明显最大值不同了!

代码如下:

import math
import numpy as np
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D as ax
import matplotlib.animation as ma
pi=3.1415926
deltax=0.025
deltay=0.025
x=1
y=1
p=1/(deltax*deltax)
q=1/(deltay*deltay)
I=int(x/deltax)
J=int(y/deltay)
ans=np.zeros((J,I))
print(ans)
def f(x,y):
   u=(-2)*pi*pi*math.sin(pi*x)*math.sin(pi*y)
   return u
for j in range(1,J-1):

   for i in range(1,I-1):
       # print(i,j)
       ans[j][i]=(p*(ans[j][i+1]+ans[j][i-1])+q*(ans[j+1][i]+ans[j-1][i])-f(i*deltax,j*deltay))/(2*(p+q))
       if ans[j][i]<0:
           ans[j][i]=0

fig = plt.figure()
ax = ax(fig)
Y = np.arange(0, y, deltay)
X = np.arange(0, x, deltay)
X, Y = np.meshgrid(X, Y)
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# mpl.rcParams['legend.fontsize'] = 30  #线段标签 字体大小

ax.set_xlabel('x',size=10,labelpad=10)
ax.set_ylabel('y',size=10,labelpad=10)
ax.set_zlabel('',size=10,labelpad=10)
ax.plot_surface(X, Y, ans, cmap=plt.get_cmap('rainbow'))
plt.show()
# plt.pause(100)
# plt.close("all")
# print(ans)


# plt.matshow(ans, cmap=plt.cm.get_cmap("rainbow"))#这里设置颜色为红色,也可以设置其他颜色
# plt.title("matrix A")
# plt.show()

希望大佬解惑!

问大佬们一个问题,有限差分相关的,拜谢的评论 (共 条)

分享到微博请遵守国家法律