首先,我在三自由度纽比阵列上做一个龙格库塔。我的阵列是这样的:
状态=[[X]、[Vx]、[Y]、[Vy]、[Z]、[Vz]]
我运行Runge-Kutta,得到四个K值,然后用[newaxis]进行转置。因此,当我尝试将新状态追加到states数组时,如下所示:
states = append(states, states[:,i] + (K1.T + 2 * K2.T + 2 * K3.T + K4.T)/6, 1)
其中“i”是一个从0开始并为每次迭代累加的计数器。在
但是,当我运行我的代码时,我的结果状态数组不是由六个元素组成的两列。似乎我在向states数组追加一个行向量而不是一个列向量。我在列中使用两个元素(X,Vx)运行代码,所有的附加都很好(或者至少我的结果是有意义的)。在
我曾试图将Runge-Kutta的结果强制为列向量,但这会扰乱K值的计算。我尝试过我的append代码的变体,结果仍然相同。在
这是一个Matlab代码的克隆,我在NumPy数组和索引上找不到任何对我有帮助的东西。在
感谢任何帮助。在
谢谢。在
更新:
states[:,0] = [[0], [2300], [0], [0], [-1600], [500]]
-原始
states[:,1] = [[2300], [2100], [0], [0], [-2100], [450]]
-附加
states = [[0, 2300], [2300, 2100], [0, 0], [0, 0], [-1600, -2100], [500, 450]]
-最终版本
这些是列向量。在
由于效率问题,如果可以避免的话,不应该追加数组。追加意味着更改分配的内存大小,这可能会占用不连续的内存空间,因此需要低效的分配或重新分配。这会大大降低程序的速度,特别是对于大型数组。在
如果你要实现一个固定的时间步长Runge Kutta,你事先就知道你的解在时间T时会有多少个点。它是N=(T-t0)/h+1,其中T是最后一个时间,t0是初始时间,h是时间步。您可以用零初始化数组(使用
states = np.zeros((N,3))
),并在执行过程中填充值,将索引i
与时间t[i] = t0 +i*h
关联起来。这将在循环内:states[:,i+1] = states[:,i] + RK4_step(states[:,i])
, 其中RK4_step(states[:,i])
是一个函数,返回一个数组(列),其中包含Runge-Kutta方法的一个步骤中状态值的变化。在即使您的时间步长是可变的,您仍然应该这样做,但是时间不均匀
t[i] = t0 +i*h
。在或者,您可以使用
numpy.integrate.ode_int()
,它在需要的时间返回一个ODE的解决方案。在您应该堆叠它们,而不是
appending
它们。在从numpy documentation开始,您应该使用其中一个堆栈方法,例如:
np.vstack
:或者根据您得到的数据,还有}(沿第三个轴堆叠)。在
np.hstack
(沿第一个轴堆叠)和{相关问题 更多 >
编程相关推荐