大規模でまばらな線形システムを解くために使用scipy.sparse.linalg.cg
していますが、問題なく動作しますが、進行状況レポートを追加して、ソルバーが動作するときに残差を監視できるようにしたいと考えています。コールバックを設定できましたが、コールバック内から現在の残差にアクセスする方法がわかりません。もちろん残差を自分で計算することは可能ですが、それはかなり重い操作なので避けたいと思います。何かを見逃したのでしょうか、それとも残差を取得する効率的な方法はありませんか?
2139 次
1 に答える
6
xk
コールバックは、現在のソリューションベクトルとしてのみ送信されます。したがって、残差に直接アクセスすることはできません。ただし、ソースコードが示すresid
のは関数内のローカル変数ですcg
。
したがって、CPythonを使用すると、inspect
モジュールを使用して、呼び出し元のフレーム内のローカル変数を確認できます。
import inspect
import numpy as np
import scipy as sp
import scipy.sparse as sparse
import scipy.sparse.linalg as splinalg
import random
def report(xk):
frame = inspect.currentframe().f_back
print(frame.f_locals['resid'])
N = 200
A = sparse.lil_matrix( (N, N) )
for _ in xrange(N):
A[random.randint(0, N-1), random.randint(0, N-1)] = random.randint(1, 100)
b = np.random.randint(0, N-1, size = N)
x, info = splinalg.cg(A, b, callback = report)
于 2013-01-09T18:22:07.050 に答える