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

时间:2015-04-25 21:42:15

标签: python numpy matrix overflow matrix-inverse

我试图采用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列表)并生成一个函数。 谢谢!

2 个答案:

答案 0 :(得分:0)

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

作为一般观察,您不需要逆矩阵。您不需要计算它。你想要的是求解线性方程组。

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

解决了系统A*x=b

你(真的)可能想查找 Runge效果。使用等间隔采样点进行插值是一项越来越恶劣的任务。对于单位数度数可以获得有用的结果,较大的度数往往会产生大量振荡的多项式。

你经常可以使用多项式回归,即用一些低度的最佳多项式逼近你的数据集。

答案 1 :(得分:0)

您可能尝试的一件事是库mpmath,它可以对任意精度数字执行简单的矩阵代数和其他此类问题。

一些警告:几乎肯定会比使用numpy慢,并且正如Lutzl在his answer to this question中指出的那样,这个问题可能无法在数学上得到很好的定义。此外,您需要在开始之前决定所需的精度。

一些简短的示例代码,

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))

我怀疑你的真正问题在于数学而不是软件,所以我怀疑这对你来说效果会非常好,但它始终是可能的!