LoginSignup
2
1

More than 5 years have passed since last update.

BokehでFitzhug-Nagumo方程式をリアルタイムプロット

Last updated at Posted at 2018-09-06

BokehでFitzhug-Nagumo方程式をリアルタイムプロット

以下の二つの記事の合わせ技です
FitzHugh-Nagumo方程式をオイラー法で数値計算する
https://qiita.com/mozi/items/8c09d27bc373d65dfd33
bekeh+pythonでリアルタイムプロット
https://qiita.com/mozi/items/ec7e9e1181f1778a95a5

bokeh_plot (2).png

コード全文

# myplot.py
from bokeh.plotting import figure, curdoc
from bokeh.driving import linear
import numpy as np
import random
from numpy.random import rand

p = figure(plot_width=400, plot_height=400)
p.x_range.follow="end"
p.x_range.follow_interval = 40
p.x_range.range_padding=0

r1 = p.line([], [], color="firebrick", line_width=2)
r2 = p.line([], [], color="navy", line_width=2)

ds1 = r1.data_source
ds2 = r2.data_source

#initial condition
dt=0.01
a=0.2
b=0.5
c=1.0

@linear()
def update(step):
    X=0
    Y=0
    #即席なのでforで回してしまいました、、、
    for i in range(step):
        X += (c*(X-X**3-Y))*dt
        Y += (X-b*Y+a)*dt
    ds1.data['x'].append(X)
    ds1.data['y'].append(Y)
    ds2.data['x'].append(X)
    ds2.data['y'].append(Y)
    ds1.trigger('data', ds1.data, ds1.data)
    ds2.trigger('data', ds2.data, ds2.data)

curdoc().add_root(p)

# Add a periodic callback to be run every 500 milliseconds
curdoc().add_periodic_callback(update, 1)

課題

ここの部分

    X=0
    Y=0
    #即席なのでforで回してしまいました、、、
    for i in range(step):
        X += (c*(X-X**3-Y))*dt
        Y += (X-b*Y+a)*dt

callbackを利用してリアルタイムプロットしているので、後半は非常に計算量が大きくなってしまいます
forループではなく計算結果を格納した配列の値をプロットしていくほうがいいですね

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1