四阶龙格-库塔
Runge–Kutta of 4th order
假设我有一个 4 ODE 系统:dX/dt = F(X),其中 X 是向量(4 维),F:R^4 -> R^4。 F 称为 vectorDE_total_function,我正在尝试使用 RK-4 计算解决方案。
def solvingDES():
previous_vector = np.array ([theta_1, omega_1, theta_2, omega_2]);
for current_time in time:
temp_vector = previous_vector;
RK_vector = np.array([0.0,0.0,0.0,0.0]);
for c in [6,3,3,6]:
RK_vector = vectorDE_total_function(previous_vector + c * RK_vector/6) * time_step;
temp_vector += RK_vector / c;
previous_vector = temp_vector;
current_time += 1;
看起来我在某处错了,但我不确定在哪里。看起来合法吗?
这是一种奇怪的、很少见的实现方式,它只适用于经典的 RK4,其他 Runge-Kutta 方法不会那样工作。不过大体思路好像是对的。
您在通常意想不到的地方遇到了一个常见错误。设置
temp_vector = previous_vector;
以后
previous_vector = temp_vector;
您不复制向量,而是让两个对象引用共享相同的向量。使用
temp_vector = previous_vector.copy();
或
previous_vector = temp_vector[:];
强制复制矢量数据。
假设我有一个 4 ODE 系统:dX/dt = F(X),其中 X 是向量(4 维),F:R^4 -> R^4。 F 称为 vectorDE_total_function,我正在尝试使用 RK-4 计算解决方案。
def solvingDES():
previous_vector = np.array ([theta_1, omega_1, theta_2, omega_2]);
for current_time in time:
temp_vector = previous_vector;
RK_vector = np.array([0.0,0.0,0.0,0.0]);
for c in [6,3,3,6]:
RK_vector = vectorDE_total_function(previous_vector + c * RK_vector/6) * time_step;
temp_vector += RK_vector / c;
previous_vector = temp_vector;
current_time += 1;
看起来我在某处错了,但我不确定在哪里。看起来合法吗?
这是一种奇怪的、很少见的实现方式,它只适用于经典的 RK4,其他 Runge-Kutta 方法不会那样工作。不过大体思路好像是对的。
您在通常意想不到的地方遇到了一个常见错误。设置
temp_vector = previous_vector;
以后
previous_vector = temp_vector;
您不复制向量,而是让两个对象引用共享相同的向量。使用
temp_vector = previous_vector.copy();
或
previous_vector = temp_vector[:];
强制复制矢量数据。