python - 抛物线射击的龙格-库塔算法中的索引超出范围
问题描述
嗨,我正在尝试让这个程序运行。假设 z 结构的大小为 4,但它给出了错误。我还注意到,如果我在 1 中打印 z,它会给我一个值,所以我不知道有什么缺陷。这是一个使用 runge kutta 计算物理摩擦抛物线射击系统的程序,但是会出现以下错误: 错误的图像
代码如下:
import numpy as np
import matplotlib.pyplot as plt
def RK4(f_user,U0,t,*params):
n=t.size
neq=U0.size
u=np.zeros((n,neq))
u[0]=U0
dt=t[2]-t[0]
for i in range(n-1):
k1=f_user(u[i],t[i],*params)
k2=f_user(u[i]+k1*dt/2.,t[i]+dt/2.,*params)
k3=f_user(u[i]+k2*dt/2.,t[i]+dt/2.,*params)
k4=f_user(u[i]+k3*dt,t[i+1],*params)
u[i+1]=u[i]+dt*(k1+2*k2+2*k3+k4)/6.
return u
g = 9.81
# m = 1 # kg
theta_0 = 45 * np.pi / 180 # radianes
v_0 = 10 # m/s
tInc = 0.01
tStop = (1.+ tInc)*20
t = np.arange(0., tStop, tInc)
x_0=0
y_0=0
vx_0=v_0 * np.cos(theta_0)
vy_0=v_0 * np.sin(theta_0)
z0 = np.array([x_0,vx_0,y_0,vy_0])
def f(z,t,N,k,x_0,vx_0,y_0,vy_0):
v=np.sqrt(z[1] ** 2 + z[3] ** 2)
print(z[1])
derivs=np.array([[z[2], -k*v**(N-1)*z[2] ,z[3], -g-k*v**(N-1)*z[3]]])
return derivs
psolnE = RK4(f,z0,t,1,.1,x_0,vx_0,y_0,vy_0)```
解决方案
以下语句始终创建一个大小为 1 的 numpy 数组,derivs[0]
其中[z[2], -k*v**(N-1)*z[2] ,z[3], -g-k*v**(N-1)*z[3]]
.
derivs=np.array([[z[2], -k*v**(N-1)*z[2] ,z[3], -g-k*v**(N-1)*z[3]]])
因此,一旦您的 for 循环RK4
到达1,它就会引发错误。要解决此问题,请将上述语句替换为 -
derivs=np.array([z[2], -k*v**(N-1)*z[2] ,z[3], -g-k*v**(N-1)*z[3]])
推荐阅读
- gettext - msgid == msgstr – 清理 gettext *.po 文件,其中 msgstr 等于 msgid
- javascript - 猫鼬:如果存在多个对象,如何更新它,如果它不退出,如何创建?
- javascript - 在服务器被禁止时向用户发送消息
- firebase - Cloud Firestore for Presence 通知
- c# - 如何使用electronjs从dll文件(dotnet)调用函数
- jquery - 无法保持选中动态创建的复选框
- python - 在 matplotlib 中绘制实时图形,输入为不断更新的 csv 文件
- uft14 - 如何为 UFT 中的多个操作设置当前行迭代?
- keras - 保存包裹在管道内的 Keras 模型
- excel - 基于其他组合框Excel VBA的依赖组合框列表