0
$\begingroup$

I am working on a problem that requires an iterative procedure to solve a linear system of equations, the system of equations in matrix form is:

$$\underbrace{\begin{bmatrix} r_{11} & r_{12} & r_{13} & \cdots & r_{1j} \\ r_{21} & r_{22} & r_{23} & \cdots & r_{2j} \\ r_{31} & r_{32} & r_{33} & \cdots & r_{3j} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ r_{i1} & r_{i2} & r_{i3} & \cdots & r_{ij} \end{bmatrix}}_\textit{R} \underbrace{\begin{bmatrix} a_{1} & 0 & 0 & \cdots & 0 \\ 0 & a_{2} & 0 & \cdots & 0 \\ 0 & 0 & a_{3} & \cdots & 0 \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ 0 & 0 & 0 & \cdots & a_{j} \end{bmatrix}}_\textit{A} + \underbrace{\begin{bmatrix} b_{1} & b_{2} & b_{3} & \cdots & b_{j} \\ b_{1} & b_{2} & b_{3} & \cdots & b_{j} \\ b_{1} & b_{2} & b_{3} & \cdots & b_{j} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ b_{1} & b_{2} & b_{3} & \cdots & b_{j} \end{bmatrix}}_\textit{B} = \underbrace{\begin{bmatrix} c_{1} & c_{1} & c_{1} & \cdots & c_{1} \\ c_{2} & c_{2} & c_{2} & \cdots & c_{2} \\ c_{3} & c_{3} & c_{3} & \cdots & c_{3} \\ \vdots & \vdots & \vdots & \ddots & \vdots \\ c_{i} & c_{i} & c_{i} & \cdots & c_{i} \end{bmatrix}}_\textit{C}\\ R_{i, j}A_{j, j} + B_{i, j} = C_{i, j} $$

Now matrix R is fully known (input), matrices A, B, C are unknown. I am working on an iterative procedure in which I provide initial guesses for A and B, then calculate C. The iteration is to be carried out till I get a converged value for C (output I require). So far no luck in choosing the initial guess too.

To illustrate the problem I have given an example for a $2 \times 2$ matrix:

$$\begin{bmatrix} r_{11} & r_{12} \\ r_{21} & r_{22} \\ \end{bmatrix} \begin{bmatrix} a_{1} & 0 \\ 0 & a_{2} \\ \end{bmatrix} + \begin{bmatrix} b_{1} & b_{2} \\ b_{1} & b_{2} \\ \end{bmatrix} = \begin{bmatrix} c_{1} & c_{1} \\ c_{2} & c_{2} \\ \end{bmatrix}\\$$ this gives us:

$$a_{1}r_{11} + b_{1} = a_{2}r_{12} + b_{2} = c_{1}\\ a_{1}r_{21} + b_{1} = a_{2}r_{22} + b_{2} = c_{2}$$

From these equations I get:

$$a_{2} = a_{1}\frac{(r_{11} - r_{21})}{(r_{12} - r_{22})}; \quad b_{2}=b_{1} + a_{1}\frac{(r_{11} - r_{21})(r_{11} - r_{12})}{(r_{12} - r_{22})}$$

This helps in the iterative method, but I would like to generalize it for a bigger matrix. Can this be solved with Mathematica?

UPDATE

I have added two reproducible Python codes that should be helpful for a $2 \times 2$ matrix:

Code 1

import numpy as np
R = np.matrix([[2.5, 2.9], [2.3, 2.7]])
m = R.shape[0]
n = R.shape[1]
A = np.matrix(np.zeros(shape=(n,n)))
B = np.matrix(np.zeros(shape=(m,n)))
A[0,0] = 1
B[0,0] = 1
k = 0
for i in range (1, 10000):
    A[0,0] = A[0, 0] - 0.0000001
    B[0,0] = B[0, 0] - 0.0000001
    for j in range(1, n):
        A[j, j] = A[(j-1), (j-1)] * ((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1]))
        B[0, j] = B[0, 0] + A[0, 0] * (((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1])) * (R[0, 0] - R[0, 1]))
        B[1, 0] = B[0, 0]
        B[1, j] = B[0, 0] + A[0, 0] * (((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1])) * (R[0, 0] - R[0, 1]))
    C = R * A + B
    C_convergence = np.all(np.all(np.diff(C, axis = 1) == 0, axis = 1), axis = 0)
    k = k + 1
    print k
print C

Code 2

import numpy as np
R = np.matrix([[2.5, 2.9], [2.3, 2.7]])
m = R.shape[0]
n = R.shape[1]
A = np.matrix(np.zeros(shape=(n,n)))
B = np.matrix(np.zeros(shape=(m,n)))
A[0,0] = 1
B[0,0] = 1
k = 0
C_convergence = False
k = 0
while C_convergence == False:
    A[0,0] = A[0, 0] - 0.0000001
    B[0,0] = B[0, 0] - 0.0000001
    for j in range(1, n):
        A[j, j] = A[(j-1), (j-1)] * ((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1]))
        B[0, j] = B[0, 0] + A[0, 0] * (((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1])) * (R[0, 0] - R[0, 1]))
        B[1, 0] = B[0, 0]
        B[1, j] = B[0, 0] + A[0, 0] * (((R[0, 0] - R[1, 0]) / (R[0, 1] - R[1, 1])) * (R[0, 0] - R[0, 1]))
    C = R * A + B
    C_convergence = np.all(np.all(np.diff(C, axis = 1) == 0, axis = 1), axis = 0)
    k = k + 1
    print k
print C
$\endgroup$
  • $\begingroup$ In the 2x2 example you have 4 equations and 6 values to solve for {a1,a2,b1,b2,c1,c2}. Am I wrong? $\endgroup$ – Dr. belisarius Feb 20 '15 at 19:02
  • $\begingroup$ Yes, but {a1, a2, b1, b2} are initial guesses and I shall iterate it till I get a converged {c1, c2}. $\endgroup$ – nxkryptor Feb 20 '15 at 19:14
  • $\begingroup$ Could you please exemplify your iteration process with a numerical example in the 2x2 case? I just get an exact solution with 2 degrees of freedom in one step $\endgroup$ – Dr. belisarius Feb 20 '15 at 19:39
  • $\begingroup$ I tried in Python which is provided in the update. $\endgroup$ – nxkryptor Feb 20 '15 at 20:20
3
$\begingroup$

This can be handled by Solve straightforwardly:

r = RandomInteger[{-10, 10}, {2, 2}];
a = {{a1, 0}, {0, a2}};
b = {{b1, b2}, {b1, b2}};
c = {{c1, c1}, {c2, c2}};
Solve[r.a + b == c, {a1, a2, b1, b2, c1, c2}]

{{a2 -> 18 a1, b2 -> -45 a1 + b1, c1 -> -9 a1 + b1, c2 -> 9 a1 + b1}}

You can interpret this as saying that for any a1 and b1, the other parameters, if calculated this way, will fulfill your equation.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.