Lukasz Lukasz - 5 months ago 12
Python Question

Python Solving System Of Equations For Variable On Both Sides Of Equality

Is there a way to solve a linear system of equations in python where the unknown is on both sides of the equality. So for instance if I have:

x_1 = 0.7 + 0.5 * x_1 - 0.4 * x_2
x_2 = 0.7 * x_1 + 0.5 - 0.4 * x_1
x_3 = 0.7 * x_2 + 0.5 * x_1 - 0.4


where this can be expressed as:

|x_1| | 1 x_1 x_2|| 0.7|
|x_2| = |x_1 1 x_1|| 0.5|
|x_3| |x_2 x_1 1 ||-0.4|


where the we have a Toeplitz Matrix.

I could easily solve such an expression by hand, but it gets laborious as I have large sets. I was looking at

Is there a python module to solve linear equations?

How to solve a pair of nonlinear equations using Python?

and the SymPy Solvers modules, but I can't seem to find a way of going about this.

Answer

You need to get your equations to form (x_3 omitted for obvious reasons)

0.5 * x1 + 0.4 * x2 = 0.7
0.7 * x1 - 1.4 * x2 = -0.5

before you can use numpy.linalg.solve, like in this case

import numpy as np

a = np.array([[0.5, 0.4],    # first row  x_i factors
              [0.7, -1.4]])  # second row x_i factors
b = np.array([0.7, -0.5])

sol = np.linalg.solve(a, b)

print sol

which gives

[ 0.79591837  0.75510204]

If the question is about how to transform the input

x_1 = 0.7 + 0.5 * x_1 - 0.4 * x_2
x_2 = 0.7 * x_1 + 0.5 - 0.4 * x_2

automatically to the form where constants are on the right side of the equations, it can be archieved by noting first that

0 + 1 * x_1 + 0 * x_2 = 0.7 + 0.5 * x_1 - 0.4 * x_2
0 + 0 * x_1 + 1 * x_2 = 0.5 + 0.7 * x_1 - 0.4 * x_2

and then placing those values in matrixes

import numpy as np

left = np.matrix([[0, 1, 0],    # [cons., x_1, x_2]
                  [0, 0, 1]])
right = np.matrix([[0.7, 0.5, -0.4],
                   [0.5, 0.7, -0.4]])

tmp = left - right
constants = - tmp[:, 0]
factors = tmp[:, [1, 2]]

sol = np.linalg.solve(factors, constants)

print factors
print constants
print sol