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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

NumPy

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

Python

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

Q&A

解決済

1回答

835閲覧

二次元拡散モデル update関数の組み立て Google Colab

Gonzo_G

総合スコア1

Google Colaboratory

Google Colaboratoryとは、無償のJupyterノートブック環境。教育や研究機関の機械学習の普及のためのGoogleの研究プロジェクトです。PythonやNumpyといった機械学習で要する大方の環境がすでに構築されており、コードの記述・実行、解析の保存・共有などが可能です。

NumPy

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

Python

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

0グッド

0クリップ

投稿2021/06/26 13:00

前提・実現したいこと

colabで二次元拡散モデルを可視化しようとしています。
拡散モデルのシミュレーション実行中に以下のエラーメッセージが発生しました。
update関数にミスがあるとアドバイスされましたが、どこが間違っているのかよく呑み込めていません。

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

TypeError Traceback (most recent call last) <ipython-input-56-49a802a7bb82> in <module>() 37 t= (n+1)*dt #時刻tの計算 38 ---> 39 u_tmp,v_tmp=update(u,v,Du,Dv,dh,dt,du,dv,k1,k2,k3) 40 41 t_list.append(t) <ipython-input-54-5dd71940a200> in update(fieldu, fieldv, Du, Dv, du, dv, dh, dt, k1, k2, k3) 10 if j==0: 11 #境界条件処理 i=0 , j=0 ---> 12 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[-1,0,1],:][:,[-1,0,1]],fieldv[[-1,0,1],:][:,[-1,0,1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 13 elif 0<j<n_j-1: 14 #境界条件処理i=0,0<j<n_j-1 TypeError: cannot unpack non-iterable numpy.float64 object

該当のソースコード

Python

1#01-02-01 二次元の拡散方程式の関数定義 2 3import numpy as np 4import matplotlib.pyplot as plt 5 6def diff_eq(u_arr,v_arr,Du,Dv,du,dv,dh,dt,k1,k2,k3): 7 new_u=u_arr[1,1]+(Du*((u_arr[0,1]+u_arr[2,1]+u_arr[1,0]+u_arr[1,2]-4*u_arr[1,1])/(dh**2))-du*(u_arr[1,1])+k1*((u_arr[1,1]*u_arr[1,1])/v_arr[1,1])+k2)*dt 8 return new_u 9 10 new_v=v_arr[1,1]+(Dv*((v_arr[0,1]+v_arr[2,1]+v_arr[1,0]+v_arr[1,2]-4*v_arr[1,1])/(dh**2))-dv*(v_arr[1,1])+k3*(u_arr[1,1]*u_arr[1,1]))*dt 11 return new_v 12 13#01-02-02 二次元の拡散方程式に基づく更新 14def update(fieldu,fieldv,Du,Dv,du,dv,dh,dt,k1,k2,k3): 15 nu_i,nu_j=fieldu.shape 16 new_fieldu= np.zeros((nu_i,nu_j),dtype=fieldu.dtype) 17 nv_i,nv_j=fieldv.shape 18 new_fieldv= np.zeros((nv_i,nv_j),dtype=fieldv.dtype) 19 for i in range(nu_i): 20 for j in range(nu_j): 21 if i==0: 22 if j==0: 23 #境界条件処理 i=0 , j=0 24 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[-1,0,1],:][:,[-1,0,1]],fieldv[[-1,0,1],:][:,[-1,0,1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 25 elif 0<j<n_j-1: 26 #境界条件処理i=0,0<j<n_j-1 27 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[-1,0,1],:][:,[j-1,j,j+1]],fieldv[[-1,0,1],:][:,[j-1,j,j+1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 28 elif j==n_j-1: 29 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[-1,0,1],:][:,[n_j-2,n_j-1,0]],fieldv[[-1,0,1],:][:,[n_j-2,n_j-1,0]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 30 elif 0< i <n_j-1: 31 if j==0: 32 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[i-1,i,i+1],:][:,[-1,0,1]],fieldv[[i-1,i,i+1],:][:,[-1,0,1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 33 elif 0<j<n_j-1: 34 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[i-1,i,i+1],:][:,[j-1,j,j+1]],fieldv[[i-1,i,i+1],:][:,[j-1,j,j+1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 35 elif j==n_j-1: 36 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[i-1,i,i+1],:][:,[n_j-2,n_j-1,0]],fieldv[[i-1,i,i+1],:][:,[n_j-2,n_j-1,0]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 37 elif i == n_i-1: 38 if j ==0: 39 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[n_i-2,n_i-1,0],:][:,[-1,0,1]],fieldv[[n_i-2,n_i-1,0],:][:,[-1,0,1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 40 elif 0<j<n_j-1: 41 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[n_i-2,n_i-1,0],:][:,[j-1,j,j+1]],fieldv[[n_i-2,n_i-1,0],:][:,[j-1,j,j+1]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 42 elif j==n_j-1: 43 new_fieldu[i,j],new_fieldv[i,j]=diff_eq(fieldu[[n_i-2,n_i-1,0],:][:,[n_j-2,n_j-1,0]],fieldv[[n_i-2,n_i-1,0],:][:,[n_j-2,n_j-1,0]],Du,Dv,du,dv,dh,dt,k1,k2,k3) 44 45 return new_field 46 47#01-02-03 二次元拡散モデルのシミュレーション実行 48Du=1.01 49Dv=1.01 50du=1.01 51dv=1.01 52dt=0.05 53dh=1 54k1=1.0 55k2=1.0 56k3=1.0 57 58u_0=100 59v_0=100 60 61x=np.arange(-25,25,dh) 62y=np.arange(-25,25,dh) 63xmesh,ymesh=np.meshgrid(x,y) 64 65t_end=50 66 67t_list=[] 68u_list=[] 69v_list=[] 70 71 72u=np.zeros([len(x),len(y)],dtype=float) 73v=np.zeros([len(x),len(y)],dtype=float) 74u[25,25]=u_0 75v[25,25]=v_0 76 77 78t_list.append(0) 79u_list.append(np.copy(u)) 80v_list.append(np.copy(v)) 81 82for n in range(int(t_end/dt)): 83 t= (n+1)*dt #時刻tの計算 84 85 u_tmp,v_tmp=update(u,v,Du,Dv,dh,dt,du,dv,k1,k2,k3) 86 87 t_list.append(t) 88 89 u=np.copy(u_tmp) 90 v=np.copy(v_tmp) 91 u_list.append(np.copy(u)) 92 v_list.append(np.copy(v)) 93

