1

当我尝试在 gem NMatrix 中使用函数“solve”时,我发现错误的结果......

我正在尝试解决线性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)是什么?

谢谢 !

4

1 回答 1

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# lup和Matrix::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类(和子类)都可以使用。

于 2017-09-26T20:11:13.137 回答