逆矩阵 (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))
我怀疑你真正的问题出在数学上而不是软件上,所以我怀疑这对你来说是否会非常好,但它总是有可能的!
我正在尝试取 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))
我怀疑你真正的问题出在数学上而不是软件上,所以我怀疑这对你来说是否会非常好,但它总是有可能的!