Несколько графиков множественных ОД в одном графике с использованием Plotly

#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() это может привести к неожиданным ошибкам.