奇异矩阵-python
下面的代码显示了矩阵的奇异性问题,因为在Pycharm中工作奇异矩阵-python,python,numpy,transpose,inverse,singular,Python,Numpy,Transpose,Inverse,Singular,下面的代码显示了矩阵的奇异性问题,因为在Pycharm中工作 raise LinAlgError("Singular matrix") numpy.linalg.linalg.LinAlgError: Singular matrix 我想问题是K,但我无法确切理解: from numpy import zeros from numpy.linalg import linalg import math def getA(kappa): matrix = zeros((n, n), f
raise LinAlgError("Singular matrix")
numpy.linalg.linalg.LinAlgError: Singular matrix
我想问题是K,但我无法确切理解:
from numpy import zeros
from numpy.linalg import linalg
import math
def getA(kappa):
matrix = zeros((n, n), float)
for i in range(n):
for j in range(n):
matrix[i][j] = 2*math.cos((2*math.pi/n)*(abs(j-i))*kappa)
return matrix
def getF(csi, a):
csiInv = linalg.inv(csi)
valueF = csiInv * a * csiInv * a
traceF = valueF.trace()
return 0.5 * traceF
def getG(csi, f, a):
csiInv = linalg.inv(csi)
valueG = (csiInv * a * csiInv) / (2 * f)
return valueG
def getE(g, k):
KInv = linalg.inv(k)
Ktrans = linalg.transpose(k)
KtransInv = linalg.inv(Ktrans)
e = KtransInv * g * KInv
return e
file = open('transformed.txt', 'r')
n = 4
transformed = zeros(n)
for counter, line in enumerate(file):
if counter == n:
break
transformed[counter] = float(line)
CSI = zeros((n, n))
for i in range(n):
for j in range(n):
CSI[i][j] = transformed[abs(i-j)]
A = getA(1)
F = getF(CSI, A)
G = getG(CSI, F, A)
K = zeros((n, n), float)
for j in range(n):
K[0][j] = 0.0001
for i in range(1, n):
for j in range(n):
K[i][j] = ((3.0*70.0*70.0*0.3)/(2.0*300000.0*300000.0))*((j*(i-j))/i)*(1.0+(70.0/300000.0)*j)
E = getE(G, K)
print G
print K
有人有什么建议来解决这个问题吗?谢谢将非常“接近”奇异的矩阵求逆通常会导致计算问题。一个快速的技巧是在求逆之前在矩阵的对角线上加一个很小的值
def getE(g, k):
m = 10^-6
KInv = linalg.inv(k + numpy.eye(k.shape[1])*m)
Ktrans = linalg.transpose(k)
KtransInv = linalg.inv(Ktrans + + numpy.eye(Ktrans.shape[1])*m)
e = KtransInv * g * KInv
return e
我认为这足以胜任家庭作业。但是如果你真的想部署一些计算健壮的东西,你应该研究反转的替代方案
堆栈跟踪显示错误发生在哪里?你是说这个吗?回溯(最近一次调用):文件“/home/me/PP/Est/Est.py”,第68行,在E=getE(G,K)文件“/home/me/PP/Est/Est.py”,第33行,在getE-KInv=linalg.inv(K)文件“/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py”,第520行,在inv ainv=_umath_linalg.inv(a,signature=signature,exterbj=exterbj)文件“/usr/lib/python2.7/dist packages/numpy/linalg/linalg.py”中,第90行,在_raise\u linalgeror\u singulare raise linalgeror(“singular matrix”)numpy.linalg.linalgeror:singular matrix中。这告诉我们,
getE
正在抛出错误。具体地说,逆运算就是违规操作。好的,谢谢!这正是我所想的,但你知道为什么吗?还有一种可能是使用实现伪逆()的库。非常感谢!但是使用您的建议def getE(g,k):m=10^(-6)KInv=linalg.inv(k+np.eye(k.size)*m)Ktrans=k.transpose()KtransInv=linalg.inv(Ktrans)e=KtransInv*g*KInv返回eI get:ValueError:操作数不能与形状(4,4)(16,16)一起广播好的,我认为用4替换k.size可以使它工作,但我仍然得到,提出LinalError(“奇异矩阵”)numpy.linalg.linalg.linalgeror:Singular matrix