🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

文字コード

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

コードレビュー

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

Python

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

Q&A

解決済

1回答

1753閲覧

キャリア連続の式をpythonでシミュレーションしたい

nagi-kimura

総合スコア3

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

文字コード

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

コードレビュー

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

Python

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

0グッド

0クリップ

投稿2020/12/13 05:26

キャリア連続の式をpythonでシミュレーションしたい

pythonを用いてキャリア連続の式(電流連続の式)をシミュレーションしています。
ポアソン方程式と電界の式とキャリア連続の式はそれぞれに相互関係があり、
その前段階としてポアソン方程式と電界の式をシミュレーションをしました。
ポアソン方程式と電界の式のシミュレーションはネットにあるものを参考にして成功したのですが、
キャリア連続の式のシミュレーション(離散化や数値の設定)について参考文献がなく
シミュレーションができませんでした。

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

一面同一色の画像が得られる。

該当のソースコード

python3

1k_b = 1.38*10**-23 # ボルツマン定数 2e = 1.60*10**-19 # 電気素量 3T = 300 # 絶対温度 4myu_e = 100 # 移動度 5n_0 = 10**-3 # 平衡時の正孔の密度 6 7# 拡散係数D_eを求める 8D_e = float(myu_e*(k_b*T / e)) 9 10tau = 10**-4 # 少数キャリアの寿命 11convegence_criterion = 10**-5 12 13# キャリア連続の式の計算 14n = np.zeros([Lx + 1, Ly + 1]) 15ni_x = np.zeros([Lx + 1, Ly + 1]) 16ni_y = np.zeros([Lx + 1, Ly + 1]) 17 18def initialize_n(condition, n, delta_Lx, delta_Ly, Lx, Ly): 19 for i in range(Lx): 20 for j in range(Ly): 21 if condition(i, j, delta_Lx, delta_Ly): 22 n[i, j] = 1 23 24def evolve_ts(im, dx2, dy2, Lx, Ly, myu_e, Ex, Ey, D_e, tau, n_0, dt, delta_Lx): 25 global n, ni_x 26 n[1:-1, 1:-1] = ni_x[1:-1, 1:-1] + dt*(myu_e*Ex*((ni_x[2:, 1:-1] - ni_x[-2:, 1:-1])/(2*delta_Lx)) + 27 D_e*((ni_x[2:, 1:-1] - 2*ni_x[1:-1, 1:-1] + ni_x[-2:, 1:-1])/dx2) - 28 (ni_x[1:-1, 1:-1] - n_0)/tau) 29 ni_x = np.copy(n) 30 im.set_array(ni_x) 31 return im, 32 33def main(): 34 global n, ni_x, delta_Lx, delta_Ly, Lx, Ly 35 dx2 = delta_Lx ** 2 36 dy2 = delta_Ly ** 2 37 38 dt = dx2 * dy2 / (2 * (dx2 + dy2)) 39 40 condition = (lambda i, j, delta_Lx, delta_Ly: 41 (((i*delta_Lx - 0.5)**2 + (j*delta_Ly - 0.5)**2 <= 0.01) 42 & ((i*delta_Lx - 0.5)**2 + (j*delta_Ly - 0.5)**2 >= .1)) 43 ) 44 45 initialize_n(condition, ni_x, delta_Lx, delta_Ly, Lx, Ly) 46 47 fig = plt.figure() 48 img = plt.subplot(111) 49 im = img.imshow(ni_x, cmap = 'hsv', interpolation = 'nearest', origin = 'lower') 50 im.figure = fig 51 fig.colorbar(im) 52 ani = animation.FuncAnimation(fig, evolve_ts, 240, 53 fargs = (im, dx2, dy2, Lx, Ly, dt, D_e, tau,), 54 blit = True, interval = 50) 55 56 plt.show() 57 58if __name__ == "__main__": 59 main() 60 61 62 63# Commented out IPython magic to ensure Python compatibility. 64# %%time 65# 66

試したこと

conditionや移動度、平衡時の正孔の密度、少数キャリアの寿命の値を変えた。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

jbpb0

2020/12/13 05:40

物理現象の理論式が正しくコードに実装されてるかみたいな話だと思うので、理論式が分かる情報が書かれてるWebページのURLとかもあると、回答されやすくなるように思います
nagi-kimura

2020/12/13 07:06

(dn/dt)=μEx(dn/dx)+De(d^2n/dx^2)-(n-n0)/τe (dn/dt)=μEy(dn/dy)+De(d^2n/dy^2)-(n-n0)/τe dは全てラウンドd、μは移動度、Exは電場のx成分、Eyは電場のy成分、nは正孔密度、Deは拡散係数、n0は平衡時における正孔密度、τeは正孔の寿命です。 正孔密度の時間tにおける二階偏微分方程式のため見づらくなり申し訳ありません。
nagi-kimura

2020/12/15 06:12

拝読しました。 私が得たい離散化した数式に酷似してました。 しかし少し数式が異なることから、多分正孔と電子のキャリア密度を同時に表した物ではないかと思いました。 大変貴重な文献をいただき心から感謝申し上げます。
guest

回答1

0

ベストアンサー

evolve_ts() の2行目の計算は、理論式のx方向の式
(dn/dt)=μEx(dn/dx)+De(d^2n/dx^2)-(n-n0)/τe
に相当するのだと思うのですが、比べてて変だなと思うところがあります

たとえば、μEx(dn/dx) に相当する

python

1myu_e*Ex*((ni_x[2:, 1:-1] - ni_x[-2:, 1:-1])/(2*delta_Lx))

ですが、ni_x の最初の次元の添え字が 2: だと、最初の二つの要素以外の全部、という意味になります
一方、-2: だと、最後の二つの要素だけ、という意味になります

pythonで下記を実行して、確認してみてください

python

1import numpy as np 2xxx = np.arange(10) 3print(xxx) 4print(xxx[2:]) 5print(xxx[-2:])

微分を中心差分で代用しているのが意図だと思うので、二つ目の ni_x の添え字は -2: ではなく :-2 ではないですか?

python

1print(xxx[2:]) 2print(xxx[:-2])

De(d^2n/dx^2) のところも、三つ目の ni_x の添え字が同様になってます

投稿2020/12/15 01:26

jbpb0

総合スコア7653

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

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

nagi-kimura

2020/12/15 06:17

変だなと思わせて申し訳ありません。まだPythonを始めて1ヶ月程しか経ってなく離散化についても講義でほぼ触れられなかったため、離散化についてもインターネットの情報をもとにして行いました。訂正していただきありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問