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

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

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

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

5507閲覧

Python Pyplotによって反復演算の収束の様子をリアルタイム描画したい。

Kazumori102

総合スコア45

Matplotlib

MatplotlibはPythonのおよび、NumPy用のグラフ描画ライブラリです。多くの場合、IPythonと連携して使われます。

NumPy

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2019/09/17 09:10

前提・実現したいこと

前回の質問でグラフのリアルタイム表示処理の動的確保(? こう呼んでいいのかな?)を実現したので、その発展として、多元1次方程式をガウスザイデル法で解いている様子を表示したい。

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

グラフの枠は出ても線が出ないし、

87: UserWarning: Attempting to set identical left == right == 14 results in singular transformations; automatically expanding. ax.set_xlim((grap_x.min(), grap_x.max()))

というエラーが出る。

該当のソースコード

Python

1import numpy as np #行列計算用 2import matplotlib.pyplot as plt #グラフ表示用 3import os #終了待ち用 4 5MAX_TRIAL = 1000 #試行数 6CONVERGENCE = 0.00001 #収束判定の閾値 7DIVERGENCE = 10000000000 #発散判定の閾値 8 9fig, ax = plt.subplots(1, 1) # グラフ表示の準備1 subplots作成 10 11grap_x = np.arange(0, 1, 1) 12 13print('何行行列にする?(2≦ n)') 14while True: 15 mat_size = int(input("n=") ) 16 if(mat_size>=2): 17 break 18 else: 19 print('もう一度お願いします') 20 21mat_A = np.zeros( (mat_size, mat_size) ) #mat_sizeの正方行列Aをゼロで初期化して作ります。 22mat_B = np.zeros(mat_size) #mat_sizeの1次行列Bを〃。 23mat_tmp_ans = np.zeros(mat_size) #mat_sizeの1次行列:前回の解の行列を〃。 24mat_ans = np.ones(mat_size) #mat_sizeの1次行列:前回の解の行列をで1で初期化して作ります。 25 #1で初期化するか0で初期化するかで収束の仕方が変わる。 26 #選べるようになってもいいかも? 27 28 29 30#グラフ表示の準備2 mat_size(=解の次元の数)だけlineを作る 31lines = [] 32for item in range (mat_size): 33 line, = ax.plot( grap_x , item) 34 lines.append(line) 35 36 37 38 39for row in range (mat_size): 40 print('第{}列'.format(row+1) ) 41 for col in range (mat_size): 42 print('第{}行の係数は何にする?'.format(col+1) ) 43 mat_A[row,col] = float(input("=") ) 44 mat_B[row] = float(input("定数はどうする?\n=") ) 45 46for row in range (mat_size): 47 for col in range (mat_size): 48 print('+({: })x{}'.format(mat_A[row,col], col+1 ), end="" ) 49 print(' = {: }'.format(mat_B[row] ) ) 50 51fg0 = False 52check = 0.0 53for row in range (mat_size): 54 for col in range (mat_size): 55 if(row!=col): 56 check += abs(mat_A[row,col] ) 57 if(abs(mat_A[row,row] ) < check ): 58 fg0 = True 59if(fg0): #True 60 print('収束条件を満たしていません。') 61else: #False 62 print('収束条件を満たしています。') 63 64#反復試行ループ 65for trial in range(MAX_TRIAL): 66 error = 0.0 #エラー値を初期化 67 grap_x += 1 68 for row in range (mat_size): 69 mat_tmp_ans[row] = mat_ans[row] #前回のmat_ans[row]を保持する。一気にコピーは計算の処理の関係上ダメ。 70 71 mat_ans[row] = mat_B[row] #第row列の定数項を代入 72 73 for col in range (mat_size): 74 if(row!=col): 75 mat_ans[row] -= mat_A[row,col] * mat_ans[col] 76 mat_ans[row] /= mat_A[row,row] 77 78 print('第{}回試行'.format(trial+1)) 79 for row in range (mat_size): 80 print('x{}={} '.format(row+1,mat_ans[row] ), end="" ) 81 print('') 82 83 # グラフの更新をする。 84 for i in range (mat_size): 85 lines[i].set_data(trial, mat_ans[i]) 86 87 ax.set_xlim((grap_x.min(), grap_x.max())) 88 89 plt.pause(.01) 90 #収束発散判定 91 error = np.sum(np.abs(mat_ans - mat_tmp_ans) ) 92 93 if(error <= CONVERGENCE): 94 print('収束!') 95 break 96 if(error > DIVERGENCE): 97 print('発散!') 98 break 99else: 100 print('試行回数上限到達!') 101 102os.system('pause') 103print('終了!')

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

