前提・実現したいこと
python ライブラリodeの引数atolの使い方,何のためにいるのかがわかりません
下記プログラムのように
ode.set_integratorの引数atolをatol=1.e-9とすると警告が出ますが,
atol=1.e-2にすると警告は出ません
発生している問題・エラーメッセージ
python
1C:\Users\N\AppData\Local\Programs\Python\Python37\lib\site-packages\scipy\integrate\_ode.py:1177: UserWarning: dopri5: larger nsteps is needed 2 self.messages.get(istate, unexpected_istate_msg)))
該当のソースコード
python
1import matplotlib.pyplot as plt 2import scipy.integrate as sp 3import numpy as np 4import random 5 6 7count = 0 8ms = 0.26 9mc = 0.85 10k = 177 11g = 9.8 12m = mc + (1/3)*ms 13 14def d(t): 15 16 if t < 20: 17 return 0 18 elif t >= 20: 19 return 5*np.sin(np.pi*t) 20def μ(x2): 21 if x2==0: 22 return 0.24 23 else: 24 return 0.11 25# SMC制御系 26def f(x1,x2): 27 return -(k/m)*x1-μ(x2)*g*np.sign(x2) 28 29def df(x2,x3): 30 return -(k/m)*x2-μ(x3)*g*np.sign(x3) 31 32def dd(t): 33 if t < 20: 34 return 0 35 elif t >= 20: 36 return 5*np.pi*np.cos(np.pi*t) 37 38 39def system(t, x):#, e_integ): 40 # 戻り値用のリスト 41 y = [0]*4 42 dx3 = x[0] - 0.02*np.sin(t) 43 dx1 = x[1] 44 dx2 = -(k/m)*x[0] -μ(x[1])*g*np.sign(x[1]) - (k/m)*(7* (x[0]-0.02*np.sin(t)) + 0.1*(x[1]-0.02*np.cos(t))+ 30*x[2]) + d(t) 45 dxu = 7*(x[1]-0.02*np.cos(t)) + 0.1*(x[2] + 0.02*np.sin(t)) + 30*(x[0]-0.02*np.sin(t)) 46 # 計算結果を返す 47 y[0] = dx1 48 y[1] = dx2 49 y[2] = dx3 50 y[3] = dxu 51 #y[3] = u 52 53 return y 54 55def simulation(x0, end, step): 56 x1 = [] 57 x2 = [] 58 t = [] 59 u = [] 60 61 ode = sp.ode(system) 62 ode.set_integrator('dopri5', method='bdf', atol=1.e-9) 63 ode.set_initial_value(x0, 0)#.set_f_params(e_integ) 64 t.append(0) 65 x1.append(x0[0]) 66 x2.append(x0[1]) 67 u.append(0) 68 while ode.successful() and ode.t < end - step: 69 ode.integrate(ode.t + step) 70 t.append(ode.t) 71 x1.append(ode.y[0]) 72 x2.append(ode.y[1]) 73 u.append(ode.y[3]) 74 return x1, x2, u, t 75 76# パラメータ 77x0 = [0.0, 0.0, 0.0, 0.0] # 初期値 78end = 40 # シミュレーション時間 79step = 0.01 # 時間の刻み幅 80 81# シミュレーション 82x1, x2, u, t = simulation(x0, end, step) 83
試したこと
pythonのホームページ?で
odeの引数について調べましたがatolについては出てこず,
odeintの方でatolについては出てきました.
以下のように書いていましたが,意味が分かりませんでした.
rtol, atol:float, optional
The input parameters rtol and atol determine the error control performed by the solver. The solver will control the vector, e, of estimated local errors in y, according to an inequality of the form max-norm of (e / ewt) <= 1, where ewt is a vector of positive error weights computed as ewt = rtol * abs(y) + atol. rtol and atol can be either vectors the same length as y or scalars. Defaults to 1.49012e-8.
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。