Reputation: 687
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
Upvotes: 54
Views: 73941
Reputation: 1
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)}
Upvotes: 0
Reputation: 8676
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
import *
(numpy has many similar functions)sp.Eq()
results in cleaner code later onUpvotes: 24
Reputation: 20381
Another example on matrix linear system equations, lets assume we are solving for this system:
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}
Upvotes: 5
Reputation: 813
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!
Upvotes: 18
Reputation: 897
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.
Upvotes: 52
Reputation: 6389
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)
.
Upvotes: 3