2013-03-03 148 views
0

我正在使用Jscience线性代数模块来求解有理数的线性系统。这工作正常,并给出正确的结果:Matrix.solve()给出了与RationalFunction不同的答案,而不是与Rational

public static void main(String[] args) { 
    DenseMatrix<Rational> m = DenseMatrix.valueOf(
     DenseVector.valueOf(r(1, 1), r(-1, 1), r(0, 1), r(0, 1), r(1, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(1, 1), r(-1, 1), r(0, 1), r(2, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(-1, 1), r(1, 1)), 
     DenseVector.valueOf(r(1, 1), r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(1, 1), r(0, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(-1, 1), r(1, 1), r(0, 1), r(0, 1), r(0, 1))); 

    DenseVector<Rational> v = DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(1, 1), r(1, 2)); 

    Vector<Rational> sol = m.solve(v); 

    System.out.println(sol); 
} 

private static Rational r(int n, int d) { 
    return Rational.valueOf(n, d); 
} 

执行时的代码将打印{0/1, 1/6, 2/3, 1/1, 1/6, 1/6}

我的意图是解决这个系统与v的组件之一的许多不同的值,所以我转换代码使用RationalFunction<Rational>而不是Rational。在第一步中,我还没有引入Variable,并且每个RationalFunction<Rational>都是常数。我的理解是,这应该给了相同的结果之前:

public static void main(String[] args) { 
    DenseMatrix<RationalFunction<Rational>> m = DenseMatrix.valueOf(
     DenseVector.valueOf(r(1, 1), r(-1, 1), r(0, 1), r(0, 1), r(1, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(1, 1), r(-1, 1), r(0, 1), r(2, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(-1, 1), r(1, 1)), 
     DenseVector.valueOf(r(1, 1), r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(1, 1), r(0, 1), r(0, 1)), 
     DenseVector.valueOf(r(0, 1), r(-1, 1), r(1, 1), r(0, 1), r(0, 1), r(0, 1))); 

    DenseVector<RationalFunction<Rational>> v = DenseVector.valueOf(r(0, 1), r(0, 1), r(0, 1), r(0, 1), r(1, 1), r(1, 2)); 

    Vector<RationalFunction<Rational>> sol = m.solve(v); 

    System.out.println(sol); 
} 

private static RationalFunction<Rational> r(int n, int d) { 
    return RationalFunction.valueOf(Polynomial.valueOf(Rational.valueOf(n, d), Term.ONE), Polynomial.valueOf(Rational.ONE, Term.ONE)); 
} 

但这打印执行时以下,即0/0为每个组件:

{([0/1])/([0/1]), ([0/1])/([0/1]), ([0/1])/([0/1]), ([0/1])/([0/1]), ([0/1])/([0/1]), ([0/1])/([0/1])} 

是否Matrix.solve()实际上支持使用RationalFunction?当我用一个一个的矩阵进行测试时,它确实有效。

我应该在哪里看下一个解决这个问题?

回答

1

rational function中,分量多项式的系数可以取自包括有理数的任何field。 A RationalFunction<Rational>反映了这种用法,但solve()从不评估每个矩阵条目定义的功能。

一种方法是构建一个新的矩阵,其中每个条目设置为由r.evaluate()返回的结果。实际上,您可以将第二个示例中的问题转换为可以按照第一个示例中所示解决的问题。

+0

我是否理解这个权利:对于'RationalFunction'中的变量的每个值,'solve()'将找到一个解决方案(如果存在),但它会拒绝找到对于所有值都是正确的解决方案的变量?第二个例子不包含一个变量,这可能会误导我想要做的事情。 – Feuermurmel 2013-05-07 11:11:06

+0

在第二个例子中,solve()把它通常用来分解有理数值矩阵的操作连接起来。检查'sol.e'每个元素的'r.evaluate()'的结果以查看效果。 – trashgod 2013-05-07 11:24:34

+0

对于每个元素'sol.get(i).evaluate()'抛出一个异常:'java.lang.ArithmeticException:Dividend is zero'。 – Feuermurmel 2013-05-07 11:50:46

相关问题