2015-10-30 183 views
5

我已經矩陣A和右手側矢量y的術語來表達fractions.Fraction對象:線性系統解決方案

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

我想使用所提供的功能中,以解決系統A*x = ynumpy並獲得分數的對象表達的結果,但不幸的是基本x = np.linalg.solve(A, y)返回結果的標準浮點值:

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

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

是有一種方法可以獲得分數對象的精確結果嗎?


編輯

我想這樣做是不與numpy的的內置功能(如1.10版本 - 看瘋物理學家的回答)是可行的。可以做的是基於高斯消除來實現他/她自己的線性求解器,該求解器依賴於總和,減法,乘法和除法,所有這些都是精確定義的,並且與分數對象一起執行(只要分子和分母符合在我認爲是任意長的數據類型中)。

如果您真的對此感興趣,只需自己實施一個求解器,它將很容易和快速地完成(在線學習衆多教程之一)。我沒那麼感興趣,所以我會堅持浮點結果。

+1

您的矩陣總是3x3還是隻是偶然?如果它始終是3x3,則可以在最差情況下手動對矩陣進行反碼。 –

+0

當我嘗試運行'np.linalg.solve(A,y)'行時,我實際上遇到錯誤。你是如何得到它的工作? Numpy提供了以下錯誤:'TypeError:沒有找到與指定簽名相匹配的循環,並且爲ufunc solve'找到了鑄造 。我在scipy中嘗試了類似的代碼,它給出了'ValueError:對象數組不支持'。 –

+0

矩陣很小,但其大小是可變的。說不大於10x10。我也知道毛皮確定它是非單一的。 – Spiros

回答

2

根據python郵件列表上的this thread,似乎無法使用純numpy反轉有理數矩陣。 The response建議您可以將sympy用於最大尺寸爲4x4的有理矩陣。如果出於某種原因與numpy相關聯,則可以考慮「手動」獲取並使用3x3矩陣的逆。關於如何做到這一點的一步一步的教程可以在http://www.mathsisfun.com/algebra/matrix-inverse-minors-cofactors-adjugate.html上找到,以及大量關於矩陣求逆的其他教程。

0

恕我直言,沒有希望。在許多情況下工作的解決方案:

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

它使用該解決方案是幾乎與小分子和分母的分數的性質,並發現它。

+0

嗯,實際上從系統的大小和實際分母你可以分析找到結果的最大分母,並使用它而不是6 ** 9。但是我認爲如果你需要的話,最好的方法是自己實現LU分解和後退替換。但是,是的,在閱讀瘋狂物理學家發佈的參考文獻之後,我同意使用內置的解析器做所有事情都沒有希望。 – Spiros

相關問題