我正在使用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乘1矩阵测试它时,它确实有效。
解决这个问题下一步应该看哪里?
在有理数函数中,分量多项式的系数可以取任意域,包括有理数。RationalFunction<Rational>
反映了这种用法,但solve()
从不计算每个矩阵条目定义的函数。
一种方法是构造一个新的矩阵,其中每个条目都设置为r.evaluate()
返回的结果。实际上,您可以将第二个示例中的问题转换为第一个示例中可以解决的问题。