前提・実現したいこと
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
試したこと
該当のソースコード中で問題の要因となる箇所は特定することができましたが、改善方法がわからずこちらで質問をさせていただきました。該当のソースコードに記載した部分は、コード全体の一部分にあたり、ループ計算に入っているので、速度が遅いことは大きな問題になっています。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/09/23 01:06
2021/09/23 11:54
2021/09/27 00:44 編集