2015-07-21 7 views
7

Извините, я довольно новичок в sympy и python в целом.Как я могу решить систему линейных уравнений в SymPy?

Я хочу решить следующую Недоопределенные линейную систему уравнений:

x + y + z = 1 
x + y + 2z = 3 
+1

Что вы пробовали до сих пор ? Что приложили ваши исследования? Кажется, что веб-поиск содержит множество примеров. Скажите, пожалуйста, вы прочитали документацию и обыскали, прежде чем спрашивать. –

+0

Я пробовал это: solve_linear_system (M, (x, y, z)), где M = Матрица (((1, 1, 1, - 1), (1, 1, 2, - 3))), Она дала мне IndexError. –

ответ

12

SymPy недавно получил новый Linear системы решатель: linsolve в sympy.solvers.solveset, вы можете использовать это следующим:

In [38]: from sympy import * 

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

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

Список формул:

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

дополненной Матрица форма:

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

А * х = Ь Форма

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)} 

Примечание: Заказ раствора соответствует порядку заданных символов.

+2

Следует отметить, что Linsolve пока недоступен в любом выпуске. Доступен только через версию разработки. –

+0

Спасибо! Я использовал его из git repo! :) –

+0

Я использую sympy 0.7.6, Сначала я не смог получить Linsolve так, чтобы его использовали, Вторая. Расширенная матрица и форма Ax = b дают EMPTY LIST [] ответ, только первый метод дает решение, как описано выше, как мы можем это исправить? –

1

Вы можете решить в матричной форме Ax=b (в данном случае в Недоопределенные систему, но мы можем использовать 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} 

Или переписать в виде (мой редактирования, не SymPy):

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

В случае квадрата A мы могли бы определить b и использовать A.LUsolve(b).

3

В дополнение к большим ответам, данным @AMiT Kumar и @Scott, SymPy 1.0 добавила еще более функциональные возможности. Для недоопределенной линейной системы уравнений я попытался сделать это и не работал, не углубляясь в sympy.solvers.solveset. Говоря это, пойдите туда, если ваше любопытство приведет вас.

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)) 

Это дает мне {z: 2, x: -y - 1}. Опять отличный пакет, разработчики SymPy!

0

Другим примером системы уравнений матрицы линейных, позволяет предположить, что мы решаем для этой системы:

enter image description here

В SymPy мы могли бы сделать что-то вроде:

>>> 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}