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

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

新規登録して質問してみよう
ただいま回答率
85.48%
文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

Q&A

解決済

1回答

2158閲覧

中心差分法で電場ベクトルをシミュレーションする

nagi-kimura

総合スコア3

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

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

0グッド

0クリップ

投稿2021/01/15 04:19

編集2021/01/16 10:01

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])

前進差分法により離散化をしたときの電場のグラフです.
イメージ説明
このように中心差分法の時も描かれないといけませんが, 上記に貼った通り描かれていないのが現状です,

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

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

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

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

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

jbpb0

2021/01/15 12:33

pythonのコードの一番最初の行のすぐ上に ```python だけの行を追加してください また、pythonのコードの一番最後の行のすぐ下に ``` だけの行を追加してください 現状、コードがとても読み辛いです
ikadzuchi

2021/01/16 09:15

何が問題なのか伝わりません。 どのような結果になるべきで、現在の結果は求める結果とどのように違うのかを説明してください。
nagi-kimura

2021/01/16 09:17

pythonでしかコードを書いていないんですけど.....
nagi-kimura

2021/01/16 09:19

電場のようにベクトル図が描かれないといけないのですが, ベクトルが描かれていないのでここの点について投稿をしました.
jbpb0

2021/01/16 09:34

現状では、pythonコードのインデントが無くなっているので、コードが解読できません 質問を編集して、私の最初のコメントに書いたように、 ```python (pythonのコード全部) ``` としてくれたら、pythonコードのインデントが他人にも分かり、コードをちゃんと読むことができます
jbpb0

2021/01/16 09:37

''''''''''''''''''''''''''''''''''''''''''''''''''Python と書いてはダメです ```python と書いてください 同様に '''''''''''''''''''''''''''''''''''''''''''''''''' と書いてはダメです ``` と書いてください そう書かないと、他人が質問を見た時にpythonコードのインデントが再現されず、コードの詳細を解読するのが難しいのです
nagi-kimura

2021/01/16 09:39

そうなんですね! python3ヶ月目なので全然知りませんでした!
jbpb0

2021/01/16 09:54

’’’Python ではないです ```python です ’’’ も違います ``` です 自分で手入力するのではなく、この私のコメントからコピペしてください なお、この書き方は、teratailで質問のコードを他人が読みやすくするためのルールです 実行させる実際のpythonコードには、そんなもの書かないでくださいね あくまでも、teratailにコードを書く場合だけ、それを追加するのです
nagi-kimura

2021/01/16 09:58

すみません. 申し訳ありません. 心からお詫び申し上げます.
jbpb0

2021/01/16 11:01

うまくいってる前進差分のコードとの違いは、下記だけですか? 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
nagi-kimura

2021/01/16 11:08

前進差分は 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 となります. 参考までに... 中心差分のみうまく行きません.
guest

回答1

0

ベストアンサー

2delta_Lx → (2delta_Lx)
2delta_Ly → (2delta_Ly)

カッコを付けないと、delta_L*は分母じゃなくて分子に入る

投稿2021/01/16 11:13

jbpb0

総合スコア7651

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

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

nagi-kimura

2021/01/16 11:18

只今実行したら, 求めていた画像が正しく出力されました. ありごとうございました.
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問