[ x_i^(k+1) = (1 - \omega) x_i^(k) + \frac\omegaa_ii \left( b_i - \sum_j < i a_ij x_j^(k+1) - \sum_j > i a_ij x_j^(k) \right) ]
You can take the average: [ \omega = \frac1n \sum_i=1^n \omega_i ] Or use the spectral radius-minimizing value for the matrix at hand.
Set all ( \omega_i ) in your code to this single ( \omega ). The algorithm becomes: [ x_i^(k+1) = (1 - \omega) x_i^(k) + \frac\omegaa_ii \left( b_i - \sum_j < i a_ij x_j^(k+1) - \sum_j > i a_ij x_j^(k) \right) ]
if i % 2 == 0: omega = omega_even else: omega = omega_odd Convert to:
Or in matrix form: [ (D - \omega L) x^(k+1) = \omega b + \left[(1 - \omega) D + \omega U \right] x^(k) ] MSOR (Modified SOR) is a generalization where different relaxation parameters are used for different equations or different groups of variables.
In the world of numerical linear algebra, iterative methods are essential for solving large, sparse systems of linear equations, ( Ax = b ). Among the most famous classical iterative techniques are the Jacobi, Gauss-Seidel, and Successive Over-Relaxation (SOR) methods.
From MSOR to SOR: Simplifying the Modified Successive Over-Relaxation Method
omega = constant_omega This is only possible if all ( \omega_i ) are equal. If not, MSOR and SOR are different iterative methods . No exact equivalence exists unless you reorder the system or change the splitting.
for i in range(n): if i < n/2: w = 1.2 else: w = 1.8 x_new[i] = (1-w)*x_old[i] + w*(b[i] - sum(A[i][j]*x_new[j] for j<i) - sum(A[i][j]*x_old[j] for j>i)) / A[i][i]
However, you may have encountered a variant called the method. While it sounds more advanced, the "conversion" from MSOR to SOR is not a transformation of results but rather a conceptual and algorithmic simplification.