假设我定义了一个大的二次矩阵(例如150x150)。一次是numpy数组(matrixa),一次是scipy稀疏数组(matrixB)。在
import numpy as np
import scipy as sp
from scipy.sparse.linalg import spsolve
size = 150
A = np.zeros((size, size))
length = 1000
# Set some random numbers at random places
A[np.random.randint(0, size, (2, length)).tolist()] = \
np.random.randint(0, size, (length, ))
B = sp.sparse.csc_matrix(A)
现在我计算两个矩阵的逆。对于矩阵B我使用两种方法来计算逆(sp.sparse.linalg.inv
和{
为了检查A和B的两个倒数是否相等,我将求出差值的平方。在
# Is not equal zero, question: Why?
# Sometimes very small (~+-10**-27), sometimes very big (~+-10**5)
print("np.sum((inv_A - inv_B)**2): {}".format(np.sum((inv_A - inv_B)**2)))
# Should be zero
print("np.sum((inv_B - inv_B2)**2): {}".format(np.sum((inv_B - inv_B2)**2)))
问题是:如果我使用小矩阵,例如10x10,numpy作为scipy逆函数之间的误差非常小(大约~+-10**-32)。但我需要大矩阵的稀疏版本(例如500x500)。在
我是不是做错了什么,或者有没有可能在python中计算稀疏矩阵的正确的逆函数?在
你的标题问题的答案是:因为你不幸地选择了示例矩阵。让我详细说明一下。在
机器精度是有限的,因此浮点运算很难达到100%的精度。试试看
通常情况下,这是没有问题的,因为错误太小而无法察觉。在
然而,对于许多计算,有些输入很难处理,并且可能会使数值算法过度拉伸。这当然适用于矩阵求逆,而你不幸地选择了如此困难的输入。在
实际上,可以通过查看矩阵的单数值来检查矩阵是否“病态”,请参见示例here。下面是用脚本生成的几个矩阵的矩阵条件数(
^{pr2}$size=200
;行为良好的矩阵的值更接近1)切换到行为良好的矩阵,你的结果应该会大大改善。在
相关问题 更多 >
编程相关推荐