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

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

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

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

Q&A

1回答

792閲覧

別配列同士の足し算を同じforループ内で行えるのか

ab-3

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/09/19 10:42

編集2021/09/20 02:39

・目的
Pythonを使って一次元非定常熱伝導方程式を差分法で表したFTCS式で計算し、0℃の試料(深さ方向iの1次元のみ考える)に一定時間レーザー光を照射したときの温度分布をグラフに示したいと思っています。
・問題
コード中の(#レーザー吸収熱温度 Qの設定)で得た計算Qの配列を#FTCS式における別のtempという配列に足したいのですが、以下のエラーが表示され計算できませんでした。
(エラー内容)
#FTCS内のemp_new[i] = Q[i]+temp[i] +・・・式にてIndexError:list index out of rangeのエラー。Qの配列とtempの配列を同じ要素iでforループを回して#FTCS内の式で計算するにはどのように設定するべきでしょうか?

・FTCS式について
forループのiですが、試料を表面i=0から裏面に向かって深さ方向(一次元)に101等分した要素番号としています。表面i=0と裏面i=nxは境界条件を指定しているためforループに入れていません。FTCS式では、左辺(位置iにおける時間n+1の温度)=右辺(位置iおよびi-1、i+1の時間nの温度)で計算されています。時間については#timeループで時間の要素nについて回しています。
FTCS式では右辺は全て一つ前の時間のデータで計算する必要があるため、左辺をtemp_new[i]と別の配列に格納しています。FTCS法のforループが終わると、先程格納した temp_new を temp の配列にコピーして temp を更新します。#updateでforループを回し temp_new の各要素を temp の同じ番号の要素に代入しているような状態です。
今回はFTCS式の右辺にtempとは別の配列ですが、#レーザー光照射による吸収熱の設定、で与えた配列の中で位置iにおけるQ[i]を足したいと思っています。

import

1import matplotlib.animation as animation 2import numpy as np 3 4# input parameter(材料:Si、厚さ1㎜、微小間隔 dx:10㎛、計算期間tend:1μs、時間間隔dt:1ns、初期温度temp_init:0℃、空間分割数nx、時間分割数nt) 5den = 2330.0 6cp = 678.0 7cond = 83.7 8temp_init = 0.0 9lx = 0.001 10nx = 101 11tend = 0.000001 12dt = 0.000000001 13tout =0.000001 14a=0.064 15alpha = cond / (den * cp) 16dx = lx / (nx - 1) 17nt = int(tend / dt) 18nout = int(tout / dt) 19 20 21# レーザー光照射による吸収熱温度の設定 22Q=[2000000000000*dt*pow(2.718281828,-a*dx*i) for i in range(1, nx-1)] 23 24#initial condition Temp 25temp = np.full(nx, temp_init) 26time = 0.0 27 28temp_new = np.zeros(nx) 29 30# Boundary condition 31temp[0] = temp[1] 32temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 33 34# graph data array 35ims = [] 36fig = plt.figure() 37ax = fig.add_subplot(1, 1, 1) 38 39gx = np.zeros(nx) 40for i in range(nx): 41 gx[i] = i * dx 42 43# レーザー光照射時間の指定 44t_intv= 0.00000005 45 46# time loop 47for n in range(1, nt+1): 48 49 # FTCS(右辺第一項に吸収熱温度を設定/0~50nsの間だけ照射、それ以降はQ=0) 50 for i in range(1, nx-1): 51 if time < t_intv : 52 temp_new[i] = Q[i]+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 53 else : 54 temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 55 56 # update 57 for i in range(1, nx-1): 58 temp[i] = temp_new[i] 59 60 61 # Boundary condition 62 temp[0] = temp[1] 63 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 64 65 time += dt 66 67 if n % nout == 0: 68 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1])) 69 im_line = ax.plot(gx, temp, 'b') 70 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 71 ims.append(im_line + [im_time]) 72 73# graph plot 74ax.set_xlabel('x [m]') 75ax.set_ylabel('Temperature [C]') 76ax.grid() 77anm = animation.ArtistAnimation(fig, ims, interval=50) 78anm.save('animation.gif', writer='pillow') 79plt.show() 80

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

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

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

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

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

meg_

2021/09/19 11:16

> 今回の場合、おそらくQ[i]がエラーの要因かと思われます。Qとtempは別の配列ですが、どのようにすればエラーを解決してtempにQ[i]を足した計算ができますでしょうか? Q[i]でIndexError:list index out of rangeが発生したのであれば(エラー発生時の)Q[i]は存在しないので「tempにQ[i]を足した計算」も不可能でしょう。
ab-3

2021/09/20 02:36

ご指摘ありがとうございます。修正致しました。また何かおかしい所などあればお願い致します。
guest

回答1

0

そもそもQのインデックスとQ[i]のiの範囲が別の変数ですから、範囲が合っているかどうかも不明ですね。

python

1nx = 101 2Q=[2000000000000*dt*pow(2.718281828,-a*dx*i) for i in range(1, nx-1)]

python

1tend = 0.000001 2dt = 0.000000001 3nt = int(tend / dt) 4 5for n in range(1, nt+1): 6 temp_new[i] = Q[i]+temp[i] + dt * alpha * (temp[i+1] -

どうでしょう?

投稿2021/09/19 13:51

TakaiY

総合スコア13790

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

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

ab-3

2021/09/20 01:57

回答ありがとうございます。この場合、temp中のiにもQと同様にforループがかかっているのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問