我有一个矩阵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的回答)。人们可以做的是实现他/她自己的基于高斯消元的线性求解器,它依赖于求和,减法,乘法和除法,所有这些都是明确定义的并且与分数对象完全一致(只要分子和分母适合在数据类型中,我认为这是任意长的。)
如果您真的对此感兴趣,那么您自己实现一个解算器,这将很容易和快速(在线查看许多教程之一)。我没那么感兴趣,所以我会坚持浮点结果。
答案 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))
它使用的解决方案几乎只是分子和分母的分数,并找到它。