Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby gem矩阵的求函数_Ruby_Nmatrix - Fatal编程技术网

Ruby gem矩阵的求函数

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] 因此,我有两个问题: 我做错什么了吗 如

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

我试图解线性系统
a*x=b

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

哪个应该给出答案

x = [0, 145.8, 729]
我调用solve函数doing
a.solve(b)
(如中所述),但它返回

x = [0, 1.013500790889141e-30, 1.013500790889141e-30]
因此,我有两个问题:

  • 我做错什么了吗
  • 如果不是,那么用ruby解决矩阵系统的其他解决方案(不包括GSL)是什么

  • 谢谢大家!

    要回答问题的第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