我正在使用scipy.sparse.linalg.cg
来解决一个大的,稀疏的线性系统,并且它工作正常,除了我想添加进度报告,以便我可以在求解器工作时监视残差。我已设法设置回调,但我无法弄清楚如何从回调内部访问当前残差。当然,计算剩余是可能的,但这是一个相当繁重的操作,我想避免。我错过了什么,或者没有有效的方法来获得剩余的东西?
答案 0 :(得分:5)
回调仅发送xk
,即当前解决方案向量。所以你没有直接访问残差。但是,source code显示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)