【问题标题】:how to solve index out of bound in the discretization method in python如何解决python离散化方法中的索引越界问题
【发布时间】:2017-12-19 17:46:10
【问题描述】:

我正在尝试使用离散化方案求解 PDE 表格中的 PDE dudt=alphau+betadudx+gamma*d2udx2

*dudt 关于时间的一阶导数

**dudx 空间的一阶导数

***d2udx2 空间的二阶导数

定义了 alpha、beta 和 gamma

我尝试了代码,但它给出了错误“IndexError: index out of bounds "我不知道如何解决这个问题,在这里需要一些帮助

提前致谢

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()

【问题讨论】:

    标签: python indexing error-handling pde discretization


    【解决方案1】:

    u 是一个长度为 180 的数组。0-179 是它的有效索引。 在您的循环的最后一次迭代中,您尝试访问 u[180] 这是超出范围的,因为它不存在。

    替换

    for i in range(1, nx-1):
    

    for i in range(1, nx-2):
    

    防止这种情况和异常,但您应该进一步检查您的循环以确保您的算法是正确的。也许你所有的计算都移动了 1 个增量

    【讨论】:

    • 啊,我明白了,谢谢,我没明白你在说什么关于循环,计算如何通过 delta 移动??
    猜你喜欢
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 2018-01-11
    • 2015-02-04
    • 2017-12-26
    相关资源
    最近更新 更多