2015-11-04 58 views
4

我想知道有多少次迭代scipy.sparse.linalg.gmres正在進行收斂,但似乎沒有這樣的論點。有一個maxiter參數可以設置終止該方法,但沒有顯示它正在進行的迭代次數。有人可以幫我弄這個嗎?獲取scipy的gmres迭代方法的迭代次數

+2

通常情況下,這不是人們關心。儘管如此,您可以使用'callback'參數來爲您計算循環的函數。 – cel

+0

[在SciPy中檢索爲稀疏線性求解器運行的迭代次數]的可能副本(http://stackoverflow.com/questions/29747043/retrieving-number-of-iterations-that-ran-for-sparse-linear-solver -in-SciPy的) –

回答

5

爲了說明@ CEL的評論,你可以實現一個簡單的計數器類是這樣的:

class gmres_counter(object): 
    def __init__(self, disp=True): 
     self._disp = disp 
     self.niter = 0 
    def __call__(self, rk=None): 
     self.niter += 1 
     if self._disp: 
      print('iter %3i\trk = %s' % (self.niter, str(rk))) 

你會使用這樣的:

import numpy as np 
from scipy.sparse.linalg import gmres 

A = np.random.randn(10, 10) 
b = np.random.randn(10) 

counter = gmres_counter() 

x, info = gmres(A, b, callback=counter) 
# iter 1  rk = 0.999558746968 
# iter 2  rk = 0.960490282387 
# iter 3  rk = 0.1 
# iter 4  rk = 0.931790454216 
# iter 5  rk = 0.877655067142 
# iter 6  rk = 0.739596963239 
# iter 7  rk = 0.677886023198 
# iter 8  rk = 0.52015135005 
# iter 9  rk = 0.168298366785 
# iter 10  rk = 9.22692033803e-16 

print(counter.niter) 
# 10