2
我使用scipy.sparse.linalg.cg
解決了一個大的稀疏線性系統,它工作正常,除了我想添加一個進度報告,以便我可以監控作爲求解器工作的剩餘部分。我已經成功設置了回調,但我無法弄清楚如何從回調內部訪問當前殘差。當然,計算殘差是可能的,但這是一個相當繁重的操作,我想避免。我錯過了什麼,還是沒有有效的方法來獲得剩餘?從scipy.sparse.linalg.cg中回調打印當前殘差
我使用scipy.sparse.linalg.cg
解決了一個大的稀疏線性系統,它工作正常,除了我想添加一個進度報告,以便我可以監控作爲求解器工作的剩餘部分。我已經成功設置了回調,但我無法弄清楚如何從回調內部訪問當前殘差。當然,計算殘差是可能的,但這是一個相當繁重的操作,我想避免。我錯過了什麼,還是沒有有效的方法來獲得剩餘?從scipy.sparse.linalg.cg中回調打印當前殘差
該回調僅發送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)
謝謝,這工作。奇怪的是,這樣的黑客需要,但。訪問殘差是CG回調中最常見的事情。 – amaurea