numpyを用いない共役勾配法の実装を行いたい
Python言語で共役勾配法の計算を行うプログラムの作成中にlist同士の四則演算にてエラーが出て解決ができないため,解決に向けてのアドバイスをいただけたら幸いです.
発生している問題・エラーメッセージ
TypeError Traceback (most recent call last) <ipython-input-296-66f345dc49de> in <module> 4 #print(b.shape) 5 ----> 6 ans = cgm(A, b, x0) 7 #print(ans) <ipython-input-295-826ff60a9d2a> in cgm(A, b, x_init) 2 x = x_init 3 ----> 4 r0 = (b - dot(vec,mat)) 5 6 print(r0) TypeError: unsupported operand type(s) for -: 'list' and 'list'
該当のソースコード
python
1import random 2from scipy.io import mminfo,mmread 3 4 5mat = mmread('tub100.mtx').todense() 6 7random.seed(1) 8vec = [[random.randrange(10) for i in range(100)]] 9 10x0 = [(0)*100] 11print(type(x0)) 12 13 14def dot(a,b): 15 16 tmp = [[0]*len(b[0]) for i in range(len(a))] 17 18 for i,v in enumerate(a): 19 for j,u in enumerate(zip(*b)): 20 tmp[i][j] = sum([x*y for x,y in zip(v,u)]) 21 22 return tmp 23print(dot(*[vec,mat])) 24 25 26def cgm(A, b, x_init): 27 x = x_init 28 print(x_init) 29 30 r0 = (b - dot(A,x)) 31 32 print(r0) 33 34 p = r0 35 k = 0 36 for i in range(k < k+1): 37 a = dot(r0.T,r0) / dot(dot(p.T, A),p) 38 x = x + p*a 39 r1 = r0 - dot(A*a, p) 40 if np.linalg.norm(r1) < 1.0e-10: 41 k = k+1 42 return x 43 b = dot(r1.T, r1) / dot(r0.T, r0) 44 p = r1 + b * p 45 r0 = r1 46 k = k+1 47 return x 48 49ans = cgm(A, b, x0) 50print(ans) 51
試したこと
減算でエラーが出ているためsetを用いて計算を行った,
また,list型からarrayやtupleに変換したが解決できなかった.
補足情報(FW/ツールのバージョンなど)
jupyter notebook使用
python version 3.6.5使用
numpyを使用しないで解きたいためndarrayは使わないで解決したいです.
listの減算について、どのような結果を期待しているのでしょうか。
例えば [3, 1, 4, 1] - [2, 7, 1, 8] の結果は何ですか。
ありがとうございます.
上記減算の場合は[1,-6,3,-7]の出力を期待しています.
回答1件
あなたの回答
tips
プレビュー