Решение и построение ODE с зависимыми параметрами - PullRequest
0 голосов
/ 28 апреля 2018

Я работаю над небольшим кодом, где у меня есть следующая система уравнений здесь . Проблема в том, что я бы очень хотел решить для нескольких значений k, а также иметь график фазовой плоскости / колчана для каждого значения k. Может кто-нибудь, пожалуйста, помогите мне? Вот что у меня пока есть для решателя:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def model(X, t):
    x = X[0]
    y = X[1]
    dxdt = k*x - y
    dydt = x + y
    return [dxdt, dydt]
#Initial state 
X0 = [1,1]

#Time
t = np.linspace(0,10)

X = odeint(model, X0, t)

И это то, что я до сих пор готовил для печати:

x = X[:,0]
y = X[:,1]

plt.plot(x,y)

Обратите внимание, я не пытаюсь просто решить систему! Я пытаюсь решить это с несколькими значениями, изменяющими (k) и строящими получающиеся уравнения.

Ответы [ 2 ]

0 голосов
/ 28 апреля 2018

С некоторыми вычислительными усилиями вы можете использовать

xvalues, yvalues = np.meshgrid(np.arange(-2, 2, 0.02), np.arange(-2, 2, 0.02))
Ks = np.linspace(-1, 1, 12)

plt.subplots_adjust(hspace=0.4,wspace=0.4)
for j,kix in enumerate(Ks):
    xdot, ydot = model([xvalues,yvalues],0 , kix)
    plt.subplot(3,4,j+1)
    plt.streamplot(xvalues, yvalues, xdot, ydot, density=0.5)
    plt.title("k=%.2f"%kix)

plt.show()

чтобы получить

enter image description here

0 голосов
/ 28 апреля 2018

Вы должны выполнить итерацию по k и передать значение в качестве дополнительного параметра:

import numpy as np
import matplotlib.pyplot as plt
from scipy.integrate import odeint

def model(X, t, k):
    x = X[0]
    y = X[1]
    dxdt = k*x - y
    dydt = x + y
    return [dxdt, dydt]
#Initial state 
X0 = [1,1]

#Time
t = np.linspace(0,10)
Ks = np.linspace(-1, 1, 10)

for kix in Ks:
    X = odeint(model, X0, t, args=(kix,))
    x = X[:,0]
    y = X[:,1]
    plt.plot(x,y)
plt.show()

enter image description here

...