Как превратиться в векторную форму

Я ранее публиковал вопрос Как создать единый вектор, имеющий 2 измерения?, и с некоторыми полезными ответами я смог изменить мой код.

В этом предыдущем вопросе меня попросили не разделять мои значения «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], x[0, i], x[1, i])

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

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

    K4x = f1(te[i] + h, x[0, i] + h * K3x, x[1, i] + h * K3v)
    K4v = f2(te[i] + h, x[0, i] + h * K3x, x[1, 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)

Изменения сработали и дали нужные мне результаты.

Вопрос: Моя проблема в том, что мне сказали, что основной цикл не имеет векторной формы. Какие изменения нужно внести, чтобы он был в векторной форме?


person C.L    schedule 05.10.2020    source источник
comment
Ваш код не векторизован, потому что он вычисляет x и v отдельно. В идеале у вас должна быть одна функция, которая будет возвращать x и v в одном массиве, а затем работать с этим массивом, как демонстрирует Лутц.   -  person Pranav Hosangadi    schedule 05.10.2020


Ответы (1)


Определять

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)
person Lutz Lehmann    schedule 05.10.2020