优化 Python 中用于阻抗计算的矩阵反转

Optimise matrix inversion in Python for impedance calculation

提问人:Dev 提问时间:7/23/2023 最后编辑:Ξένη ΓήινοςDev 更新时间:7/23/2023 访问量:65

问:

为了获得电路的阻抗曲线,我使用了电路的导纳(G)和电容(C)矩阵。

我正在使用 Python 计算不同频率下的阻抗曲线,但问题是我需要反转矩阵以从导纳中获得阻抗,结果证明这是一个非常昂贵的循环操作。

对于我拥有的大型矩阵 (1000*1000),使用大约 1 秒反转矩阵,因此对于在下面运行 10^6 次迭代的循环,我得到了不合理的大执行时间。numpy.linalg.inv

需要一些关于如何优化这一点的指导,或者是否有任何方法可以绕过矩阵反转,但又能得到阻抗矩阵。

我的代码如下:

A = j*2*3.14*C #j 2pi C to create susceptance matrix when multiplied by freq below.
for freq in range (1, 100000000, 100):
    Y = G + A * freq #admittance matrix
    Z = np.linalg.inv(Y) #inverse the matrix to get impedance matrix
    output[freq] = Z

我已经尝试过而不是使用反转。但执行时间仍然过长。numpy.linalg.solve

Python 优化 运行时 矩阵逆

评论

1赞 Jérôme Richard 7/23/2023
np.linalg.inv之所以昂贵,是因为它及时运行。这是这里的主要瓶颈。AFAIK,只要您使用快速 BLAS,它就已经非常优化了(大多数机器默认都是这种情况)。您可以在计算过程中检查所有内核是否正在做一些工作。没有已知的真正更快的算法,所以这基本上是你能做的最好的(尽管通过一些小的优化,代码可能会稍微快一些)。运行大小为 1000x1000 的 100_000 矩阵反转是不合理的。矩阵是否特殊(例如稀疏)?O(n**3)
0赞 Dev 7/23/2023
是的,矩阵是稀疏的(大多数元素为零)。我们可以利用一些属性来减少这里的计算吗?
1赞 Jérôme Richard 7/24/2023
这可能会有所帮助。哪些矩阵是稀疏的,它们有多稀疏(即零与项目数的比率)?尤其重要。Y
0赞 relent95 7/24/2023
使用 GPU 怎么样?例如,请参阅 cupy.linalg.inv
1赞 Reinderien 7/26/2023
就目前而言,这是不可重现的:我们没有您的变量 C 等。请提供具有代表性的数据样本,以便我们可以在本地运行。

答: 暂无答案