######環境
バージョン: 1.38.1 (user setup)
コミット: b37e54c98e1a74ba89e03073e5a3761284e3ffb0
日付: 2019-09-11T13:35:15.005Z
Electron: 4.2.10
Chrome: 69.0.3497.128
Node.js: 10.11.0
V8: 6.9.427.31-electron.0
OS: Windows_NT x64 10.0.17763

Package Version


astroid 2.2.5
colorama 0.4.1
cycler 0.10.0
decorator 4.4.0
isort 4.3.21
kiwisolver 1.1.0
lazy-object-proxy 1.4.1
matplotlib 3.1.1
mccabe 0.6.1
networkx 2.3
numpy 1.17.0
opencv-python 4.1.1.26
pandas 0.25.0
pip 19.2.3
pylint 2.3.1
pyparsing 2.4.2
python-dateutil 2.8.0
pytz 2019.2
PyYAML 5.1.2
setuptools 41.2.0
six 1.12.0
tornado 6.0.3
typed-ast 1.4.0
wrapt 1.11.2
XlsxWriter 1.1.9

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

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

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

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

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

guest

回答1

0

ベストアンサー

どういったグラフが最終的に得られば良いのかちょっと分からなかったのですが、
とりあえず、表示範囲を更新していると思われる

grap_x += 1

grap_x = np.arange(1, trial+1, 1)

のように、新しく範囲を作り直してはいかがでしょうか? (0から始まるのか1から始まるのか分からなかったので、ここでは1からとしてみました)

また、set_dataには、Numpy配列を入れることになると思うので、#反復試行ループというコメント文の直後に

trial_list = np.array([]) mat_ans_list = [] for row in range (mat_size): mat_ans_list.append(np.array([]))

こんな感じで、計算の途中経過を格納するtrial_listmat_ans_listを初期化しておいて、
計算の箇所の最後に

print('第{}回試行'.format(trial+1)) trial_list = np.append(trial_list, trial+1) for row in range (mat_size): mat_ans_list[row] = np.append(mat_ans_list[row],mat_ans[row]) print('x{}={} '.format(row+1,mat_ans[row] ), end="" )

こんな感じで、計算結果を trial_listmat_ans_listに格納して、
グラフの更新は

# グラフの更新をする。 for i in range (mat_size): lines[i].set_data(trial_list, mat_ans_list[i])

としてみてはどうでしょうか?

投稿2019/09/17 11:34

KNaito

総合スコア376

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

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

Kazumori102

2019/09/19 01:05

エラー起きました 何行行列にする?(2≦ n) n=3 第1列 第1行の係数は何にする? =5 ~配列入力中略~ 第3行の係数は何にする? =-4 定数はどうする? =2 +( 5.0)x1+(-1.0)x2+( 3.0)x3 = 2.0 +(-1.0)x1+( 4.0)x2+( 2.0)x3 = 1.0 +( 1.0)x1+( 2.0)x2+(-4.0)x3 = 2.0 収束条件を満たしていません。 第1回試行 x1=0.0 x2=-0.25 x3=-0.625 Traceback (most recent call last): File "<path>\gs2.py", line 95, in <module> ax.set_xlim((grap_x.min(), grap_x.max())) File "C:\Users\user\AppData\Roaming\Python\Python37\site-packages\numpy\core\_methods.py", line 34, in _amin return umr_minimum(a, axis, None, out, keepdims, initial, where) ValueError: zero-size array to reduction operation minimum which has no identity
KNaito

2019/09/19 02:40

あ、すみません。一つ間違えてました。trail変数は0から始まってしたね。なので、grap_xを上書きするところを次のようにしてみてください ``` grap_x = np.arange(0, trial+1, 1) ``` ( `np.arange(1, trial+1, 1)`だと、trialが0のときに範囲が1〜1まででエラーになってしまう)
Kazumori102

2019/09/21 18:07

動きました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問