python - 如何在python的离散化方法中解决索引出界

标签 python indexing error-handling pde discretization

我正在尝试使用离散化方案解决PDE
PDE的形式
dudt = alphau + betadudx + gamma * d2udx2

*关于时间没有第一个衍生

**与空间有关的第一个衍生词

*** d2udx2关于空间的次生派生词

定义了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个增量

关于python - 如何在python的离散化方法中解决索引出界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47892530/

相关文章:

python - namedtuple return 和它的 typename 参数有什么区别?

python - 使用 2D 数组在 Python 中绘制颤动图

javascript - 从具有多个 ID 的单个 JS 对象中获取数据并被搜索引擎索引

curl - SOLR索引一个远程文件

ajax - 重定向到 JSF ajax 错误页面的模式

python - 在 Python 中使用 Selenium 处理模态对话框

python - 在 3 channel 阵列上创建 numpy 掩码阵列永远行不通

javascript - 如何在鼠标悬停时获取元素的索引值?

python - 如果!期间发生键错误,如何重新启动和运行所有代码!在Google Colab中安装pip?

javascript - 将错误抛出到promise.catch之外