首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >索引错误:索引2超出了大小为2的轴0的边界

索引错误:索引2超出了大小为2的轴0的边界
EN

Stack Overflow用户
提问于 2020-10-08 03:15:21
回答 1查看 664关注 0票数 0

我正在尝试用不同的方法解决一些常微分方程,然后打印和绘制我的结果。当我尝试运行它时,我得到了错误IndexError: index 2 is out of bounds for axis 0 with size 2

我知道这与维度有关,但我认为我所有的维度都是正确的。下面是我尝试解决ode的每种方法的一个示例

代码语言:javascript
复制
def f(t,x,y):
    xprime = x - y + (2*t) - (t**2) - (t**3)
    return xprime

def g(t,x,y):
    yprime = x + y - (4*(t**2)) + (t**3)
    return yprime


#Exact Solution
def exact(t):
    y = np.zeros(len(t))
    x = np.zeros(len(t))
    
    for i in range(n):
        cos_arr = np.cos(t)
        sin_arr = np.sin(t)
        
        y = np.exp(t) * cos_arr + t**2
        x = np.exp(t) * sin_arr - t**3
        
        return x, y
    
 #Explicit Euler   
def Eulerx(t0, tmax, x0, n):
    t, dt = np.linspace(t0, tmax, n, retstep = True)
    x = np.zeros(n)
    y = np.zeros(n)
    x[0] = x0
    y[0] =y0
    for i in range (n-1):
        x[i+1] = x[i] + (dt/2) * f(t[i], x[i], y[i])
        return t, x

#RK2
        
def RK2x(t0, tmax, x0, n):
    t, dt = np.linspace(t0, tmax, n, retstep = True)
    x = np.zeros(n)
    y = np.zeros(n)
    x[0] = x0
    y[0]=y0
    for i in range(n-1):
        xK1 = f(t[i], x[i],y[i])
        xK2 = f(t[i]+ dt, x[i] +dt * xK1, y[i])
        x[i+1] = x[i] +(dt* (1/2)*(xK1 + xK2))
        return t, x
    

    
#Classical RK4

def RK4x(t0, tmax, x0, n):
    t, dt = np.linspace(t0, tmax, n, retstep = True)
    x = np.zeros(n)
    y = np.zeros(n)
    x[0] = x0
    y[0] =y0
    for i in range(n-1):
        x4K1 = f(t[i],x[i],y[i])
        x4K2 = f(t[i]+((1/2)*dt), x[i]+ ((1/2)*dt*x4K1),y[i])
        x4K3 = f(t[i] +((1/2)*dt), x[i] + ((1/2)*dt*x4K2),y[i])
        x4K4 = f(t[i]+dt, x[i]+dt*x4K3,y[i])
        x[i+1] = x[i] + (dt*(1/6)*(x4K1 + (2* x4K2) +(2*x4K3) +x4K4))
        
        return t, x
    

    
if __name__ == '__main__': 
    t0 = 0
    tmax = 1
    x0 = 1
    y0 = 0
    n=50
    
    [t,X1] = Eulerx(t0,tmax, x0,n)
    [t,Y1] = Eulery(t0,tmax, y0,n)
    
    [t, X2]= RK2x(t0,tmax, x0,n)
    [t, Y2]= RK2y(t0,tmax, y0,n)
    
    [t, X3]= RK4x(t0,tmax, x0,n)
    [t, Y3]= RK4y(t0,tmax, y0,n)
    
    x=exact(t)
    y=exact(t)
    
    abs_errx1= abs(x-X1)
    abs_errx2= abs(x-X2)
    abs_errx3= abs(x-X3)

    
    
    

    
    print("=========================================================================")
    print(" n        Eulerx     Eulery      RK2x      RK2y      RK4x      RK4y", end='\n')
    for i in range(n):
        print(abs_errx1[i], abs_erry1[i], abs_errx2[i], abs_erry2[i], abs_errx3[i], abs_erry3[i])
    print("=========================================================================")
EN

Stack Overflow用户

发布于 2020-10-08 04:05:33

您的数组abs_errx1等都是大小(2,50)。您看到的是n从0到50运行的abs_errx1[n]等。当您需要将n用作第二个维度时,它被用作第一个维度。我不确定第一个维度应该是什么。

票数 0
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64250841

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档