Как создать единый вектор с двумя измерениями?

Я использовал уравнение движения (закон Ньютона) для простого сценария пружины и массы, включив его в данное 2-е уравнение ОДУ y + (k / m) x = 0; у (0) = 3; у '(0) = 0.

Затем я смог запустить код, который вычисляет и сравнивает точное решение с решением метода Рунге-Кутта.

Он работает нормально ... однако меня недавно попросили не разделять мои значения 'x' и 'v', а использовать один вектор 'x', который имеет два измерения (т.е. 'x' и 'v' могут быть обрабатывается x (1) и x (2)).

МОЙ КОД:

# Given is y" + (k/m)x = 0; y(0) = 3; y'(0) = 0

# Parameters
h = 0.01;  #Step Size
t = 100.0;  #Time(sec)
k = 1;
m = 1;
x0 = 3;
v0 = 0;

# Exact Analytical Solution
te = np.arange(0, t ,h);
N = len(te);
w = (k / m) ** 0.5;
x_exact = x0 * np.cos(w * te);
v_exact = -x0 * w * np.sin(w * te);

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

def f1 (t, x, v):
    x = v
    return x
def f2 (t, x, v):
    v = -(k / m) * x
    return v

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

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

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

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

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

Может ли кто-нибудь помочь мне понять, как я могу создать этот единственный вектор, имеющий 2 измерения, и как исправить мой код, пожалуйста?


person C.L    schedule 28.09.2020    source источник
comment
Я обсуждал это преобразование в stackoverflow.com/a/53650879/3088138, см. stackoverflow.com/questions/35071393/ Grunge-kutta-code, чтобы узнать о некоторых подводных камнях Python, которые могут произойти.   -  person Lutz Lehmann    schedule 28.09.2020


Ответы (2)


Вы можете использовать функцию np.array (), вот пример того, что вы пытаетесь сделать:

x = np.array([[0, 0], [0, 1], [1, 0], [1, 1]])
person mriad    schedule 28.09.2020

Неуверенный в ваших точных ожиданиях относительно того, чего вы хотите, кроме двух списков внутри одного списка. Хотя я надеюсь, что эта ссылка поможет решить вашу проблему. https://www.tutorialspoint.com/python_data_structure/python_2darray.htm?

person Sean Morgan    schedule 28.09.2020