【问题标题】:Singular matrix - python奇异矩阵 - python
【发布时间】:2016-11-10 05:28:36
【问题描述】:

以下代码显示了矩阵的奇异性问题,因为在 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

有没有人有任何修复它的建议?谢谢

【问题讨论】:

  • 堆栈跟踪表明错误发生在哪里?
  • 你的意思是这个吗?回溯(最近一次调用最后):文件“/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, extobj=extobj) 文件“/usr/lib/python2.7/dist-packages/numpy/linalg/linalg.py”,第 90 行,在 _raise_linalgerror_singular raise LinAlgError("Singular matrix") numpy.linalg.linalg.LinAlgError: Singular matrix
  • 是的。这告诉我们getE 正在抛出错误。具体来说,逆操作是有问题的操作。
  • 好的,谢谢!这正是我的想法,但你知道为什么吗?以及如何解决?
  • 另一种可能性是使用实现伪逆的库(en.wikipedia.org/wiki/Moore%E2%80%93Penrose_pseudoinverse)。

标签: python numpy transpose inverse singular


【解决方案1】:

对非常“接近”奇异的矩阵求逆通常会导致计算问题。一个快速的技巧是在求逆之前向矩阵的对角线添加一个非常小的值。

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 2x2 matrix

【讨论】:

  • 非常感谢!但是使用你的建议
  • 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 返回 e
  • 我得到:ValueError:操作数不能与形状一起广播 (4,4) (16,16)
  • 好的,我认为将 k.size 替换为 4 就可以了,但我还是明白了,
  • raise LinAlgError("奇异矩阵") numpy.linalg.linalg.LinAlgError: 奇异矩阵
猜你喜欢
  • 1970-01-01
  • 2012-12-25
  • 1970-01-01
  • 1970-01-01
  • 2018-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多