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

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

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

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

Q&A

解決済

2回答

624閲覧

TypeError:NoneTypeを解決したい

ab-3

総合スコア5

Python

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

0グッド

0クリップ

投稿2021/09/09 07:58

編集2021/09/10 03:03

プログラミング未経験の者です。以下リンク、科学技術計算講座3-熱伝導方程式シミュレーションリンク内容を参考にして、厚さ1mmのSi材料にレーザー光を一定時間照射したときの試料の温度分布を求めたいと思っています。
試料は一次元(深さ)方向のみ考えており位置i、時間nとそれぞれを離散化しています。(照射)時間に比例、深さ方向に対しては指数関数的に減少するレーザー光の吸収熱Qを設定し、一次元非定常熱伝導方程式をもとにFTCS差分式の右辺第1項に足しました。
計算を行ったところ、#①の吸収熱Q のみが計算され#②の部分でTypeError:unsupported operand type(s) for +:'NoneType'and'float'が表示されました。#②の計算式の中で#①で設定した吸収熱QがNoneTypeとなっており、ほかのtemp[i]などに足せないため、returnで関数に実態をもたせる必要があると調べてみて考えたのですが、プログラミング経験がないこともあり、具体的な解決策が分かっていません。
基礎的なところかと思いますが、ご回答いただけるとありがたいです。

コードの情報(lx:厚さ、dx :空間分割の幅、nx:空間分割点数 、tend:計算期間、dt:時間刻み、nt :時間のステップ数)

import

1import matplotlib.animation as animation 2import numpy as np 3 4# input parameter(材料をSiに変更、厚さ1㎜、a:吸収係数、微小間隔 dx:10㎛、計算期間1μs、時間間隔1nsに変更、表面温度を固定しないためtemp_bcを消去) 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# ①レーザー光照射による吸収熱Qの設定 ※50ns間照射して表面温度2000℃を想定 22for i in range(1, nx-1): 23 x=dx*i 24 25for n in range(1, nt+1): 26 t=dt*n 27 Q=40000000000*t*pow(2.718281828,-a*x) 28 29# レーザー光照射時間の指定 30t_intv= 0.00000005 31 32 33#initial condition 34temp = np.full(nx, temp_init) 35time = 0.0 36 37temp_new = np.zeros(nx) 38 39# Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 40temp[0] = temp[1] 41temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 42 43# graph data array 44ims = [] 45fig = plt.figure() 46ax = fig.add_subplot(1, 1, 1) 47 48gx = np.zeros(nx) 49for i in range(nx): 50 gx[i] = i * dx 51 52# time loop 53for n in range(1, nt+1): 54 55 #② FTCS差分式(右辺第一項に吸収熱Q[i]を設定/0~50nsの間だけ照射、それ以降はQ=0)) 56 for i in range(1, nx-1): 57 if time < t_intv : 58 temp_new[i] = Q[i]+temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 59 else : 60 temp_new[i] = temp[i] + dt * alpha * (temp[i+1] - 2.0 * temp[i] + temp[i-1]) / (dx * dx) 61 62 # update 63 for i in range(1, nx-1): 64 temp[i] = temp_new[i] 65 66 # Boundary condition(表面温度temp[0]固定の# Dirichlet @ x=0条件をNeumann条件に変更) 67 temp[0] = temp[1] 68 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx 69 70 time += dt 71 72 if n % nout == 0: 73 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}'.format(n, time, temp[nx-1])) 74 im_line = ax.plot(gx, temp, 'b') 75 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 76 ims.append(im_line + [im_time]) 77 78# graph plot 79ax.set_xlabel('x [m]') 80ax.set_ylabel('Temperature [C]') 81ax.grid() 82anm = animation.ArtistAnimation(fig, ims, interval=50) 83anm.save('animation.gif', writer='pillow') 84plt.show() 85 86

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

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

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

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

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

guest

回答2

0

ベストアンサー

内容がよくわからないので、現在発生している問題の原因ということだけ。

python

1for n in range(1, nt+1): 2 t=dt*n 3 Q=print(40000000000*t*pow(2.718281828,-a*x))

ここでは、print()の結果をQに入れていますが、たぶん意図したものではないでしょう。 print()はNoneを返します。

計算の結果をQに入れたいのであれば、print()を外して計算結果をQに入れます。。

また、for文でくりかえして計算していますが、1つの変数Qに入れているので、最後に計算した値のみがQに入ることになります。
きっと、Qも配列にする必要があるのでっはないかと思いますし、使うところでも配列として値を取出す必要があります。

投稿2021/09/09 08:16

TakaiY

総合スコア12779

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

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

ab-3

2021/09/10 04:11

回答ありがとうございます。printの件ですが知識不足でした、ありがとうございます。 ご指摘通りQの配列を忘れていました。QをTempと同じ配列にする必要があるかと思いますが、この場合Qはどのように設定すればよいでしょうか。Tempではnp.full(nx, temp_init) でnx個の配列すべてを初期温度 temp_initとしています。 FTCS式では位置i、時間nの温度Temp=位置iおよびi+1およびi-1、時刻n-1の温度Temp+Q(位置i、時間n-1)を行おうとしています。Tempのところは参考サイト通りなので問題ないですが、今回はQをこの通りに設定したいです。FTCS式のところで左辺がtemp_new[i] となっていますが、右辺は全て一つ前の時間のデータで計算する必要があるため、別の配列temp_new[i]に格納し、FTCS式のforループが終わると、#updateのところで先程格納した temp_new を temp の配列にコピーして temp を更新しています。可能であればcodeを書いて教えて頂けるとありがたいです。
TakaiY

2021/09/10 04:23

Qの値が位置と時刻によって違うのであれば、その値を持った2次元配列、もしくは、たとえば、時間毎もしくは位置毎に計算するのであれば、それを除いた1次元の配列で表わすことになるでしょう。 コードの作成については、残念ながら、そういう知識も時間も無いのでできません。
ab-3

2021/09/10 04:47

返答ありがとうございます。 承知しました、細かいcodeの部分についてはもう少し調べてみようと思います。
guest

0

Q=print(40000000000*t*pow(2.718281828,-a*x))

print文の返り値を代入してますが、そもそもprintは値を返しません

投稿2021/09/09 08:06

y_waiwai

総合スコア87784

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問