2013-09-28 58 views
5

Nếu tôi hỏi SymPy chèo-giảm ma trận số ítTại sao SymPy cho tôi câu trả lời sai khi tôi hàng-giảm ma trận tượng trưng?

nu = Symbol('nu') 
lamb = Symbol('lambda') 
A3 = Matrix([[-3*nu, 1, 0, 0], 
      [3*nu, -2*nu-1, 2, 0], 
      [0, 2*nu, (-1 * nu) - lamb - 2, 3], 
      [0, 0, nu + lamb, -3]]) 
print A3.rref() 

sau đó nó sẽ trả về ma trận sắc

(Matrix([ 
[1, 0, 0, 0], 
[0, 1, 0, 0], 
[0, 0, 1, 0], 
[0, 0, 0, 1]]), [0, 1, 2, 3]) 

mà nó không nên làm, vì ma trận là số ít. Tại sao SymPy lại cho tôi câu trả lời sai và làm thế nào tôi có thể đưa nó cho tôi câu trả lời đúng?

Tôi biết SymPy biết ma trận là số ít, bởi vì khi tôi yêu cầu A3.inv(), nó mang lại cho

raise ValueError("Matrix det == 0; not invertible.") 

Hơn nữa, khi tôi loại bỏ thịt cừu từ ma trận (tương đương với thiết cừu = 0) , SymPy cung cấp câu trả lời đúng:

(Matrix([ 
[1, 0, 0, -1/nu**3], 
[0, 1, 0, -3/nu**2], 
[0, 0, 1, -3/nu], 
[0, 0, 0,  0]]), [0, 1, 2]) 

dẫn tôi tin rằng vấn đề này chỉ xảy ra với nhiều hơn một biến.

EDIT: Thật thú vị, tôi chỉ nhận được câu trả lời đúng khi tôi vượt qua rref() đối số "simplify = True". Tôi vẫn không có ý tưởng tại sao đó là mặc dù.

+0

Lưu ý rằng thao tác này hiện hoạt động chính xác trong phiên bản phát triển của SymPy. – moorepants

Trả lời

1

Thuật toán rref về cơ bản đòi hỏi khả năng biết các phần tử của ma trận có giống hệt không. Trong SymPy, tùy chọn simplify=True chỉ thị cho SymPy đơn giản hóa các mục nhập đầu tiên ở giai đoạn có liên quan của thuật toán. Với các mục nhập tượng trưng, ​​điều này là cần thiết, vì bạn có thể dễ dàng có các biểu thức biểu tượng giống hệt nhau nhưng không đơn giản hóa thành tự động như vậy, chẳng hạn như x*(x - 1) - x**2 + x. Tùy chọn này được tắt theo mặc định vì nói chung việc đơn giản hóa như vậy có thể tốn kém, thông qua điều này có thể được kiểm soát bằng cách đi qua chức năng đơn giản hóa ít hơn so với simplify (đối với các chức năng hợp lý, hãy sử dụng cancel). Các giá trị mặc định ở đây có thể thông minh hơn.

Các vấn đề liên quan