Ruby gem矩阵的求函数
当我尝试在gem NMatrix中使用函数“solve”时,我发现错误的结果 我试图解线性系统Ruby gem矩阵的求函数,ruby,nmatrix,Ruby,Nmatrix,当我尝试在gem NMatrix中使用函数“solve”时,我发现错误的结果 我试图解线性系统a*x=b a = [[1, 0, 0], [4, -5, 1], [0, 0, 1]] 及 哪个应该给出答案 x = [0, 145.8, 729] 我调用solve函数doinga.solve(b)(如中所述),但它返回 x = [0, 1.013500790889141e-30, 1.013500790889141e-30] 因此,我有两个问题: 我做错什么了吗 如
a*x=b
a = [[1, 0, 0],
[4, -5, 1],
[0, 0, 1]]
及
哪个应该给出答案
x = [0, 145.8, 729]
我调用solve函数doinga.solve(b)
(如中所述),但它返回
x = [0, 1.013500790889141e-30, 1.013500790889141e-30]
因此,我有两个问题:
谢谢大家! 要回答问题的第2部分,可以使用Ruby的内置类 如果你喜欢浮点数(而不是有理数) 参见和,它们使用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
使和类(以及子类)都可用。要回答问题的第2部分,可以使用Ruby的内置类
如果你喜欢浮点数(而不是有理数)
参见和,它们使用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
使and类(和子类)都可供使用。A的定义是什么?您实际指的是A=NMatrix.new([1,0,0],[0,-5,1],[0,0,1],dtype::float64)
?请发布您正在运行的实际代码,因为根据现有信息无法回答询问您是否做错了的问题。实际代码是:a|mat=NMatrix.eye(n)*((c+1))a|mat[0,0]=1 a|mat[n-1,n-1]=1(1..n-2)。每个do|i|a|a|mat[i,i-1]=c a|mat[i,i+1]=1 end
和c=4和B=NMatrix.new([n,1],Array.new(n-1,0)+[nb_days-1],dtype::float32)
和n=3以及nb_days=730给出一个示例通常很有帮助,但当您这样做时,所有输入对象都应该是有效的Ruby对象。此外,为每个这样的对象分配一个变量也很有帮助,这样读者就可以剪切和粘贴这些对象,并在答案和注释中按名称引用这些对象(而不必定义它们)。您已将它们指定给常量(名称以大写字母开头)。如果您想让它们成为变量,则每个名称都以小写字母开头。我编辑了你的答案来做这些修改。事实上,我是用数学语言写的,而不是ruby,谢谢@M.S.请用代码更新你的帖子,而不是评论。另外,在你的评论中,#solve
从未被调用,所以我感觉这不是你的完整代码a
的定义是什么,你真正的意思是a=NMatrix.new([1,0,0],[0,-5,1],[0,0,1],dtype::float64)
?请发布您正在运行的实际代码,因为根据现有信息无法回答询问您是否做错了的问题。实际代码是:a|mat=NMatrix.eye(n)*((c+1))a|mat[0,0]=1 a|mat[n-1,n-1]=1(1..n-2)。每个do|i|a|a|mat[i,i-1]=c a|mat[i,i+1]=1 end
和c=4和B=NMatrix.new([n,1],Array.new(n-1,0)+[nb_days-1],dtype::float32)
和n=3以及nb_days=730给出一个示例通常很有帮助,但当您这样做时,所有输入对象都应该是有效的Ruby对象。此外,为每个这样的对象分配一个变量也很有帮助,这样读者就可以剪切和粘贴这些对象,并在答案和注释中按名称引用这些对象(而不必定义它们)。您已将它们指定给常量(名称以大写字母开头)。如果您想让它们成为变量,则每个名称都以小写字母开头。我编辑了你的答案来做这些修改。事实上,我是用数学语言写的,而不是ruby,谢谢@M.S.请用代码更新你的帖子,而不是评论。另外,在您的评论中,#solve
从未被调用,因此我感觉这不是您的完整代码谢谢您的解决方案。然而,我不太适应它,因为它在时间上要昂贵得多(你做两次计算,而不是一次:第一次计算逆,这已经是一个昂贵的计算,第二次计算乘法)。此外,当矩阵m的行列式接近于零时,这种方法稳定性较差。我将答案改为使用LU分解。谢谢你的解决方案。然而,我不太适应它,因为它在时间上要昂贵得多(你做两次计算,而不是一次:第一次计算逆,这已经是一个昂贵的计算,第二次计算乘法)。此外,当矩阵m的行列式接近于零时,这种方法稳定性较差。我将答案改为使用LU分解。
a.map(&:to_f)
#=> [0.0, 145.8, 729.0]
Matrix[[0,0],[0,0]].lup.solve [1, 1]
#=> ExceptionForMatrix::ErrNotRegular: Not Regular Matrix