2013-01-09 23 views
2

我使用scipy.sparse.linalg.cg解決了一個大的稀疏線性系統,它工作正常,除了我想添加一個進度報告,以便我可以監控作爲求解器工作的剩餘部分。我已經成功設置了回調,但我無法弄清楚如何從回調內部訪問當前殘差。當然,計算殘差是可能的,但這是一個相當繁重的操作,我想避免。我錯過了什麼,還是沒有有效的方法來獲得剩餘?從scipy.sparse.linalg.cg中回調打印當前殘差

回答

3

該回調僅發送xk,即當前解決方案向量。所以你沒有直接訪問殘差。但是,source code顯示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) 
+0

謝謝,這工作。奇怪的是,這樣的黑客需要,但。訪問殘差是CG回調中最常見的事情。 – amaurea