如何更改为向量形式

问题描述

我以前发布了问题How to create a Single Vector having 2 Dimensions?,并通过一些有用的答案可以更改代码

在上一个问题中,我被要求不要将“ x”和“ v”的值分开,而是使用具有两个维度的单个向量“ x”(即,“ x”和“ v”可以由x处理) (1)和x(2))。

考虑到这一点,我可以进行更改:

# Runge-kutta Method
x = np.empty(N);
v = np.empty(N);
x[0] = x0;
v[0] = v0;

从上一个问题的我的密码变成:

# Runge-kutta Method
x = np.zeros([2,N]);
x[0,0] = x0
x[1,0] = v0

并将主循环切换为以下内容

for i in range(N - 1):    #MAIN LOOP
    K1x = f1(te[i],x[0,i],x[1,i])
    K1v = f2(te[i],i])

    K2x = f1(te[i] + h / 2,i] + h * K1x / 2,i] + h * K1v / 2)
    K2v = f2(te[i] + h / 2,i] + h * K1v / 2)

    K3x = f1(te[i] + h / 2,i] + h * K2x / 2,i] + h * K2v / 2)
    K3v = f2(te[i] + h / 2,i] + h * K2v / 2)

    K4x = f1(te[i] + h,i] + h * K3x,i] + h * K3v)
    K4v = f2(te[i] + h,i] + h * K3v)

    x[0,i + 1] = x[0,i] + h / 6 * (K1x + 2 * K2x + 2 * K3x + K4x)
    x[1,i + 1] = x[1,i] + h / 6 * (K1v + 2 * K2v + 2 * K3v + K4v)

这些更改有效并提供了我需要的结果。

问题: 我的问题是,有人告诉我主循环不是矢量形式。要使其具有矢量形式,必须进行哪些更改?

解决方法

定义

def f(t,x): return np.array([f1(t,*x),f2(t,*x)])

,从而删除RK4循环中的第二行。例如,最后两个是

    K4 = f(te[i] + h,x[:,i] + h * K3)
    x[:,i + 1] = x[:,i] + h / 6 * (K1 + 2 * K2 + 2 * K3 + K4)