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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

Q&A

解決済

1回答

1707閲覧

Pythonにて離散化された1次元空間の中で指定した場所に指定した時間だけ熱がかかるように設定したい

ab-3

総合スコア5

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

Python

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

0グッド

0クリップ

投稿2021/08/28 13:32

編集2021/08/31 03:26

### 前提・実現したいこと
プログラミング未経験の者です。以下リンク、科学技術計算講座3-熱伝導方程式シミュレーションリンク内容を参考にして、厚さ1mmのSi材料にレーザー光を一定時間、一部分のみに照射したときの試料の温度分布を求めたいと思っています。
試料は一次元方向のみ考えているため、lx = 1mm、Δx=10㎛で空間方向を100分割しています。codeの#疑問点①~③にも示してありますが、レーザー光照射による吸収熱(単位:℃/s)Q=40000000000を設定し、その吸収熱が表面からの距離x=50㎛(x軸の要素番号をiとして表面i=0であるからQ[5]?)の場所に計算開始0~50nsの間だけかかっている(それ以降はQ=0)とした場合、codeでは位置、時間の選択をどのように指定すればよいのか教えていただきたいです。
また何か不備等ありましたらご指摘お願い致します。

import

1import matplotlib.animation as animation 2import numpy as np 3 4# input parameter 5(材料をSiに変更、厚さ1㎜、微小間隔 dx:10㎛、計算期間1μs、時間間隔1nsに変更、表面温度を固定しないためtemp_bcを消去) 6den = 2330.0 7cp = 678.0 8cond = 83.7 9temp_init = 0.0 10lx = 0.001 11nx = 101 12tend = 0.000001 13dt = 0.000000001 14tout =0.000001 15 16alpha = cond / (den * cp) 17dx = lx / (nx - 1) 18nt = int(tend / dt) 19nout = int(tout / dt) 20 21 22# レーザー光照射による吸収熱の設定(単位:℃/s)※50ns間照射して2000℃上昇を想定 23for n in range(1, nt+1): 24 Q[i]=40000000000*dt*n 25 26# レーザー照射位置を表面からの距離x=50㎛(i=0~101で離散化しているためQ[5]?)(疑問点①) 27for i in range(nx): 28 if i=5 : 29 Q[5]=40000000000*dt*n 30else : 31 Q[i]=0.0 32 33 34# レーザー光照射時間の設定(0~50nsの間だけ照射、それ以降はQ=0)(疑問点②) 35t_intv= 0.00000005 36 37for n in range(1, nt+1): 38 if time < t_intv : 39 Q[5]=40000000000*dt*n 40 else : 41 Q[5]=0.0 42 43 44#initial condition 45temp = np.full(nx, temp_init) 46time = 0.0 47 48temp_new = np.zeros(nx) 49 50# Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 51temp[0] = temp[1] 52temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 53 54# graph data array 55ims = [] 56fig = plt.figure() 57ax = fig.add_subplot(1, 1, 1) 58 59gx = np.zeros(nx) 60for i in range(nx): 61 gx[i] = i * dx 62 63# time loop 64for n in range(1, nt+1): 65 66 # FTCS(右辺第一項に吸収熱を設定する) (疑問点③) 67 for i in range(1, nx-1): 68 temp_new[i] = Q[i]+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 69 70 # update 71 for i in range(1, nx-1): 72 temp[i] = temp_new[i] 73 74 # Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 75 temp[0] = temp[1] 76 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 77 78 time += dt 79 80 if n % nout == 0: 81 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1])) 82 im_line = ax.plot(gx, temp, 'b') 83 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 84 ims.append(im_line + [im_time]) 85 86# graph plot 87ax.set_xlabel('x [m]') 88ax.set_ylabel('Temperature [C]') 89ax.grid() 90anm = animation.ArtistAnimation(fig, ims, interval=50) 91anm.save('animation.gif', writer='pillow') 92plt.show() 93

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1for n in range(1, nt+1): 2 for i in range(1, nx-1): 3 temp_new[i] = Q+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)

これだと全てのn、全て(両端除く)のiに対してQが追加して代入されているので
if文で適切にniの値で場合分けしましょう。

あと、Qは℃/sですが、tempですよね、次元が異なるものを足し合わせています。


回答ありがとうございます。ご指摘していただいた通り吸収熱Qの単位が℃/s なので時間の要素nと時間間隔dtをかけました。(吸収熱は時間とともに増加させたいため)

そうしたら次元が℃・sになってしまいませんか?

また吸収熱Qをある位置における熱とし、Temp[i]と同様Q[i]に変更しましました。

べつにそれでもいいですが、そんなことしなくてもFTCSのループでiftemp_newの代入文にQの項を含めるかどうか分岐すればいいです。

python

1 for i in range(1, nx-1): 2 if Qが加わる位置と時刻だったら: 3 temp_new[i] = Q + temp[i] ... 4 else: 5 temp_new[i] = temp[i] ...

(元の回答もこれを意図していました)

もちろんレーザーによる加熱に分布をもたせたいというならQを配列にしたほうが見通しはいいと思いますが。

エラーが出ます

python

1 if i=5 : 2 ^ 3SyntaxError: invalid syntax

正直やろうとしていることに対してスキルが全然追いついていないので
もっとかんたんなプログラムから慣らしていったほうが結果的に早いと思います。
急がばなんとやらです。

投稿2021/08/30 08:10

編集2021/08/31 04:38
ozwk

総合スコア13521

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

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

ab-3

2021/08/31 03:38

回答ありがとうございます。ご指摘していただいた通り吸収熱Qの単位が℃/s なので時間の要素nと時間間隔dtをかけました。(吸収熱は時間とともに増加させたいため)また吸収熱Qをある位置における熱とし、Temp[i]と同様Q[i]に変更しましました。空間の要素iについて、深さ50㎛(i=5)のみに吸収熱Qがかかるようにif文で切り替えてみました。時間の要素nについてはt_intv= 0.00000005(50ns)で時間指定してif文で切り替えてみましたが、Anaconda Promptでエラーが出ます。間違いだらけだと思いますが、回答いただけるとありがたいです。
ozwk

2021/08/31 04:28 編集

追記しました プログラムで何かしようとなったら 文法エラーなくプログラムを書ける、たとえエラーが有っても自分で取り除ける知識と その「何かしよう」の分野に関する知識(コンピュータに指示できる程度)が必須です。
ab-3

2021/09/03 08:28

回答ありがとうございます。 もう少し基礎を付け問題を細分化して考え直したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問