3

scipy.sparse.linalg.cg用来求解一个大型的稀疏线性系统,它工作正常,除了我想添加一个进度报告,这样我就可以在求解器工作时监控残差。我设法设置了一个回调,但我不知道如何从回调内部访问当前的残差。当然,自己计算残差是可能的,但这是一个相当繁重的操作,我想避免。我错过了什么,还是没有有效的方法来获得残差?

4

1 回答 1

6

回调仅发送xk,即当前解决方案向量。因此,您无法直接访问残差。但是,源代码显示residcg函数中的局部变量。

因此,使用 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 回答