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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

NumPy

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

Python

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

Q&A

解決済

1回答

2201閲覧

ファイル出力(実行結果を複数回改行して出力したい)(テキストファイル、Excel、CSVどのファイルでも構いません)

akimaru0316

総合スコア1

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

NumPy

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

Python

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

0グッド

0クリップ

投稿2021/01/08 03:54

編集2021/01/08 04:59

前提・実現したいこと

微分方程式(一次元熱伝導方程式)を差分化し、陰解法で解いて、その計算結果を時間ごとに改行された1つのファイル(テキストファイル、Excelファイルどちらでもいいです。)に出力したいと考えています。

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

時間ごとにfor文を回して計算し、for文の中で計算結果を出力して改行するというのを繰り返して出力したいのですが、openpyxlやcsv、np.savetxtを試してみてもうまくできませんでした。また、ネットには出力を1回だけする例はありますが、出力を複数回する例はなく困っております。どのようにすればうまく出力されるのかご教示頂けると幸いです。

該当のソースコード

Python

1import matplotlib.pyplot as plt 2import matplotlib.animation as animation 3import numpy as np 4 5 6 7den = 1000.0 #kg/m^3 8cp = 4217.0 #J/(kgK) 9cond = 0.569 #W/(mK) 10temp_bc = -10.0 11temp_init = 0.0 12lx = 0.4 13nx = 401 14tend = 700.0 15dt = 0.1 16tout = 50.0 17eps = 1.0e-6 18itermax = 1000 #物性値など 19 20alpha = cond / (den * cp) 21dx = lx / (nx - 1) 22nt = int(tend / dt) 23nout = int(tout / dt) 24 25ck = alpha * dt / (dx * dx) 26 27 28temp = np.full(nx, temp_init) 29time = 0.0 #initial condition 30 31temp_old = np.zeros(nx) 32 33 34temp[0] = temp_bc # Dirichlet @ x=0 35temp[nx-1] = temp[nx-2] # Neumann @ x=Lx # Boundary condition 36 37 38ims = [] 39fig = plt.figure() 40ax = fig.add_subplot(1, 1, 1)       # graph data array 41 42gx = np.zeros(nx) 43for i in range(nx): 44 gx[i] = i * dx 45 46 47for n in range(1, nt+1): # time loop 48 49 for i in range(nx): # full-implicit with Gauss-Seidel 50 temp_old[i] = temp[i] 51 52 for iter in range(itermax): 53 resd = 0.0 54 for i in range(1,nx-1): 55 tp = temp[i] 56 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 57 resd += abs(temp[i] - tp) 58 if resd <= eps: 59 break 60 for iter in range(itermax): 61 resd = 0.0 62 for i in range(1,nx-1): 63 tp = temp[i] 64 if temp[i] <= 0: 65 if temp[i] >= -0.1: 66 cp = 3333925.0 #J/kgK 比熱に潜熱を盛り込む 67 alpha = cond / (den * cp) 68 ck = alpha * dt / (dx * dx) 69 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 70 else: 71 cp = 2067.0 #J/kgK 氷の比熱 72 cond = 2.22 #W/mK 氷の熱伝導率 73 alpha = cond / (den * cp) 74 ck = alpha * dt / (dx * dx) 75 temp[i] = 1.0 / (1.0 + 2.0 * ck) * (temp_old[i] + ck * temp[i+1] + ck * temp[i-1]) 76 77 resd += abs(temp[i] - tp) 78 if resd <= eps: 79 break 80 81 np.savetxt('result.csv',temp ,delimiter=',',fmt='%.3f') #テキストファイルに書き込み 82 83 84 temp[0] = temp_bc # Dirichlet @ x=0 85 temp[nx-1] = temp[nx-2] # Neumann @ x=Lx # Boundary condition 86 87 time += dt 88 89 if n % nout == 0: 90 print('n: {0:7d}, time: {1:8.1f}, temp: {2:10.6f}, iter: {3:4d}'.format(n, time, temp[nx-1], iter)) 91 im_line = ax.plot(gx, temp, 'b') 92 im_time = ax.text(0, 110, 'Time = {0:8.1f} [s]'.format(time)) 93 ims.append(im_line + [im_time]) 94 95 96ax.set_xlabel('x [m]') 97ax.set_ylabel('Temperature [C]') 98ax.grid() 99anm = animation.ArtistAnimation(fig, ims, interval=50) 100anm.save('animation.gif', writer='pillow') 101plt.show() #animation

試したこと

tempを時間ごとに出力しようとしております。tempはnp.fullの配列で、時間ごとにfor文を回して計算するとtempの値も変わるため、時間毎に出力する必要があります。
現在は
np.savetxt('result.csv',temp ,delimiter=',',fmt='%.3f')
の部分で出力しようと試みています。
しかし、データは一列しか出力されず、うまくいっていません。

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

Spyder 4.2.0
Python 3.8
を使用しております。

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

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

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

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

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

A_kirisaki

2021/01/08 04:30

```Python def foo(x): return x ``` のようにコードを囲いましょう。見やすくなります。
akimaru0316

2021/01/08 04:59

アドバイスありがとうございます。 修正いたしました。 よろしくお願いいたします。
guest

回答1

0

ベストアンサー

結果は、人間が目視できれば良いと仮定します。
ソースコードが<code>で囲まれていないので、実行して確認することはできませんが、以下の方法でできると思います。

python

1初期化などの部分 2・・・ 3f = open('result.csv', 'w') #追加 4for n in range(1, nt+1): 5・・・ 6np.savetxt(f,temp ,delimiter=',',fmt='%.3f') #テキストファイルに書き込み #変更 7f.write(f'\ntime loop: {n}\n') #追加 8・・・ 9その後ろの処理 10f.close() #最後のところに追加

出力間で「time loop: 10」などを書くようにしていますが、csvファイルとして別のソフトで処理するなら、適当に書き換えてください。

投稿2021/01/08 05:04

編集2021/01/08 05:32
ppaul

総合スコア24666

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

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

akimaru0316

2021/01/08 05:14

ご教示いただいたコードを書き込んでみたところ、 SyntaxError: unexpected character after line continuation character このようなエラーが出ました。 f.write(\nf'time loop: {n}\n') この部分でエラーのマークが出ております。
ppaul

2021/01/08 05:32

済みません。最後に手で入れて確認していませんでした。 f.write(f'\ntime loop: {n}\n') #追加 です。階伊藤も修正しました。
akimaru0316

2021/01/08 06:29

回答ありがとうございます。 プログラムは正常に動作しましたが、少し問題があります。 というのは、質問に書くのを忘れていたのですが、現在のプログラムでtempを出力すると、横一列に表示されるのではなく、なぜか縦一列に表示されます。それを時間ごとに改行してしまうと、一列の無数のデータが下にどんどん増えてしまい、エクセルでの行数の上限を超えてしまうのです。 そこで、現在の縦一列に表示されてしまう状態を横一列に表示できるようにして、改行の動作を行うにはどうすればいいでしょうか? もしくは、現在の縦一列に表示される状態はそのままに、改行ではなく改列(列方向に改行)して出力するにはどうすればいいでしょうか? 立て続けの質問となり申し訳ございませんが、ご回答いただけますと幸いです。 よろしくお願いいたします。
ppaul

2021/01/08 07:54

np.savetxt(f,temp ,newline=',',fmt='%.3f') ではどうでしょうか。
akimaru0316

2021/01/11 13:15

回答ありがとうございます。 お返事が遅くなり、申し訳ございません。 無事に横一列で改行することができました! 本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問