2016-09-30 5 views
0

Мне нужно просто прочитать Using adaptive step sizes with scipy.integrate.ode и принятое решение этой проблемы и даже воспроизвести результаты путем копирования и вставки в моем интерпретаторе Python.Использование адаптивного шага времени для scipy.integrate.ode при решении систем ODE

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

Мой код выглядит следующим образом:

from scipy.integrate import ode 
from matplotlib.pyplot import plot, show 

initials = [1,1,1,1,1] 
integration_range = (0, 100) 

f = lambda t,y: [1.0*y[0]*y[1], -1.0*y[0]*y[1], 1.0*y[2]*y[3] - 1.0*y[2], -1.0*y[2]*y[3], 1.0*y[2], ] 

y_solutions = [] 
t_solutions = [] 
def solution_getter(t,y): 
    t_solutions.append(t) 
    y_solutions.append(y) 


backend = "dopri5" 
ode_solver = ode(f).set_integrator(backend) 
ode_solver.set_solout(solution_getter) 
ode_solver.set_initial_value(y=initials, t=0) 

ode_solver.integrate(integration_range[1]) 

plot(t_solutions,y_solutions) 
show() 

И сюжет он дает: enter image description here

ответ

1

В строке

y_solutions.append(y) 

вы думаете, что вы добавления текущего вектора. Что происходит, так это то, что вы добавляете ссылку на объект на y. Поскольку, по-видимому, интегратор повторно использует вектор y во время цикла интеграции, вы всегда добавляете одну и ту же ссылку на объект. Таким образом, в конце каждая позиция списка заполняется той же ссылкой, указывающей на вектор последнего состояния y.

Короче говоря: заменить

y_solutions.append(y.copy()) 

и все в порядке.

+0

спасибо! Ссылки по-прежнему удается иногда путать меня ... Кстати, как вы пришли к этому решению? – Ezbob

+1

Отладка. Решение q'n'd заключается в том, чтобы добавлять утверждения print внутри решения_getter и перед графикой, чтобы увидеть, каковы фактические данные. – LutzL