逆矩阵 (Numpy) int 太大而无法转换为 float

Inverse Matrix (Numpy) int too large to convert to float

我正在尝试取 365x365 矩阵的逆矩阵。一些值变得和 365**365 一样大,因此它们被转换为长数字。我不知道 linalg.matrix_power() 函数是否可以处理长数字。我知道问题来自于此(因为错误消息并且因为我的程序适用于较小的矩阵)但我不确定是否有办法解决这个问题。该代码需要适用于 NxN 矩阵。

这是我的代码:

item=0
for i in xlist:
    xtotal.append(arrayit.arrayit(xlist[item],len(xlist)))
    item=item+1
print xtotal
xinverted=numpy.linalg.matrix_power(xtotal,-1)
coeff=numpy.dot(xinverted,ylist)

arrayit.arrayit:

def arrayit(number, length):
    newarray=[]
    import decimal
    i=0
    while i!=(length):
        newarray.insert(0,decimal.Decimal(number**i))
        i=i+1
    return newarray;

该程序从列表(x 列表和 y 列表)中获取 x、y 坐标并生成一个函数。 谢谢!

您听说过拉格朗日插值法或牛顿插值法吗?这将避免 VanderMonde 矩阵的整个构造。但不是系数中可能很大的数字。


一般来说,您不需要逆矩阵。你不需要计算它。你想要的是求解一个线性方程组。

x = numpy.linalg.solve(A, b)

解决系统A*x=b.


您(真的)可能想查看 龙格效应。使用等距样本点进行插值是一项越来越病态的任务。对于个位数的度数可以获得有用的结果,更大的度数往往会给出剧烈振荡的多项式。


您经常可以使用多项式回归,即用某个低阶的最佳多项式来近似您的数据集。

您可以尝试使用库 mpmath,它可以对任意精度数进行简单的矩阵代数和其他此类问题。

一些注意事项: 它几乎肯定会比使用 numpy 慢,而且,正如 Lutzl 在 中指出的那样,问题很可能不是数学上的定义明确。另外,你需要在开始之前决定你想要的精度。

一些简短的示例代码,

from mpmath import mp, matrix

# set the precision - see http://mpmath.org/doc/current/basics.html#setting-the-precision
mp.prec = 5000 # set it to something big at the cost of speed.
   # Ideally you'd precalculate what you need.
   # a quick trial with 100*100 showed that 5000 works and 500 fails

# see the documentation at http://mpmath.org/doc/current/matrices.html
# where xtotal is the output from arrayit
my_matrix = matrix(xtotal) # I think this should work. If not you'll have to create it and copy

# do the inverse
xinverted = my_matrix**-1
coeff = xinverted*matrix(ylist)
# note that as lutlz pointed out you really want to use solve instead of calculating the inverse. 
# I think this is something like
from mpmath import lu_solve
coeff = lu_solve(my_matrix,matrix(ylist))

我怀疑你真正的问题出在数学上而不是软件上,所以我怀疑这对你来说是否会非常好,但它总是有可能的!