terations. Iteration will stop after maxiter steps even if the specified tolerance has not been achieved. M : {sparse array, ndarray, LinearOperator} Preconditioner for `A`. `M` must represent a hermitian, positive definite matrix. It should approximate the inverse of `A` (see Notes). Effective preconditioning dramatically improves the rate of convergence, which implies that fewer iterations are needed to reach a given error tolerance. callback : function User-supplied function to call after each iteration. It is called as ``callback(xk)``, where ``xk`` is the current solution vector. Returns ------- x : ndarray The converged solution. info : integer Provides convergence information: 0 : successful exit >0 : convergence to tolerance not achieved, number of iterations Notes ----- The preconditioner `M` should be a matrix such that ``M @ A`` has a smaller condition number than `A`, see [2]_. References ---------- .. [1] "Conjugate Gradient Method, Wikipedia, https://en.wikipedia.org/wiki/Conjugate_gradient_method .. [2] "Preconditioner", Wikipedia, https://en.wikipedia.org/wiki/Preconditioner Examples -------- >>> import numpy as np >>> from scipy.sparse import csc_array >>> from scipy.sparse.linalg import cg >>> P = np.array([[4, 0, 1, 0], ... [0, 5, 0, 0], ... [1, 0, 3, 2], ... [0, 0, 2, 4]]) >>> A = csc_array(P) >>> b = np.array([-1, -0.5, -1, 2]) >>> x, exit_code = cg(A, b, atol=1e-5) >>> print(exit_code) # 0 indicates successful convergence 0 >>> np.allclose(A.dot(x), b) True r