#python #scipy #plotly #ode #odeint
#python #scipy #plotly #оду #odeint
Вопрос:
Я пытаюсь включить два или более двух графиков дифференциальных уравнений (пакет Scipy.integrate ODEINT), используя Plotly, но все же он отображает только начальные точки, а не целые графики. [Вот соответствующее выходное изображение, я пытаюсь воспроизвести графики, сделанные в Matplot, что довольно тривиально, вот весь код
import numpy as np
from scipy.integrate import odeint
#import plotly.express as px
from plotly.offline import plot
import plotly.graph_objects as G
# initial condition
y0 = 5.0
# time points
t = np.arange(0,20,1)
# function that returns dy/dt
def model(y,t,k):
dydt = -k * y
return dydt
# solve ODEs
k = 0.1
y1 = odeint(model,y0,t,args=(k,))
k = 0.2
y2 = odeint(model,y0,t,args=(k,))
k = 0.5
y3 = odeint(model,y0,t,args=(k,))
fig = G.Figure()
#rows, cols = (3, 20)
#y = [[0 for i in range(cols)] for j in range(rows)]
for r in [y1, y2, y3]:
fig.add_trace(G.Scatter(
x=t,
y=r
)
)
fig.update_layout(title='Sample Graph',
xaxis_title='time',
yaxis_title='y',
template='plotly_white')
# Display figure
fig.show()
plot(fig)
Комментарии:
1. Я уже использовал общие экспоненциальные (математические) выражения, и этот код отлично работает для них, но я сталкиваюсь с проблемой только при выполнении вызова функции, например, этого.
Ответ №1:
Если вы сгладите три массива ( y1
, y2
, y3
), ваш код будет работать как есть:
import numpy as np
from scipy.integrate import odeint
from plotly.offline import plot
import plotly.graph_objects as G
# initial condition
y0 = 5.0
# time points
t = np.arange(0, 20, 1)
# function that returns dy/dt
def model(y, t, k):
dydt = -k * y
return dydt
# solve ODEs
k = 0.1
y1 = odeint(model, y0, t, args=(k,)).flatten()
k = 0.2
y2 = odeint(model, y0, t, args=(k,)).flatten()
k = 0.5
y3 = odeint(model, y0, t, args=(k,)).flatten()
fig = G.Figure()
for r in [y1, y2, y3]:
fig.add_trace(G.Scatter(
x=t,
y=r
))
fig.update_layout(title='Sample Graph',
xaxis_title='time',
yaxis_title='y',
template='plotly_white')
# display figure
fig.show()
Комментарии:
1. @user14295847 : Или явно выберите компонент решения,
y1 = y1[:,0]
. Если вектор состояния имеет более одного компонента,.flatten()
это может привести к неожиданным ошибкам.