質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

1495閲覧

python ライブラリ odeを高速化するためにNumbaの使い方について

NR4200

総合スコア41

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/07/27 07:52

編集2020/07/27 11:21

前提・実現したいこと

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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tenkoh

2020/07/27 11:04

例として示されている関数をもう少し具体化頂けると他の案も含めて回答しやすいかと思います。 numba.jitを使われたいとの意図を察するに for文で実行せざるを得ない処理の高速化がモチベーションなのかと推察しますが、例の関数がそのような形式になっていないため。
NR4200

2020/07/27 11:26

tenkohさんへ ご意見をくださりありがとうございます. 質問を修正し,そこにも記述していますが,numbaを使いたいところは,一階微分方程式を解くための積分器であるodeと一緒に使いたいと考えています. 例の関数もodeを使った関数に変更しました.
NR4200

2020/07/27 11:27

質問内容がわかりにくいと思いますが,よろしくお願いします.
guest

回答1

0

ベストアンサー

経験上、scipy等のモジュールとnumba.jitを組み合わせると、型推定に失敗し、記載いただいたようなエラーが発生します。(逆に、成功するケースは標準モジュールやNumpyとの組み合わせぐらいの認識です)

代替案ですが、ScipyではなくSympyを使ってみてはどうでしょうか。

python

1import sympy as sym 2 3x = sym.Symbol('x') 4f = sym.Function('f') 5 6# 常微分方程式 f'(x) = -f(x) を解く 7# f'(x) + f(x) = 0 と変形して下記のとおりに解く 8eq = sym.Eq(f(x).diff(x,1) + f(x)) 9ans = sym.dsolve(eq) 10print(ans) 11# 出力: Eq(f(x), C1*exp(-x))

投稿2020/07/27 12:49

tenkoh

総合スコア51

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

NR4200

2020/07/27 23:37

代替え案まで考えてくださりありがとうございます. odeではnumbaが使えないらしいですが,odeintなら使えるらしいので,そちらも含めて検討します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問