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()
, По сути, вы бы преобразовали проблему во втором примере в проблему, которую можно решить, как показано в первом примере.