Spi*_*ros 5 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))
Run Code Online (Sandbox Code Playgroud)
我想A*x = y使用提供的函数解决系统numpy并获得以分数对象表示的结果,但遗憾的是,基本x = np.linalg.solve(A, y)结果返回标准浮点值:
>>> np.linalg.solve(A, y)
array([[-1.5245283 ],
[ 2.36603774],
[ 0.56352201]])
Run Code Online (Sandbox Code Playgroud)
有没有办法用分数对象获得精确的结果?
编辑
我想做的是numpy的内置功能是不可行的(从版本1.10开始 - 参见Mad Physicist的回答).人们可以做的是实现他/她自己的基于高斯消元的线性求解器,它依赖于求和,减法,乘法和除法,所有这些都是明确定义的并且与分数对象完全一致(只要分子和分母适合在数据类型中,我认为是任意长的).
如果您真的对此感兴趣,那么只需自己实现一个解算器,就可以轻松快速地完成(在线查看其中一个教程).我没那么感兴趣,所以我会坚持浮点结果.
根据python 邮件列表上的这个线程,使用纯 numpy 来反转有理数矩阵似乎是不可能的。响应表明您可以将 sympy 用于最大尺寸为 4x4 的有理数矩阵。如果您由于某种原因与 numpy 联系在一起,您可以考虑“手动”获取并使用 3x3 矩阵的逆矩阵。有关如何执行此操作的分步教程可以在http://www.mathsisfun.com/algebra/matrix-inverse-minors-cofactors-adjugate.html以及大量其他有关矩阵求逆的教程中找到。