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

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

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

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

Q&A

解決済

1回答

1695閲覧

【Python積分】integrate.dblquad()の計算速度が遅い問題を解決したい

mag0123

総合スコア3

Python

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

0グッド

0クリップ

投稿2021/09/22 00:28

編集2021/09/22 00:32

前提・実現したいこと

Pythonで回路設計ソフトを作成中、integrate.dblquad()を使用した積分計算の部分で速度がとても遅くなる問題が生じました。この問題を解決したいです。


発生している問題・エラーメッセージ

Python

1# 積分2 2val, err = integrate.dblquad(f_integ, r_in, r_out, lambda phi: (-1/2)*np.pi, lambda phi: (1/2)*np.pi)

下記該当のソースコードの中で、上記のintegrate.dblquad()を使用している1行が要因で速度が低下してしまっています。


該当のソースコード

Python

1 #変数 2 delta_in = (0.5E-5)*1E-3#(m) 3 delta_out = ((OD+2*Case2)*math.pi*0.5-float(wire[1])*N)/N*1E-3#(m) 4 delta_tc = 0.6E-3#(m) 5 delta_ins_core = Case2*1E-3#(m) 6 Do = float(wire[1])*1E-3#(m) 7 Di = float(wire[0])*1E-3#(m) 8 eps_0 = 8.854187E-12# 9 eps_r = 4.3# 10 eps_core = 2.7# 11 h_core = HT*1E-3#(m) 12 dia_in_core = ID*1E-3#(m) 13 dia_out_core = OD*1E-3#(m) 14 15 #変数の一例 16 #delta_in: 5e-09 17 #delta_out: 0.0015723923196620563 18 #delta_tc: 0.0006 19 #delta_ins_core: 0.002 20 #Do: 0.001712 21 #Di: 0.0016 22 #eps_0: 8.854187e-12 23 #eps_r: 4.3 24 #eps_core: 2.7 25 #h_core: 0.011 26 #dia_in_core: 0.013000000000000001 27 #dia_out_core: 0.019 28 29 if (delta_out<=0): 30 return(15) 31 32 r_in = (dia_in_core/2) - delta_tc - Do/2 33 r_out = (dia_out_core/2) + delta_tc + Do/2 34 # 積分1 35 y_in = lambda phi: np.sinc(phi/np.pi)/(delta_in+Do*(1-np.cos(phi))) 36 y_out = lambda phi: np.sinc(phi/np.pi)/(delta_out+Do*(1-np.cos(phi))) 37 integ_in = integrate.quad(y_in, (-1/2)*np.pi, (1/2)*np.pi) 38 integ_out = integrate.quad(y_out, (-1/2)*np.pi, (1/2)*np.pi) 39 L_T_in = h_core + delta_tc + Do 40 L_T_out = L_T_in 41 L_T = h_core*2+ (dia_out_core-dia_in_core) + Do 42 C_tt_air_in = (Do/2.0)*eps_0*L_T_in * integ_in[0] 43 C_tt_air_out = (Do/2.0)*eps_0*L_T_out * integ_out[0] 44 # 積分2 45 val = 0 46 err = 0 47 f_integ = 0 48 f_integ = lambda phi, r: np.sinc(phi/np.pi)/( ((delta_out-delta_in)/(r_out-r_in))*(r-r_in) + delta_in + Do*(1-np.cos(phi))) 49 val, err = integrate.dblquad(f_integ, r_in, r_out, lambda phi: (-1/2)*np.pi, lambda phi: (1/2)*np.pi) 50 C_tt_air_l = (Do/2.0)*eps_0 * val 51 C_tt_ins = (np.pi*eps_0*eps_r*L_T)/(2*np.log(Do/Di)) 52 C_tc_ins = (np.pi*eps_0*eps_r*L_T)/(np.log(Do/Di)) 53 C_tt_in = (C_tt_ins*C_tt_air_in)/(C_tt_ins+C_tt_air_in) 54 C_tt_out = (C_tt_ins*C_tt_air_out)/(C_tt_ins + C_tt_air_out) 55 C_tt_l = (C_tt_ins*C_tt_air_l)/(C_tt_ins + C_tt_air_l) 56 C_tt = C_tt_in + C_tt_out + 2*C_tt_l 57 # 積分3 58 y_tc_1 = lambda phi: 1/(((np.sinc(phi/np.pi))**(-1))*(delta_tc+(Do/2)*(1-np.cos(phi))) + delta_ins_core/eps_core) 59 integ_tc_1 = integrate.quad(y_tc_1, (-1/2)*np.pi, (1/2)*np.pi) 60 C_tc_in_1 = (eps_0*(Do/2)*L_T_in)*integ_tc_1[0] 61 C_tc_out_1 = (eps_0*(Do/2)*L_T_out)*integ_tc_1[0] 62 C_tc_l_1 = (eps_0*(Do/2)*(r_out-r_in))*integ_tc_1[0] 63 C_tc_in = (C_tc_ins*C_tc_in_1)/(C_tc_ins+C_tc_in_1) 64 C_tc_out = (C_tc_ins*C_tc_out_1)/(C_tc_ins+C_tc_out_1) 65 C_tc_l = (C_tc_ins*C_tc_l_1)/(C_tc_ins+C_tc_l_1) 66 C_tc = C_tc_in + C_tc_out + 2*C_tc_l 67 68 C1c = C2c = C3c = C4c = C5c = C6c = C7c = C_tc*1E12#0.516#C_tc*1E12 69 C12 = C23 = C34 = C45 = C56 = C67 = C_tt*1E12#1.124#C_tt*1E12 70 #2ターンの時 71 C2 = C12 + 1/((1/C1c)+(1/C2c)) 72 #3ターンの時 73 X12=1/(((1/C1c)*(1/C2c))/((1/C1c)+(1/C2c)+(1/C12))) 74 Y12=1/(((1/C1c)*(1/C12))/((1/C1c)+(1/C2c)+(1/C12))) 75 num1 = 1/((1/X12)+(1/C3c)) 76 num2 = 1/((1/Y12)+(1/C23)) 77 num3 = num1 + num2 78 C3 = 1/((1/num3)+(1/Y12)) 79 #4ターンの時 80 num4 = 1/((1/X12)+(1/X12)) 81 num5 = 1/((1/Y12)+(1/C23)+(1/Y12)) 82 num6 = num4 + num5 83 C4 = 1/((1/Y12)+(1/num6)+(1/Y12)) 84 #5ターンの時 85 num7 = 1/((1/X12)+(1/X12)) 86 num8 = 1/((1/Y12)+(1/C23)+(1/C34)+(1/Y12)) 87 num9 = num7 + num8 88 C5 = 1/((1/Y12)+(1/num9)+(1/Y12)) 89 #6ターンの時 90 num10 = 1/((1/X12)+(1/X12)) 91 num11 = 1/((1/Y12)+(1/C23)+(1/Y12)+(1/Y12)+(1/C45)+(1/Y12)) 92 num12 = num10 + num11 93 C6 = 1/((1/Y12)+(1/num12)+(1/Y12)) 94 #7ターンの時 95 X35=1/(((1/C3c)*(1/C5c))/((1/C3c)+(1/C5c)+((1/C34)+(1/C45)))) 96 Y35=1/(((1/C3c)*((1/C34)+(1/C45)))/((1/C3c)+(1/C5c)+((1/C34)+(1/C45)))) 97 num13 = 1/((1/X12)+(1/X12)) 98 num14 = 1/((1/Y12)+(1/C23)+(1/Y35)+(1/Y35)+(1/C56)+(1/Y12)) 99 num15 = num13 + num14 100 C7 = 1/((1/Y12)+(1/num15)+(1/Y12)) 101 #8ターンの時 102 X23=1/(((1/X12)*(1/X12))/((1/X12)+(1/X12)+((1/Y12)+(1/C23)+(1/Y12)))) 103 Y23=1/(((1/X12)*((1/Y12)+(1/C23)+(1/Y12)))/((1/X12)+(1/X12)+((1/Y12)+(1/C23)+(1/Y2)))) 104 num16 = 1/((1/X23)+(1/X23)) 105 num17 = 1/((1/Y23)+(1/Y12)+(1/C45)+(1/Y12)+(1/Y23)) 106 num18 = num16 + num17 107 C8 = 1/((1/Y12)+(1/Y23)+(1/num18)+(1/Y23)+(1/Y12)) 108 #9ターンの時 109 X14=1/(((1/X12)*(1/X12))/((1/X12)+(1/X12)+((1/Y12)+(1/C23)+(1/Y12)))) 110 Y14=1/(((1/X12)*((1/Y12)+(1/C23)+(1/Y12)))/((1/X12)+(1/X12)+((1/Y12)+(1/C23)+(1/Y2)))) 111 num19 = 1/((1/X14)+(1/X14)) 112 num20 = 1/((1/Y14)+(1/Y12)+(1/C45)+(1/C56)+(1/Y12)+(1/Y14)) 113 num21 = num19 + num20 114 C9 = 1/((1/Y12)+(1/Y14)+(1/num21)+(1/Y14)+(1/Y12)) 115 #10ターンの時 116 num22 = 1/((1/X14)+(1/X14)) 117 num23 = 1/((1/Y14)+(1/Y12)+(1/C45)+(1/Y12)+(1/Y12)+(1/C67)+(1/Y12)+(1/Y14)) 118 num24 = num22 + num23 119 C10 = 1/((1/Y12)+(1/Y14)+(1/num24)+(1/Y14)+(1/Y12)) 120 121 #2ターンの時 122 if(N==2): 123 Cs = C2 124 elif(N==3): 125 Cs = C3 126 elif(N==4): 127 Cs = C4 128 elif(N==5): 129 Cs = C5 130 elif(N==6): 131 Cs = C6 132 elif(N==7): 133 Cs = C7 134 elif(N==8): 135 Cs = C8 136 elif(N==9): 137 Cs = C9 138 elif(N>=10): 139 Cs = C10

