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

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

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

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

Q&A

1回答

1249閲覧

Pythonにて配列の計算をしたい

ab-3

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/09/16 04:53

編集2021/09/17 04:48

・目的
Pythonを使って一次元非定常熱伝導方程式を差分法で表したFTCS式で計算し、0℃の試料(深さ方向の1次元のみ考える)に一定時間レーザー光を照射したときの温度分布をグラフに示したいと思っています。
・問題
コード中の# レーザー光照射による吸収熱の設定で得た計算Qの配列を#FTCS式の配列に足したいのですが、複数のエラーが表示され計算できませんでした。
(エラー内容)
TypeError: only size-1 arrays can be converted to Python scalars
The above exception was the direct cause of the following exception:
Traceback (most recent call last):
File "Q.py", line 55, in <module>
temp_new[i] = Q+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx)
ValueError: setting an array element with a sequence.

最後のValueErrorに関しては要素の種類が異なる場合に起こるとありましたが、具体的な修正箇所,方法までは理解できませんでした。
また何かおかしいところなどあれば教えていただきたいです。

・FTCS式について補足
FTCS式では右辺は全て一つ前の時間のデータで計算する必要があるため、左辺をtemp_new[i]と別の配列に格納しています。
FTCS法のforループが終わると、先程格納した temp_new を temp の配列にコピーして temp を更新します。#updateでforループを回し temp_new の各要素を temp の同じ番号の要素に代入しているような状態です。

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ページで確認できます。

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

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

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

norapomu

2021/09/16 04:59

出たエラーの内容も掲載しましょう どういうエラーで困っているのかがわかりません
ab-3

2021/09/16 05:08

ご指摘ありがとうございました。
guest

回答1

0

  • 初歩的な質問で申し訳ないのですが、今回のように別々の配列同士を足すことは可能なのでしょうか?

可能です。

  • また何かおかしいところなどあれば教えていただきたいです。

配列の要素temp_new[i]はfloatを一個しか入れることができないのに、右辺の計算結果であるfloatが101個入っている配列を入れようとしているからです。

投稿2021/09/16 05:22

ppaul

総合スコア24670

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

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

ab-3

2021/09/16 05:42

回答ありがとうございます。右辺に関して、tempと同様にQ[i]とすればよいでしょうか?101個のfloatが入ったQの配列からtemp[i]に合わせて一つのfloatを抜き出すにはどのようにコードで指定するべきでしょうか。知識不足で申し訳ございません、回答いただけるとありがたいです。
ppaul

2021/09/16 05:49

そのご質問の答えは、何をやりたいかによります。 tempと同様にQ[i]とすればよいでしょうか?に答えるためには、 ab-3さんがやりたいことを理解して、ab-3さんの書いたコードを理解しなければならず、それには情報がたりません。 やりたいことを、Pythonコードではなく、数式なり文章で表現できて、それを質問に載せれば、誰かが回答できるかもしれません。
ab-3

2021/09/16 06:59

回答ありがとうございます。forループのiですが、試料を表面i=0から裏面に向かって深さ方向(1次元)に101等分した要素番号としています。表面i=0は境界条件を指定しているためforループはそのひとつ奥のi=1から始まるようにしています。FTCS式では左辺(位置iにおける時刻n+1の温度)=右辺(位置iおよびi−1.i+1の時刻nの温度)で計算されており、次の時刻n+1の位置iにおける温度は1つ前の時刻nの位置iとその両隣りi+1、i−1の温度によって決まるということです。時刻については#timeloopで時間の要素数nに対してforループを回しています。ここで自分が行いたい事は深さ方向iに対して指数関数的に減少するレーザー光の吸収熱温度Qを設定しFTCSの右辺に足したいということになります。左辺(次の時刻n+1の位置iの温度)を求めるためには1つ前の時刻nの位置iにおけるQ[i]を取り出して右辺に足すべきかと考えています。長文失礼致しました。何か1つでもご理解頂けるようでしたら回答頂けると助かります。
ppaul

2021/09/16 11:55

左辺(次の時刻n+1の位置iの温度)を求めるためには1つ前の時刻nの位置iにおけるQ[i]を取り出して右辺に足すべきかと考えています。 1つ前の時刻nの位置iにおけるQ[i]を取り出して右辺に足す、と決めれば、「右辺に関して、tempと同様にQ[i]とすればよい」のでしょう。 「右辺に足すべきかと考えています。」を誰かに決めてください、というのであれば、プログラミングの問題ではなく熱伝導方程式自体を教えてほしいと言っているように見えます。その場合は、teratailではなく物理学の質問として別の場で質問される方がよろしいかと思います。
ab-3

2021/09/17 04:41

回答ありがとうございます。すみません、こちらの表現が曖昧でした。意味としては最初ににおっしゃって頂いた通り、1つ前の時刻nの位置iにおけるレーザ光吸収熱による温度Q[i]を取り出して右辺に足すということでした。更新したコード通り、FTCS式の右辺に足すQをQ[i]として計算しましたが、IndexError: list index out of rangeが表示されました。リストのサイズを超えたインデックスの要素を参照しようとした時に発生するとのことですが、今回の場合どこが問題なのでしょうか? 度々すみません、回答いただけるとありがたいです。
ppaul

2021/09/17 04:58

新しいエラーメッセージはどの行で出ていますか?
ab-3

2021/09/17 05:40

#FTCS内の temp_new[i] = Q[i]+temp[i] ・・・式で出ています。
ab-3

2021/09/19 10:07

すみません、あれからいろいろ調べてみたのですがよく分かりませんでした…エラーの要因について何か分かりましたでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問