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])
前進差分法により離散化をしたときの電場のグラフです.

このように中心差分法の時も描かれないといけませんが, 上記に貼った通り描かれていないのが現状です,
pythonのコードの一番最初の行のすぐ上に
```python
だけの行を追加してください
また、pythonのコードの一番最後の行のすぐ下に
```
だけの行を追加してください
現状、コードがとても読み辛いです
何が問題なのか伝わりません。
どのような結果になるべきで、現在の結果は求める結果とどのように違うのかを説明してください。
pythonでしかコードを書いていないんですけど.....
電場のようにベクトル図が描かれないといけないのですが, ベクトルが描かれていないのでここの点について投稿をしました.
現状では、pythonコードのインデントが無くなっているので、コードが解読できません
質問を編集して、私の最初のコメントに書いたように、
```python
(pythonのコード全部)
```
としてくれたら、pythonコードのインデントが他人にも分かり、コードをちゃんと読むことができます
しました!
''''''''''''''''''''''''''''''''''''''''''''''''''Python
と書いてはダメです
```python
と書いてください
同様に
''''''''''''''''''''''''''''''''''''''''''''''''''
と書いてはダメです
```
と書いてください
そう書かないと、他人が質問を見た時にpythonコードのインデントが再現されず、コードの詳細を解読するのが難しいのです
そうなんですね!
python3ヶ月目なので全然知りませんでした!
’’’Python
ではないです
```python
です
’’’
も違います
```
です
自分で手入力するのではなく、この私のコメントからコピペしてください
なお、この書き方は、teratailで質問のコードを他人が読みやすくするためのルールです
実行させる実際のpythonコードには、そんなもの書かないでくださいね
あくまでも、teratailにコードを書く場合だけ、それを追加するのです
すみません. 申し訳ありません. 心からお詫び申し上げます.
うまくいってる前進差分のコードとの違いは、下記だけですか?
Ex[i, j] = -(phi[i + 1, j] - phi[i - 1, j]) / 2*delta_Lx
Ey[i, j] = -(phi[i, j + 1] - phi[i, j - 1]) / 2*delta_Ly
前進差分は
Ex[i, j] = -(phi[i + 1, j] - phi[i, j]) / delta_Lx
Ey[i, j] = -(phi[i, j + 1] - phi[i, j]) / delta_Ly
となり, 中心差分との違いはそのコードのみです.
後退差分もうまくいっていて
Ex[i, j] = -(phi[i, j] - phi[i - 1, j]) / delta_Lx
Ey[i, j] = -(phi[i, j] - phi[i, j - 1]) / delta_Ly
となります. 参考までに...
中心差分のみうまく行きません.
回答1件
あなたの回答
tips
プレビュー
