Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/328.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在scipy.sparse.linalg.cg中打印回调中的当前剩余值_Python_Scipy_Linear Algebra - Fatal编程技术网

Python 在scipy.sparse.linalg.cg中打印回调中的当前剩余值

Python 在scipy.sparse.linalg.cg中打印回调中的当前剩余值,python,scipy,linear-algebra,Python,Scipy,Linear Algebra,我正在使用scipy.sparse.linalg.cg来求解一个大型稀疏线性系统,它工作得很好,只是我想添加一个进度报告,以便在解算器工作时可以监控残差。我已经设置了一个回调,但是我不知道如何从回调中访问当前的剩余值。当然,自己计算残差是可能的,但这是一个相当繁重的操作,我希望避免。我是否遗漏了一些内容,或者没有有效的方法获取剩余内容?回调只发送xk,即当前解决方案向量。因此,您无法直接访问剩余的。但是,showsresid是cg函数中的局部变量 因此,使用CPython,可以使用inspect

我正在使用
scipy.sparse.linalg.cg
来求解一个大型稀疏线性系统,它工作得很好,只是我想添加一个进度报告,以便在解算器工作时可以监控残差。我已经设置了一个回调,但是我不知道如何从回调中访问当前的剩余值。当然,自己计算残差是可能的,但这是一个相当繁重的操作,我希望避免。我是否遗漏了一些内容,或者没有有效的方法获取剩余内容?

回调只发送
xk
,即当前解决方案向量。因此,您无法直接访问剩余的。但是,shows
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回调中最常见的一件事。