标签: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), 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
我认为这对于家庭作业来说已经足够好了.但是如果你想真正部署一些计算健壮的东西,你应该研究反转的替代方案.
numerically stable inverse of a 2×2 matrix
标签:python,numpy,transpose,inverse,singular 来源: https://codeday.me/bug/20190609/1206042.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。