google colab環境下でPythonを用いてポアソン方程式で電位を求めてから, その結果を用いて電場の図を描いています.
E = -∇φ
を離散化してベクトル場を表示しようとしたら, 以下のようになりました.
発生している問題・エラーメッセージ
該当のソースコード
python
1Ex = np.zeros([Lx, Ly]) 2Ey = np.zeros([Lx, Ly]) 3 4for i in range(Lx): 5 for j in range(Ly): 6 Ex[i, j] = -(phi[i + 1, j] - phi[i - 1, j]) / 2*delta_Lx 7 Ey[i, j] = -(phi[i, j + 1] - phi[i, j - 1]) / 2*delta_Ly 8 9fig = plt.figure(figsize=(4, 4)) 10 11X, Y = np.meshgrid(np.arange(0, Lx, 1), np.arange(0, Ly, 1)) # メッシュ生成 12plt.quiver(X, Y, Ex, Ey, color = 'red', angles = 'xy', 13 scale_units = 'xy', scale = 40, 14 label = "Solution of the Poisson equation for electrostatic field") # ベクトル場をプロット 15 16plt.xlim([0, Lx]) # 描くXの範囲 17plt.ylim([0, Ly]) # 描くYの範囲
試したこと
delta_Lxとdelta_Lyを逆にした.
補足情報(FW/ツールのバージョンなど)
python
1delta_Lx = 0.01 # グリッドx幅 2delta_Ly = 0.01 # グリッドy幅 3LLx = 1 4LLy = 1 5 6Lx = int(LLx / delta_Lx) 7Ly = int(LLy / delta_Ly) 8 9V = 5.0 # 電圧 10convegence_criterion = 10**-5 11 12phi = np.zeros([Lx+1, Ly+1]) 13phi_Bound = np.zeros([Lx+1, Ly+1]) 14phi_Bound[0, :] = V # 全ての行の0列目を取得
電荷密度の設定
python
1eps0 = 1 2charge = np.zeros([Lx+1, Ly+1]) 3c = 1500 4 5CC = int(Lx / 4) 6CC2 = int(Ly / 2) 7 8for i in range(CC, CC2 + 1): 9 for j in range(CC, CC2 + 1): 10 charge[i, j] = c 11 12# for SOR method 13’’’Python 14aa_recta = 0.5 * (np.cos(np.pi / Lx) + np.cos(np.pi / Ly)) 15omega_SOR_recta = 2 / (1 + np.sqrt(1 - aa_recta ** 2)) # SOR法における加速パラメータ 16print("omega_SOR_rect=", omega_SOR_recta)
メイン
python
1delta = 1.0 2n_iter = 0 3conv_check = [] 4while delta > convegence_criterion: 5 phi_in = phi.copy() 6 if n_iter % 100 == 0: # 収束状況のモニタリング 7 print("iteration No =", n_iter, "delta =", delta) 8 conv_check.append([n_iter, delta]) 9 for i in range(Lx + 1): 10 for j in range(Ly + 1): 11 if i == 0 or i == Lx or j == 0 or j == Ly: 12 phi[i, j] = phi_Bound[i, j] # 境界条件 13 else: 14 phi[i, j] = phi[i, j] + omega_SOR_recta * ((phi[i + 1, j] + 15 phi[i - 1, j] + 16 phi[i, j + 1] + 17 phi[i, j - 1]) / 4 18 -phi[i, j] + (delta_Lx * delta_Ly / (4 * eps0)) 19 * charge[i, j]) # SOR = ガウス-ザイデル + OR 20 delta = np.max(abs(phi - phi_in)) 21 22 n_iter += 1 23 24 im = plt.imshow(phi, cmap = 'jet') 25 anim.append([im])
前進差分法により離散化をしたときの電場のグラフです.
このように中心差分法の時も描かれないといけませんが, 上記に貼った通り描かれていないのが現状です,
回答1件
あなたの回答
tips
プレビュー