前提・実現したいこと
pythonで描いたコードの処理時間を短くしようとして考えています.
一階微分方程式を解くときに処理時間がかかっているので,odeでの積分時にnumbaを使おうと考えています.
そのため試しに簡単なコードで使い方を理解しようと考えたのですが,エラーが出て動かすことができません.
またnumba以外に高速化できるのものがあれば教えてください.(内包表記とラムダ式などはすでにやっています.)
発生している問題・エラーメッセージ
PS C:\Users\NA\Desktop\N\A> python try_fast.py Traceback (most recent call last): File "try_fast.py", line 56, in <module> t_f= simulationf(x0, end, step) File "C:\Users\NA\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\core\dispatcher.py", line 415, in _compile_for_args error_rewrite(e, 'typing') File "C:\Users\NA\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\core\dispatcher.py", line 358, in error_rewrite reraise(type(e), e, None) File "C:\Users\NA\AppData\Local\Programs\Python\Python37\lib\site-packages\numba\core\utils.py", line 80, in reraise raise value.with_traceback(tb) numba.core.errors.TypingError: Failed in nopython mode pipeline (step: nopython frontend) Untyped global name 'systemf': cannot determine Numba type of <class 'function'> File "try_fast.py", line 39: def simulationf(x0, end, step): <source elided> ode = sp.ode(systemf) ^
該当のソースコード
python
1import numpy as np 2from numba import jit, f8,f4 3import scipy.integrate as sp 4 5def systemf(t, x): 6 7 # 戻り値用のリスト 8 y = [0]*4 9 # 常微分方程式(状態方程式)の計算 10 #x[0] = x1, x[1] = x2, x[2] = y1, x[3] = y2 11 12 dx1 = -x[2] 13 dx2 = -x[3] 14 dy1 = x[0] 15 dy2 = x[1] 16 17 18 # 計算結果を返す 19 y[0] = dx1 20 y[1] = dx2 21 y[2] = dy1 22 y[3] = dy2 23 return y 24 25@jit(nopython=True) 26def simulationf(x0, end, step): 27 28 t_f = [] 29 30 ode = sp.ode(systemf) 31 ode.set_integrator('dopri5', method='bdf', atol=1.e-4)#nsteps=1000, 32 ode.set_initial_value(x0, 0.0) 33 34 #初期値の設定 35 t_f.append(0.0)#時間 36 37 while ode.successful() and ode.t < end - step: 38 ode.integrate(ode.t + step) 39 40 #出力 41 t_f.append(ode.t)#時間 42 43 return t_f 44x0 = [0,0,0,0] 45end = 3 46step = 0.01 47t_f= simulationf(x0, end, step) 48print(t_f)
試したこと
調べたところ@jitから@jit(nopython=True)にすることで動くと書いてある記事がありましたが,動きませんでした
補足情報(FW/ツールのバージョンなど)
(使おうと思っている関数の戻り値がリストのため,戻り値をリストにしています)
numbaとnumpyのバージョンは以下のもので,実行ファイルの名前は"try_fast.py"です.
numba 0.50.1
numpy 1.18.5+mkl
回答1件
あなたの回答
tips
プレビュー