我试图采用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列表)并生成一个函数。 谢谢!
答案 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))
我怀疑你的真正问题在于数学而不是软件,所以我怀疑这对你来说效果会非常好,但它始终是可能的!