【问题标题】:Index Error : Index 2 is out of bounds for axis 0 with size 2索引错误:索引 2 超出轴 0 的范围,大小为 2
【发布时间】:2021-01-22 19:28:17
【问题描述】:

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

我知道这与尺寸的事实有关,但我认为我的所有尺寸都是正确的。这是我尝试解决颂歌的每种方式的示例

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

【问题讨论】:

  • 您没有显示所有代码。没有 Eulery、RK2y、RK4y 的定义。您的错误发生在哪里?
  • 我无法全部展示。 Eulery、RK2y 和 RK4y 与 x 版本相同。它在我打印时发生
  • 当我运行我的代码时,我确实定义了所有函数
  • 你的方法实现有误。运行 x 方法时,您从哪里获取 y 的值?您将它们设置为零。因此,您解决的不是所述系统,而是标量方程 x' = f(t,x,0) 和 y'=g(t,0,y)。
  • 请清理您的代码,exact 中的循环并不是真正的循环,也不应该如此。还有exact返回一对数组,需要用同样的方式读取返回值,x,y = exact(t)。这应该可以解决眼前的问题,但这段代码仍然存在很多错误,几乎完全重写。

标签: python numpy differential-equations


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2019-03-01
    • 1970-01-01
    • 2018-02-12
    • 1970-01-01
    相关资源
    最近更新 更多