試したこと

該当のソースコード中で問題の要因となる箇所は特定することができましたが、改善方法がわからずこちらで質問をさせていただきました。該当のソースコードに記載した部分は、コード全体の一部分にあたり、ループ計算に入っているので、速度が遅いことは大きな問題になっています。

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

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

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

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

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

guest

回答1

0

ベストアンサー

高速化のためには以下の方法があります。

1.速いコンピュータに買い換える

予算次第です。高クロックCPUのハードを選びましょう。

2.高速な計算ライブラリを利用す。

Intel CPUを使っているなら、MKLに変更すると高速になります。
numpy で MKL を使うをお読みください。

3.multiprocessingを使って並列化する

multi-coreのCPUを使っている場合には並列化すると性能が上がる場合があります。
並列化できるかどうかは、対象分野やアルゴリズムによります。
問題によってはかえって遅くなることもあります。
下手な並列化を行うと結果が間違うことがありますので、正しく並列化するためにはかなりの勉強が必要です。

投稿2021/09/22 09:33

ppaul

総合スコア24666

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

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

mag0123

2021/09/23 01:06

ppaul様 高速化についての方法をご教授いただきありがとうございます。 では該当のソースコードは、integrate.dblquad()の部分の記述の仕方が適切でないために遅くなっているわけではないと考えてよいでしょうか?該当のソースコードを実行すると速度は遅いもののエラーは出ずに最後まで行くのが現状です。 お教え頂ければ幸いです。
ppaul

2021/09/23 11:54

はい、integrate.dblquad()の部分の記述の仕方の問題ではありません。
mag0123

2021/09/27 00:44 編集

ppaul様 ありがとうございます。記述の部分に不安があったので教えていただき大変助かりました。 高速化の方法について、まずは2番の方法から試していきます。 お忙しいところご回答いただき、誠にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問