Jump into concepts and practice - no test required
or
Recommended
Test this pattern10 questions across easy, medium, and hard to know if this pattern is strong
Recall & Review
beginner
What is a preconditioner in the context of solving linear systems?
A preconditioner is a matrix or method used to transform a linear system into a form that is easier and faster to solve by iterative methods.
Click to reveal answer
beginner
Why do we use preconditioners with iterative solvers like Conjugate Gradient?
Preconditioners improve the convergence speed of iterative solvers by reducing the number of iterations needed to reach a solution.
Click to reveal answer
intermediate
Name a common preconditioner available in SciPy.
The Incomplete LU (ILU) factorization is a common preconditioner available in SciPy through scipy.sparse.linalg.spilu.
Click to reveal answer
intermediate
How does a preconditioner affect the matrix in a linear system Ax = b?
A preconditioner M approximates A⁻¹ so that solving M⁻¹Ax = M⁻¹b is easier and converges faster than solving Ax = b directly.
Click to reveal answer
advanced
What is the role of the function LinearOperator in SciPy preconditioning?
LinearOperator lets you define a matrix-like object for the preconditioner without explicitly storing the matrix, saving memory and computation.
Click to reveal answer
What is the main benefit of using a preconditioner in iterative solvers?
AFaster convergence
BMore memory usage
CSlower computation
DExact solution
✗ Incorrect
Preconditioners help iterative solvers converge faster by improving the system's properties.
Which SciPy function can be used to create an Incomplete LU preconditioner?
Ascipy.sparse.diags
Bscipy.linalg.inv
Cscipy.optimize.minimize
Dscipy.sparse.linalg.spilu
✗ Incorrect
The spilu function computes an incomplete LU factorization used as a preconditioner.
What does the preconditioner matrix M approximate?
AThe identity matrix
BThe zero matrix
CThe inverse of A
DThe transpose of A
✗ Incorrect
The preconditioner approximates the inverse of the matrix A to speed up solving.
Which of these is NOT a goal of preconditioning?
AIncrease matrix size
BImprove numerical stability
CReduce iterations
DSpeed up convergence
✗ Incorrect
Preconditioning aims to reduce iterations and improve stability, not increase matrix size.
What is the purpose of using scipy.sparse.linalg.LinearOperator for preconditioners?
ATo store the full matrix explicitly
BTo define matrix operations without storing the matrix
CTo solve nonlinear equations
DTo generate random matrices
✗ Incorrect
LinearOperator allows defining matrix-like operations without storing the full matrix, saving memory.
Explain in your own words what a preconditioner does and why it is useful in solving linear systems.
Think about how changing the system can make solving easier.
You got /3 concepts.
Describe how you would use SciPy to apply a preconditioner when solving a sparse linear system.
Focus on the steps and functions involved.
You got /3 concepts.
Practice
(1/5)
1.
What is the main purpose of a preconditioner in scipy when solving linear systems?
easy
A. To speed up the convergence of iterative solvers
B. To increase the size of the matrix
C. To change the solution of the system
D. To make the matrix non-square
Solution
Step 1: Understand the role of preconditioners
Preconditioners are used to improve the efficiency of iterative methods by transforming the system into an easier one to solve.
Step 2: Identify the effect on convergence
They help iterative solvers like Conjugate Gradient converge faster by approximating the inverse of the matrix.
Final Answer:
To speed up the convergence of iterative solvers -> Option A
Quick Check:
Preconditioner purpose = speed up convergence [OK]
Hint: Preconditioners help iterative solvers run faster [OK]
Common Mistakes:
Thinking preconditioners change the solution
Believing preconditioners increase matrix size
Confusing preconditioners with matrix transformations that alter shape
2.
Which of the following is the correct way to create a simple Jacobi preconditioner using scipy.sparse.linalg.LinearOperator?
import numpy as np
from scipy.sparse.linalg import LinearOperator
A = np.array([[4, 1], [1, 3]])
M = LinearOperator(shape=A.shape, matvec=lambda x: ...)
easy
A. matvec=lambda x: x / np.diag(A)
B. matvec=lambda x: np.dot(A, x)
C. matvec=lambda x: x * np.diag(A)
D. matvec=lambda x: np.linalg.solve(A, x)
Solution
Step 1: Recall Jacobi preconditioner definition
Jacobi preconditioner uses the inverse of the diagonal elements of matrix A.
Step 2: Implement matvec for Jacobi
Applying the preconditioner means dividing each element of x by the corresponding diagonal element of A.
Final Answer:
matvec=lambda x: x / np.diag(A) -> Option A
Quick Check:
Jacobi preconditioner = divide by diagonal [OK]
Hint: Jacobi preconditioner divides vector by matrix diagonal [OK]
Common Mistakes:
Using matrix multiplication instead of division
Trying to solve full system instead of diagonal scaling
Multiplying by diagonal instead of dividing
3.
Given the following code, what will be the output of print(M.matvec(b))?
import numpy as np
from scipy.sparse.linalg import LinearOperator
A = np.array([[2, 0], [0, 5]])
b = np.array([4, 10])
M = LinearOperator(shape=A.shape, matvec=lambda x: x / np.diag(A))
print(M.matvec(b))
medium
A. [0.5, 2.0]
B. [8.0, 50.0]
C. [2.0, 2.0]
D. [4.0, 10.0]
Solution
Step 1: Calculate diagonal of A
Diagonal elements are [2, 5].
Step 2: Apply matvec function
Divide each element of b by corresponding diagonal: [4/2, 10/5] = [2.0, 2.0].
Final Answer:
[2.0, 2.0] -> Option C
Quick Check:
Vector divided by diagonal = [2.0, 2.0] [OK]
Hint: Divide vector elements by diagonal elements to get output [OK]
Common Mistakes:
Multiplying instead of dividing
Confusing vector and matrix multiplication
Using wrong diagonal values
4.
Identify the error in the following code that attempts to create a Jacobi preconditioner:
import numpy as np
from scipy.sparse.linalg import LinearOperator
A = np.array([[3, 1], [1, 4]])
M = LinearOperator(shape=A.shape, matvec=lambda x: np.diag(A) * x)
print(M.matvec(np.array([1, 2])))
Jacobi preconditioner divides vector elements by diagonal elements of A.
Step 2: Check given matvec function
Code multiplies vector by diagonal instead of dividing, which is incorrect.
Final Answer:
Multiplying by diagonal instead of dividing -> Option B
Quick Check:
Jacobi requires division, not multiplication [OK]
Hint: Jacobi preconditioner divides vector by diagonal, not multiply [OK]
Common Mistakes:
Confusing multiplication with division
Ignoring element-wise operations
Not verifying mathematical definition
5.
You want to speed up solving a large sparse system Ax = b using Conjugate Gradient in scipy. Which approach best uses a preconditioner?
from scipy.sparse.linalg import cg, LinearOperator
import numpy as np
# A is large sparse matrix
# b is known vector
# Option 1: Use identity preconditioner
M1 = LinearOperator(A.shape, matvec=lambda x: x)
# Option 2: Use Jacobi preconditioner
diag = A.diagonal()
M2 = LinearOperator(A.shape, matvec=lambda x: x / diag)
# Option 3: Use incomplete Cholesky (not shown)
x, info = cg(A, b, M=M2)
Why is Option 2 preferred over Option 1?
hard
A. Because identity preconditioner is not a LinearOperator
B. Because identity preconditioner changes the solution
C. Because Jacobi preconditioner makes matrix larger
D. Because Jacobi preconditioner approximates inverse and speeds convergence
Solution
Step 1: Understand identity preconditioner effect
Identity preconditioner does nothing; it returns the vector unchanged, so no speedup.
Step 2: Understand Jacobi preconditioner effect
Jacobi approximates the inverse of the diagonal, improving convergence speed of iterative solver.
Final Answer:
Because Jacobi preconditioner approximates inverse and speeds convergence -> Option D
Quick Check:
Jacobi preconditioner = faster convergence [OK]
Hint: Jacobi preconditioner speeds up solver by approximating inverse [OK]