线性系统解决方案,分数为numpy

时间:2015-10-30 13:21:12

标签: python numpy linear-algebra fractions

我有一个矩阵A和一个用y个对象表示的右侧向量fractions.Fraction

import random, fractions, numpy as np

A = np.zeros((3, 3), dtype=fractions.Fraction)
y = np.zeros((3, 1), dtype=fractions.Fraction)
for i in range(3):
    for j in range(3):
        A[i, j] = fractions.Fraction(np.random.randint(0, 4), np.random.randint(1, 6))
    y[i] = fractions.Fraction(np.random.randint(0, 4), np.random.randint(1, 6))

我想使用A*x = y中提供的函数解决系统numpy并获得以分数对象表示的结果,但不幸的是,基本x = np.linalg.solve(A, y)以标准浮点数返回结果值:

>>> np.linalg.solve(A, y)

array([[-1.5245283 ],
       [ 2.36603774],
       [ 0.56352201]])

有没有办法用分数对象获得精确的结果?

修改

我想做的是numpy的内置功能是不可行的(从版本1.10开始 - 参见Mad Physicist的回答)。人们可以做的是实现他/她自己的基于高斯消元的线性求解器,它依赖于求和,减法,乘法和除法,所有这些都是明确定义的并且与分数对象完全一致(只要分子和分母适合在数据类型中,我认为这是任意长的。)

如果您真的对此感兴趣,那么您自己实现一个解算器,这将很容易和快速(在线查看许多教程之一)。我没那么感兴趣,所以我会坚持浮点结果。

2 个答案:

答案 0 :(得分:2)

根据python邮件列表中的this thread,似乎无法使用纯numpy反转有理数矩阵。 The response建议你可以使用sympy来处理大小为4x4的有理数矩阵。如果由于某种原因你被绑定到numpy,你可以考虑“手动”采用和使用3x3矩阵的逆。有关如何执行此操作的分步教程可以在http://www.mathsisfun.com/algebra/matrix-inverse-minors-cofactors-adjugate.html上找到,还有大量关于矩阵求逆的其他教程。

答案 1 :(得分:0)

恕我直言,没有希望。在许多情况下都有效的解决方案:

y = np.zeros(3, dtype=fractions.Fraction)
....
X= np.linalg.solve(A,y)
s=[fractions.Fraction.from_float(x).limit_denominator(6**9) for x in X]
print(s,y==dot(A,s))

它使用的解决方案几乎只是分子和分母的分数,并找到它。