試したこと

元々
u_tmp,v_tmp=update(u,v,Du,Dv,dh,dt,du,dv,k1,k2,k3)
の行で
missing 1 required positional argument:'k3'
のエラーが出ており、引数と入れる値が対応していない問題を解決しようとしていました。このエラーは消えたものの、新たに今回の質問の状況になりました。

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

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

複数の値を返す関数のreturn文の書き方が間違っています。

python

1def diff_eq(u_arr,v_arr,Du,Dv,du,dv,dh,dt,k1,k2,k3): 2 new_u=u_arr[1,1]+(Du*((u_arr[0,1]+u_arr[2,1]+u_arr[1,0]+u_arr[1,2]-4*u_arr[1,1])/(dh**2))-du*(u_arr[1,1])+k1*((u_arr[1,1]*u_arr[1,1])/v_arr[1,1])+k2)*dt 3 return new_u 4 5 new_v=v_arr[1,1]+(Dv*((v_arr[0,1]+v_arr[2,1]+v_arr[1,0]+v_arr[1,2]-4*v_arr[1,1])/(dh**2))-dv*(v_arr[1,1])+k3*(u_arr[1,1]*u_arr[1,1]))*dt 6 return new_v

を以下に変更すればこのエラーはなくなると思います。

python

1def diff_eq(u_arr,v_arr,Du,Dv,du,dv,dh,dt,k1,k2,k3): 2 new_u=u_arr[1,1]+(Du*((u_arr[0,1]+u_arr[2,1]+u_arr[1,0]+u_arr[1,2]-4*u_arr[1,1])/(dh**2))-du*(u_arr[1,1])+k1*((u_arr[1,1]*u_arr[1,1])/v_arr[1,1])+k2)*dt 3 4 new_v=v_arr[1,1]+(Dv*((v_arr[0,1]+v_arr[2,1]+v_arr[1,0]+v_arr[1,2]-4*v_arr[1,1])/(dh**2))-dv*(v_arr[1,1])+k3*(u_arr[1,1]*u_arr[1,1]))*dt 5 6 return new_u, new_v

関数updateにも似たような誤りがあるので、そちらも修正する必要があるでしょう。

投稿2021/06/26 22:56

ppaul

総合スコア24666

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

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

Gonzo_G

2021/06/27 01:43

定義とupdateのreturn文を変更したところ、シミュレーションを実行することができました!ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問