SymPy の出力から、以下に示すマトリックスを取得しました。これを 2D に統合する必要があります。現在、以下に示すように要素ごとに実行しています。この方法は機能しますが、実際のケースでは( と の両方sympy.mpmath.quad
で)遅すぎます (と その関数ははるかに大きくなります (以下の編集を参照)。scipy.integrate.dblquad
A
from sympy import Matrix, sin, cos
import sympy
import scipy
sympy.var( 'x, t' )
A = Matrix([[(sin(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*cos(t)*x)*cos(3-0.1*x)*cos(t)],
[(cos(2-0.1*x)*sin(t)*x+sin(2-0.1*x)*cos(t)*x)*sin(3-0.1*x)*cos(t)],
[(cos(2-0.1*x)*sin(t)*x+cos(2-0.1*x)*sin(t)*x)*sin(3-0.1*x)*sin(t)]])
# integration intervals
x1,x2,t1,t2 = (30, 75, 0, 2*scipy.pi)
# element-wise integration
from sympy.utilities import lambdify
from sympy.mpmath import quad
from scipy.integrate import dblquad
A_int1 = scipy.zeros( A.shape, dtype=float )
A_int2 = scipy.zeros( A.shape, dtype=float )
for (i,j), expr in scipy.ndenumerate(A):
tmp = lambdify( (x,t), expr, 'math' )
A_int1[i,j] = quad( tmp, (x1, x2), (t1, t2) )
# or (in scipy)
A_int2[i,j] = dblquad( tmp, t1, t2, lambda x:x1, lambda x:x2 )[0]
私はそれを一発でやろうと考えていましたが、これが正しいかどうかはわかりません:
A_eval = lambdify( (x,t), A, 'math' )
A_int1 = sympy.quad( A_eval, (x1, x2), (t1, t2)
# or (in scipy)
A_int2 = scipy.integrate.dblquad( A_eval, t1, t2, lambda x: x1, lambda x: x2 )[0]
編集: 実際のケースは、このリンクで利用できるようになりました。解凍して実行するだけshadmehri_2012.py
です (この例の著者は、Shadmehri et al. 2012から取得したものです)。私は、次のことができる人のために 50 のバウンティを開始しました。
- 提案された質問よりもかなり速くする
- いくつかの用語
m=15
やn=15
コードでもメモリエラーを発生させることなく実行できます)、32ビットまで管理しm=7
ましn=7
た
現在のタイミングを以下に要約できます (m=3 および n=3 で測定)。そこから、数値積分がボトルネックであることがわかります。
試行関数の構築 = 0%
微分方程式の評価 = 2%
k1 のラム化 = 22%
k1 の統合 = 74%
k2 のラム化と統合 = 2%
固有値の抽出 = 0%
関連する質問: lambdify について