2015-10-30 22 views
5

Tôi đã matrix A và một tay bên phải vector y bày tỏ về fractions.Fraction đối tượng:giải pháp tuyến tính hệ thống với phân số trong NumPy

import random, fractions, numpy as np 

A = np.zeros((3, 3), dtype=fractions.Fraction) 
y = np.zeros((3, 1), dtype=fractions.Fraction) 
for i in range(3): 
    for j in range(3): 
     A[i, j] = fractions.Fraction(np.random.randint(0, 4), np.random.randint(1, 6)) 
    y[i] = fractions.Fraction(np.random.randint(0, 4), np.random.randint(1, 6)) 

tôi muốn giải quyết hệ thống A*x = y sử dụng các chức năng được cung cấp trong numpy và có được một kết quả được thể hiện trong các đối tượng phân số, nhưng tiếc là cơ bản x = np.linalg.solve(A, y) trả về kết quả trong các giá trị dấu chấm động tiêu chuẩn:

>>> np.linalg.solve(A, y) 

array([[-1.5245283 ], 
     [ 2.36603774], 
     [ 0.56352201]]) 

Is có một cách để có được kết quả chính xác với các đối tượng phân số không?


EDIT

Những gì tôi muốn làm chỉ là không khả thi với built-in chức năng của NumPy (như các phiên bản 1.10 - xem câu trả lời của Mad Nhà vật lý học). Những gì người ta có thể làm là triển khai bộ giải tuyến tính của riêng mình dựa trên loại trừ Gauss, dựa vào tổng, trừ, nhân và chia, tất cả đều được xác định và thực hiện chính xác với các đối tượng phân số (miễn là tử số và mẫu số phù hợp trong kiểu dữ liệu, mà tôi nghĩ là tùy ý lâu dài).

Nếu bạn thực sự quan tâm đến việc này, chỉ cần thực hiện một người giải quyết chính mình, nó sẽ được dễ dàng và nhanh chóng để làm (theo một trong nhiều hướng dẫn trực tuyến). Tôi không hứng thú lắm, nên tôi sẽ dính vào kết quả điểm nổi.

+1

Ma trận của bạn luôn 3x3 hay chỉ là ngẫu nhiên? Nếu nó luôn luôn là 3x3, bạn có thể mã lên nghịch đảo ma trận bằng tay trong trường hợp xấu nhất. –

+0

Tôi thực sự gặp lỗi khi cố gắng chạy dòng 'np.linalg.solve (A, y)'. Làm thế nào bạn có được nó để làm việc? Numpy cung cấp cho các lỗi sau: 'TypeError: Không có vòng lặp phù hợp với chữ ký được chỉ định và đúc đã được tìm thấy cho ufunc giải quyết'. Tôi đã thử mã tương tự trong scipy và nó cho 'ValueError: mảng đối tượng không được hỗ trợ'. –

+0

Ma trận là nhỏ, nhưng kích thước của nó là biến. Nói không lớn hơn 10x10. Tôi cũng biết lông chắc chắn nó không phải là số ít. – Spiros

Trả lời

2

Dường như không thể đảo ngược ma trận hợp lý bằng cách sử dụng khối u tinh khiết theo this thread trên danh sách gửi thư python. The response cho thấy rằng bạn có thể sử dụng sympy cho ma trận hợp lý lên đến kích thước 4x4. Nếu bạn bị trói buộc với một số lý do, bạn có thể xem xét việc sử dụng và nghịch đảo ma trận 3x3 "thủ công". Hướng dẫn từng bước về cách thực hiện điều này có thể được tìm thấy trên http://www.mathsisfun.com/algebra/matrix-inverse-minors-cofactors-adjugate.html, cũng như vô số các hướng dẫn khác về đảo ngược ma trận.

0

IMHO, không có hy vọng. Một giải pháp hoạt động trong nhiều trường hợp:

y = np.zeros(3, dtype=fractions.Fraction) 
.... 
X= np.linalg.solve(A,y) 
s=[fractions.Fraction.from_float(x).limit_denominator(6**9) for x in X] 
print(s,y==dot(A,s)) 

Sử dụng thuộc tính là giải pháp gần một phần nhỏ với số tử và mẫu số, và tìm nó.

+0

Vâng, thực sự từ kích thước của hệ thống và mẫu số thực tế bạn có thể phân tích tìm mẫu số tối đa của kết quả và sử dụng nó thay vì 6 ** 9. Nhưng tôi nghĩ cách tốt nhất vẫn là thực hiện phân tích LU và tự thay thế ngược về phía trước nếu bạn cần. Nhưng có, sau khi đọc các referencces được đăng bởi Mad Physicist, tôi đồng ý rằng không có hy vọng trong việc làm tất cả mọi thứ với các giải quyết được xây dựng trong gumpy. – Spiros

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