2015-07-21 16 views
7

Üzgünüz, genel olarak semiyoloji ve python için oldukça yeni.SymPy'deki lineer denklem sistemlerini nasıl çözebilirim?

Ben denklem aşağıdaki gereğinden az doğrusal sistemini çözmek istiyoruz:

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

: Biz böyle bir şey yapabileceğini SymPy yılında

enter image description here

? Araştırma çabalarınız neler verdi? Bir web araması çok sayıda örnek sunmaktadır. Lütfen bana belgeleri okuduğunuzu ve sormadan önce aradığını söyle. –

+0

Bunu denedim: solve_linear_system (M, (x, y, z)), burada M = Matrix (((1, 1, 1, - 1), (1, 1, 2, - 3))) bana bir IndexError. –

cevap

12

SymPy yakın zamanda yeni bir Lineer sistem çözücüsü var: sympy.solvers.solveset yılında linsolve, kendinizin kullanabileceği şöyle:

In [38]: from sympy import * 

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

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

Denklem Formunun Listesi:

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

Artırılmış Matris formu:

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

A * X = B Formu

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

Not: çözelti al verilen sembollerin sırasını karşılık gelir.

+2

Belirtilmelidir ki, linsolve henüz herhangi bir sürümde mevcut değildir. Şu anda yalnızca geliştirme sürümünde erişilebilir. –

+0

Teşekkürler! Onu git repo'dan kullandım! :) –

+0

Semptom 0,7 kullanıyorum.6, İlk ben bu yüzden kullanılan çözülmüş linsolve alamadım, İkinci Artırılmış matris ve Ax = b formu EMPTY LIST [] cevap verir, sadece yukarıdaki gibi yukarıdaki gibi bir çözüm verir, nasıl bunu çözebiliriz? –

1
Sen (bu durumda bir gereğinden az sistem ama biz solve_linear_system kullanabilirsiniz) matris biçiminde Ax=b içinde çözebilir

: (sympy benim düzenleme)

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} 

Veya olarak yeniden yazın:

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

Bir kare A durumunda b tanımlayabiliriz ve A.LUsolve(b)'u kullanabiliriz.

3

@AMiT Kumar ve @Scott tarafından verilen harika yanıtlara ek olarak SymPy 1.0, daha da fazla işlevsellik ekledi. Tanımlanmamış lineer denklemler sistemi için, aşağıda denedim ve sympy.solvers.solveset'a daha derine inmeden çalışmasını sağladım. Bu söyleniyorsa, merak sizi açarsa oraya git. {z: 2, x: -y - 1} bana verir

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

. Yine harika paket SymPy geliştiricileri!

0

matris lineer sistem denklemler üzerinde başka örnek, bu sistem için çözme varsayalım sağlar: Şimdiye kadar denedim ne

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