51

Sorry, I am pretty new to sympy and python in general.

I want to solve the following underdetermined linear system of equations:

x + y + z = 1 
x + y + 2z = 3
Amit Kumar
  • 830
  • 7
  • 17
Aniket Vij
  • 657
  • 1
  • 5
  • 9
  • 2
    What have you tried so far? What has your research efforts yielded? A websearch appears to offer lots of examples. Please tell me you read the documentation and searched before asking. – David Heffernan Jul 21 '15 at 19:21
  • I tried this: solve_linear_system(M, (x, y, z)), where M = Matrix(((1, 1, 1, - 1), (1, 1, 2, - 3))), It gave me an IndexError. – Aniket Vij Jul 21 '15 at 19:29
  • You have fewer equations than unknowns here. You need an SVD solver, not the usual linear solver when you have equal numbers of equations and unknowns. There's no guarantee of a unique solution. – duffymo Jan 27 '20 at 15:13

6 Answers6

48

SymPy recently got a new Linear system solver: linsolve in sympy.solvers.solveset, you can use that as follows:

In [38]: from sympy import *

In [39]: from sympy.solvers.solveset import linsolve

In [40]: x, y, z = symbols('x, y, z')

List of Equations Form:

In [41]: linsolve([x + y + z - 1, x + y + 2*z - 3 ], (x, y, z))
Out[41]: {(-y - 1, y, 2)}

Augmented Matrix Form:

In [59]: linsolve(Matrix(([1, 1, 1, 1], [1, 1, 2, 3])), (x, y, z))
Out[59]: {(-y - 1, y, 2)}

A*x = b Form

In [59]: M = Matrix(((1, 1, 1, 1), (1, 1, 2, 3)))

In [60]: system = A, b = M[:, :-1], M[:, -1]

In [61]: linsolve(system, x, y, z)
Out[61]: {(-y - 1, y, 2)}

Note: Order of solution corresponds the order of given symbols.

Amit Kumar
  • 830
  • 7
  • 17
  • 3
    It should be noted, that linsolve is not yet available in any release. Currently accessible only through the development version. – Sartaj Singh Jul 22 '15 at 14:40
  • I am using sympy 0.7.6, First I could not get linsolve so used solve, Second The Augmented matrix and Ax = b form gives EMPTY LIST [ ] answer, only first method gives solution as like above, how can we fix this? – BhishanPoudel Oct 05 '16 at 03:37
  • Sidenote: You can get the results out of the `FiniteSet` wrapper using `.args[0]`. – Suuuehgi Nov 07 '22 at 22:14
20
import sympy as sp
x, y, z = sp.symbols('x, y, z')
eq1 = sp.Eq(x + y + z, 1)             # x + y + z  = 1
eq2 = sp.Eq(x + y + 2 * z, 3)         # x + y + 2z = 3
ans = sp.solve((eq1, eq2), (x, y, z))

this is similar to @PaulDong answer with some minor changes

  1. its a good practice getting used to not using import * (numpy has many similar functions)
  2. defining equations with sp.Eq() results in cleaner code later on
Ali80
  • 6,333
  • 2
  • 43
  • 33
  • 2
    Adding further explanation would help readers understand why your answer is better than the others and enable them to vote for you. Expand your answer using the [edit] function. – Brian Tompsett - 汤莱恩 Feb 14 '19 at 19:41
15

In addition to the great answers given by @AMiT Kumar and @Scott, SymPy 1.0 has added even further functionalities. For the underdetermined linear system of equations, I tried below and get it to work without going deeper into sympy.solvers.solveset. That being said, do go there if curiosity leads you.

from sympy import *
x, y, z = symbols('x, y, z')
eq1 = x + y + z
eq2 = x + y + 2*z
solve([eq1-1, eq2-3], (x, y,z))

That gives me {z: 2, x: -y - 1}. Again, great package, SymPy developers!

PaulDong
  • 711
  • 7
  • 19
5

Another example on matrix linear system equations, lets assume we are solving for this system:

enter image description here

In SymPy we could do something like:

>>> import sympy as sy
... sy.init_printing()

>>> a, b, c, d = sy.symbols('a b c d')
... A = sy.Matrix([[a-b, b+c],[3*d + c, 2*a - 4*d]])
... A

⎡ a - b     b + c  ⎤
⎢                  ⎥
⎣c + 3⋅d  2⋅a - 4⋅d⎦


>>> B = sy.Matrix([[8, 1],[7, 6]])
... B

⎡8  1⎤
⎢    ⎥
⎣7  6⎦


>>> A - B

⎡ a - b - 8     b + c - 1  ⎤
⎢                          ⎥
⎣c + 3⋅d - 7  2⋅a - 4⋅d - 6⎦


>>> sy.solve(A - B, (a, b, c, d))
{a: 5, b: -3, c: 4, d: 1}
Aziz Alto
  • 19,057
  • 5
  • 77
  • 60
3

You can solve in matrix form Ax=b (in this case an underdetermined system but we can use solve_linear_system):

from sympy import Matrix, solve_linear_system

x, y, z = symbols('x, y, z')
A = Matrix(( (1, 1, 1, 1), (1, 1, 2, 3) ))
solve_linear_system(A, x, y, z)

{x: -y - 1, z: 2}

Or rewrite as (my editing, not sympy):

[x]=  [-1]   [-1]
[y]= y[1]  + [0]
[z]=  [0]    [2]

In the case of a square A we could define b and use A.LUsolve(b).

Scott
  • 6,089
  • 4
  • 34
  • 51
0

Let the system be as follows

y + z -2w = -3 
x + 2y -z = 2
2x + 4y +z - 3w = -2
x - 4y -7z -w = -19

To get a solution set, we can use the following code

import sympy as sp
sp.linsolve(sp.Matrix([
    [0, 1, 1, -2, -3],
    [1, 2, -1, 0, 2],
    [2, 4, 1, -3, -2],
    [1, 4, -7, -1, -19]
]))

which will yield the following output

{(-21/5,26/5,21/5,31/5)}