【问题标题】:I can't solve issue "axis -1 is out of bounds for array of dimension 0"我无法解决问题“轴 -1 超出维度 0 数组的范围”
【发布时间】:2019-05-14 04:50:46
【问题描述】:

我正在尝试模拟弹簧摆的运动,这是我的代码:

import numpy as np
from scipy.integrate import odeint
from numpy import sin, cos, pi, array
import matplotlib.pyplot as plt


#Specify initial conditions
init = array([pi/18, 0]) # initial values

def deriv(z, t):
    x,y=z
    dy=np.diff(y,1)
    dy2=np.diff(y,2)
    dx=np.diff(x,1)
    dx2=np.diff(x,2)
    dt=np.diff(t,1)
    dt2=np.diff(t,1)
    dx2dt2=(4+x)*(dydt)^2-5*x+9.81*cos(y)
    dy2dt2=(-9.81*sin(y)-2*(dxdt)*(dydt))/(l+x)
    return np.array([dx2dt2,dy2dt2])

time = np.linspace(0.0,10.0,1000)
y = odeint(deriv,init,time)

plt.xlabel("time")
plt.ylabel("y")
plt.plot(time, y)
plt.show()

我不断收到错误

Traceback (most recent call last):
  File "/Users/cnoxon/Desktop/GRRR.py", line 24, in <module>
    y = odeint(deriv,init,time)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/scipy/integrate/odepack.py", line 233, in odeint
    int(bool(tfirst)))
  File "/Users/cnoxon/Desktop/GRRR.py", line 13, in deriv
    dy=np.diff(y,1)
  File "/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages/numpy/lib/function_base.py", line 1163, in diff
    axis = normalize_axis_index(axis, nd)
numpy.core._internal.AxisError: axis -1 is out of bounds for array of dimension 0

我是 Python 的完全初学者,所以我不会理解大部分术语,所以请多多包涵。我该如何解决这个问题?我正在尝试绘制两个方程的解

dx2dt2=(4+x)*(dydt)^2-5*x+9.81*cos(y)
dy2dt2=(-9.81*sin(y)-2*(dxdt)*(dydt))/(l+x)

但是我遇到了很多麻烦。有人可以向我解释我应该如何重写我的代码来解决这个问题吗?

谢谢!

【问题讨论】:

  • xy 是整数,而不是数组,所以你不能这样做 np.diff(y,1)

标签: python numpy indexoutofboundsexception odeint index-error


【解决方案1】:

出现问题是因为xy 是整数,而不是数组,所以你不能这样做np.diff(y,1)

但你的问题更深层次。 y 数组的每个条目都必须完全描述您的系统,这意味着计算 dx2dt2dy2dt2 所需的每个值都必须在此向量中。所以y 必须是[x, y, dxdt, dydt] 的列表。 (适配init对应这个)

然后,您的deriv 函数只需给出这样一个向量的导数,即:[dxdt, dydt, dx2dt2, dy2dt2]。你的deriv 函数变得非常简单!

def deriv(z, t):
    x, y, dxdt, dydt = z

    dx2dt2=(4+x)*(dydt)^2-5*x+9.81*cos(y)
    dy2dt2=(-9.81*sin(y)-2*(dxdt)*(dydt))/(l+x)

    return np.array([dxdt, dydt, dx2dt2, dy2dt2])

你还有另外两个小错误:在python中使用**而不是^,我想你把1改成了l...

【讨论】:

  • 这是二阶 ODE 的正确方法吗?我认为您可能必须将其重写为一组一阶 ODE,然后解决该问题
  • 我还有两个问题:python 是否承认 dx2/dt2 是 x 的二阶导数,对于 dy2dt2 也是如此?我不确定如何在 python 中编写二阶导数,符号方式,所以任何帮助将不胜感激。此外,当我更改初始参数时,有时我会得到一个包含四个函数而不是两个函数的图表。为什么会这样,以及如何更改它以使初始参数仅影响函数 dx2/dt2 和 dy2/dt2(即如何仅获得两个函数的图形)?抱歉,如果这很复杂或不清楚。
  • @tel 确实,但这正是我所做的。将其重写为一组一阶 ODE 对应于写入 dx2/dt2 = f(dx/dt, t)dx/dt = f(x, t) 等。在这里,我将所有内容组合成一个维数为 4 的向量的一阶方程。@CharlotteNoxon Python 无法识别任何内容。我不知道是否有这样的约定,但你的符号很清楚,这是最重要的。
  • 对于你的另一个问题,如果ydydt 等于0,它们将保持等于0。然后如果你写init = array([pi/18, 0, 0, 0])ydydt 是相等的为零,因此这些变量不会移动,您只会在绘图上看到xdxdt。但是,如果你写init = array([pi/18, pi/18, 0, 0]),这四个值将会演变。如果您只想绘制xy 而不绘制它们的导数,只需绘制y[:, :2](前两个值是xy)。
  • 所以我要绘制的是来自 ODE x''=(m+x)*y' 的 dx2/dt2(即 x'')和 dy2/dt2(y'') -mx+mcos(y) 和 y''=(msin(y)-2x'y')/(m+x) 其中 m 是任意常数。似乎这不是我要绘制的图形......我将如何绘制二阶导数?很抱歉有其他问题。
猜你喜欢
  • 1970-01-01
  • 2018-07-07
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-22
  • 2021-02-10
相关资源
最近更新 更多