Решение ODE 2-го порядка, затем создание графиков.Размер возвращаемого массива не соответствует тому, что мне нужно - PullRequest
0 голосов
/ 29 декабря 2018

Извините, что беспокою, но я застрял на вопрос Uni по ODE 2-го порядка.

У меня есть:

def function(init, time, k):
    xt = init[0]
    yt = init[1]
    dotxt = init[2]
    dotyt = init[3]
    dxdt = xt + 2*init[3]
    dydt = yt - 2*init[2]
    return np.array([xt, dotxt, dxdt, yt, dotyt, dydt])

init = [xt, yt, dxdt, dydt] #(but the initial conditions, so 0, 0.2, bla, bla.)
time = np.linspace(0, 10, 500)
k = 0.2131

ans = odeint(function, init, time, args=(k, ))
plt.plot(time, ans[0])

Мне дали много заданий, но первое, что яЯ застрял на производит график времени против значений х.

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

Заранее спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

scipy.integrate.odeint ожидает, что init соответствует измерению возвращаемого объекта. (см. Пример) .Рассмотрим код

import matplotlib.pyplot as plt
import numpy as np
from scipy.integrate import odeint
def function(init, time, k):
    xt = init[0]
    yt = init[1]
    dotxt = init[2]
    dotyt = init[3]
    dxdt = xt + 2*init[3]
    dydt = yt - 2*init[2]
    return np.array([xt, dotxt, dxdt, yt, dotyt, dydt])

init = [0, 0.2, 0.1, 0.1, 0.0, 0.0] # you need 6 elements, so [0, 0.2, bla, bla, bla, bla]
time = np.linspace(0, 10, 500)
k = 0.2131

ans = odeint(function, init, time, args=(k, ))
plt.plot(time, ans[:, 0])
plt.plot(time, ans[:, 1])
plt.plot(time, ans[:, 2])
plt.plot(time, ans[:, 3])
plt.plot(time, ans[:, 4])
plt.plot(time, ans[:, 5])

, который будет отображать каждый из 6 столбцов относительно временного массива.Возможно, это не совсем правильно в отношении того, что вы пытаетесь сделать (возможно, необходимо изменить функцию ODE), но это устраняет проблему, о которой вы спрашивали.График для демонстрации,

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...