Matrix.solve() дает другой ответ с RationalFunction, чем с Rational

Я использую модуль линейной алгебры 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 ответ

В рациональной функции коэффициенты компонентных полиномов могут быть взяты из любого поля, включая рациональные числа. RationalFunction<Rational> отражает это использование, но solve() никогда не оценивает функцию, определенную каждой записью матрицы.

Один из подходов заключается в создании новой матрицы, в которой каждая запись устанавливается на результат, возвращаемый r.evaluate(), По сути, вы бы преобразовали проблему во втором примере в проблему, которую можно решить, как показано в первом примере.

Другие вопросы по тегам