python中离散化方法如何解决index out of bound
how to solve index out of bound in the discretization method in python
我正在尝试使用离散化方案求解 PDE
PDE 的形式
dudt=alphau+betadudx+gamma*d2udx2
*dudt 关于时间的一阶导数
**dudx 关于 space
的第一个导数
***d2udx2 关于space
的二次导数
alpha、beta 和 gamma 已定义
我尝试了代码,但它给出了一个错误“IndexError:索引超出范围
“我不知道如何解决这个问题,需要一些帮助
提前致谢
import numpy as np
import matplotlib.pylab as plt
nx = 181
dx = np.pi / (nx - 1)
sigma = .03
dt = sigma * dx
R=6955e+5
eta=250e+6
nt=100
v0=11
lamda0=75*np.pi/180
x=np.linspace(0,np.pi,180)
u=np.sin(x)*np.cos(x)
for n in range(nt):
un = u.copy()
for i in range(1, nx-1):
k=i*np.pi/180
lamda = np.pi-k
if abs(lamda)<=lamda0:
v=v0*np.sin(180*lamda/lamda0)
v_prim=-v0*(np.cos(180*lamda/lamda0))
else:
v=0
v_prim=0
alpha=v*np.cos(k)/np.sin(k)/R+v_prim/R
beta=eta/R*np.cos(k)/np.sin(k)+v/R
gamma=eta/R/R
u[i] = un[i]*(1+alpha*dt) +(beta*dt/dx)*(un[i] - un[i-1]) + (gamma*dt/dx/dx) * (un[i+1] - 2 * un[i] + un[i-1])
u[0] = un[0]*(1+alpha*dt) +(beta*dt/dx)*(un[0] - un[-1]) + (gamma*dt/dx/dx) * (un[1] - 2 * un[0] + un[-1])
u[-1] = u[0]
plt.plot(x,u,label='B')
plt.legend()
plt.show()
u
是一个长度为 180 的数组。0-179
是它的有效索引。
在循环的最后一次迭代中,您试图访问 u[180]
这是越界的,因为它不存在。
正在替换
for i in range(1, nx-1):
和
for i in range(1, nx-2):
可以防止这种情况和异常,但您应该进一步检查您的循环以确保您的算法是正确的。也许你所有的计算都偏移了 1 delta
我正在尝试使用离散化方案求解 PDE PDE 的形式 dudt=alphau+betadudx+gamma*d2udx2
*dudt 关于时间的一阶导数
**dudx 关于 space
的第一个导数***d2udx2 关于space
的二次导数alpha、beta 和 gamma 已定义
我尝试了代码,但它给出了一个错误“IndexError:索引超出范围 “我不知道如何解决这个问题,需要一些帮助
提前致谢
import numpy as np
import matplotlib.pylab as plt
nx = 181
dx = np.pi / (nx - 1)
sigma = .03
dt = sigma * dx
R=6955e+5
eta=250e+6
nt=100
v0=11
lamda0=75*np.pi/180
x=np.linspace(0,np.pi,180)
u=np.sin(x)*np.cos(x)
for n in range(nt):
un = u.copy()
for i in range(1, nx-1):
k=i*np.pi/180
lamda = np.pi-k
if abs(lamda)<=lamda0:
v=v0*np.sin(180*lamda/lamda0)
v_prim=-v0*(np.cos(180*lamda/lamda0))
else:
v=0
v_prim=0
alpha=v*np.cos(k)/np.sin(k)/R+v_prim/R
beta=eta/R*np.cos(k)/np.sin(k)+v/R
gamma=eta/R/R
u[i] = un[i]*(1+alpha*dt) +(beta*dt/dx)*(un[i] - un[i-1]) + (gamma*dt/dx/dx) * (un[i+1] - 2 * un[i] + un[i-1])
u[0] = un[0]*(1+alpha*dt) +(beta*dt/dx)*(un[0] - un[-1]) + (gamma*dt/dx/dx) * (un[1] - 2 * un[0] + un[-1])
u[-1] = u[0]
plt.plot(x,u,label='B')
plt.legend()
plt.show()
u
是一个长度为 180 的数组。0-179
是它的有效索引。
在循环的最后一次迭代中,您试图访问 u[180]
这是越界的,因为它不存在。
正在替换
for i in range(1, nx-1):
和
for i in range(1, nx-2):
可以防止这种情况和异常,但您应该进一步检查您的循环以确保您的算法是正确的。也许你所有的计算都偏移了 1 delta