2017-09-26 76 views
1

的功能,當我試圖使用功能「解決」,在寶石NMatrix,我找到錯誤的結果...解決寶石NMatrix

我試圖求解線性系統a*x = b其中

a = [[1, 0, 0], 
    [4, -5, 1], 
    [0, 0, 1]] 

b = [0, 0, 729] 

應該給答案

x = [0, 145.8, 729] 

我所說的解決功能做a.solve(b)(截至http://www.rubydoc.info/gems/nmatrix/0.2.1/NMatrix#solve-instance_method解釋),但它返回

x = [0, 1.013500790889141e-30, 1.013500790889141e-30] 

因此,我有兩個問題:

  1. 我是不是做錯了什麼?
  2. 如果不是,用ruby解決矩陣系統的另一種解決方案(不包括GSL)是什麼?

謝謝!

+1

對於'A'的定義是什麼意思?A = NMatrix.new([1,0,0],[0,-5,1],[0,0,1],dtype ::: float64)'?請發佈您正在運行的實際代碼,因爲詢問您是否做錯了不能根據現有信息回答 – engineersmnky

+0

實際代碼是: 'a_mat = NMatrix.eye(n)*( - (c + 1)) a_mat [0,0] = 1 a_mat [n-1,n-1] = 1 (1..n-2).each do | i | a_mat [I,I-1] = C a_mat [I,I + 1] = 1 end' 採用c = 4 和 'B = NMatrix.new([N,1],陣列。 new(n-1,0)+ [nb_days-1],dtype :: float32)' and n = 3 and nb_days = 730 –

+0

給出一個例子通常很有幫助,但是當你做所有的輸入對象應該是有效的Ruby對象。此外,爲每個這樣的對象分配一個變量也很有幫助,這樣讀者就可以在答案和註釋中剪切並粘貼這些對象並按名稱引用(而不必定義它們)。您已將它們分配給常量(名稱以首字母開頭)。如果你的意思是他們是變量,用小寫字母開始每個名字。我編輯了你的答案來做出這些改變。 –

回答

0

要回答你的問題的第2部分,你可以使用Ruby的內置Matrix類。

require 'matrix' 

m = Matrix[[1, 0, 0], [4, -5, 1], [0, 0, 1]] 
    #=> Matrix[[1, 0, 0], [4, -5, 1], [0, 0, 1]] 
b = Vector[0, 0, 729] 
    #=> Vector[0, 0, 729] 

a = m.lup.solve(b).to_a 
    #=> [(0/1), (729/5), (729/1)] 

如果一個更喜歡浮標(而不是有理數),

a.map(&:to_f) 
    #=> [0.0, 145.8, 729.0] 

參見Matrix#lupMatrix::LUPDecomposition#solve,其解決使用LU分解的線性系統。

如果線性方程組沒有解決方案(例如[[0,0], [0,0]]*x = b)或無限數量的解決方案(即m是單數),則Ruby將引發異常。例如,

Matrix[[0,0],[0,0]].lup.solve [1, 1] 
    #=> ExceptionForMatrix::ErrNotRegular: Not Regular Matrix 

require matrix使得無論是MatrixVector類(和子類)可供使用。

+0

謝謝你的解決方案。然而,我並不完全贊同它,因爲它在時間上要昂貴得多(你要做兩次計算而不是一次:首先計算反算,這已經是一個昂貴的計算,然後計算乘法)。此外,當矩陣m的行列式接近零時,此方法不太穩定。 –

+0

我改變了我的答案使用LU分解。 –