2017-08-17 15 views
0

私は、外部決定論的入力(コントロール)と確率的成分を持つ常微分方程式のシステムを持っています。どのように私は安全に(良いコードスタイルを実行する)これらの追加の入力引数を式の関数に最初の状態以外にtf.contrib.integrate.odeint()まで渡すことができますか?そうする方法があれば。または、それらを外側のスコープで定義し、方程式関数からそれらを参照することはこれまでのところそれを行う唯一の方法ですか?TensorFlowのodeint関数に追加の入力引数を渡すにはどうすればいいですか?

+0

非常に単純化された問題の例を作成し、それをどのように解決しようとしましたか? 'x '= Ax + Bu + Cz'のようなもので、' u'はコントロール、 'z'はノイズです。 – LutzL

答えて

0

odeintソルバーを使用してHindmarsh-Roseモデルをシミュレートしようとすると、同じ問題が発生します。私は方程式に電流を注入したいと思うし、それを行う方法を知らない。 基本的な例の後に:

import numpy as np 
import tensorflow as tf 
import matplotlib.pyplot as plt 
from mpl_toolkits.mplot3d import Axes3D 

## Model parameters 
# v' = u - a.v^3 + b.v^2 + I -z 
# u' = c - d.v^2 -u 
# z' = epsilon_z.(s.(v-v0)-z 

#parameters for v and u terms 
a = 1.0 
b = 3.0 
c = -3.0 
d = 5.0 
v0 = -1.4 
s = 4.0 
epsilon_z = 0.002 

# init tensions 
v_init = -3.0 
u_init = 0.0 
z_init = +0.9 

#injected current that is currently fixed 
Id = 5 

# What I would like to do : 
# def I(t): 
# if 0.0 <= t < 300.0: 
#  return 0.0 
# elif 300.0 <= t < 1700.0: 
#  return Iech 
# return 0.0 

def HR_equation(state, t): 
    v, u, z = tf.unstack(state)  
    dv = -a * v*v*v + b * v*v + u - z + I 
    du = -d * v*v - u + c 
    dz = epsilon_z * (s*(v - v0)- z 
    return tf.stack([dv, du, dz]) 

init_state = tf.constant([v_init, u_init, z_init], dtype=tf.float64) 

t = np.linspace(0, 2000, num=5000) 
tensor_state, tensor_info = tf.contrib.integrate.odeint(HR_equation,   
init_state, t, full_output=True) 

sess = tf.Session() 
state, info = sess.run([tensor_state, tensor_info]) 
v, u, z = state.T 
plt.plot(v, u) 
関連する問題