Matrix.solve()给出了RationalFunction的不同答案,而不是Rational

时间:2013-03-03 17:44:01

标签: java linear-algebra jscience

我使用 Jscience 线性代数模块来求解有理数的线性系统。这可以按预期工作,并给出正确的结果:

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 个答案:

答案 0 :(得分:1)

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

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