用Numpy求解大型线性方程组

pokxtpni  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(108)

我试图解决一个方程组,它是一个1百万x 1百万的方阵和一个1百万的解向量。
为此,我使用了np.linalg.solve(matrix,answers),但这需要很长时间。
有没有办法加快速度?
谢谢你@Chris,但这并不能回答问题,因为我也尝试过使用Scipy模块,它仍然需要很长的时间来解决。我认为我的电脑内存装不下那么多数据
好的,为了清楚起见,我刚刚发现我想解的矩阵的名字是希尔伯特矩阵

7xzttuei

7xzttuei1#

请重新考虑解决这样一个巨大的系统的必要性,除非你的系统非常稀疏。
实际上,这几乎不可能将输入/输出存储在PC存储设备上:输入密集矩阵需要8TB的双精度值,并且输出肯定也需要很少的TB,更不用说需要临时数据存储来计算结果(对于密集矩阵至少8TB)。如果你的输入矩阵几乎全是零,稀疏矩阵可以帮助很多,但你需要矩阵包含> 99.95%的零,以便将其存储在RAM中。
此外,求解一个系统的时间复杂度是O(n m min(n,m)),所以在你的例子中是O(n^3)(参见:this post)。这意味着数十亿的操作。一个基本的主流处理器不超过0.5 TFlops。事实上,我相对不错的i5 - 9600KF在LINPACK计算密集型基准测试中达到了0.3 TFlops。这意味着计算肯定需要一个月的时间来计算,假设它只受主流处理器速度的限制。实际上,求解一个大型方程组是已知的 * 内存限制 *,因此在实践中会慢得多,因为现代RAM是现代计算机的瓶颈(参见:记忆墙)。因此,对于主流PC来说,这应该需要几个月到一年的时间,假设计算可以在RAM中完成,这是不可能的,因为之前所说的密集系统。由于高端SSD比好的PC的RAM慢一个数量级,因此您应该预计计算需要几年。更不用说一个20 TB的高端SSD是 * 非常昂贵 *,它可能是一个好主意,考虑停电和操作系统故障这么长的计算时间...同样,稀疏矩阵可以提供很多帮助,但请注意,解决稀疏系统比解决密集系统要慢得多,除非零的数量非常小。
这样的系统是在超级计算机(或至少是大型计算集群)上解决的,而不是普通的PC。这需要使用 * 分布式计算 * 和工具,如MPI和分布式线性求解器。整个研究领域都在致力于这个主题,以使它们在大规模系统上更有效。
请注意,计算近似值可以更快,但首先应该解决空间问题......

zhte4eai

zhte4eai2#

你可以试试维基百科上给出的希尔伯特矩阵的逆的公式:https://en.wikipedia.org/wiki/Hilbert_matrix
与@jérôme-richard给出的答案类似,你不能将整个逆矩阵存储在内存中。相反,您必须编写一个函数,每次生成逆希尔伯特矩阵的一列,然后将右侧向量与此列相乘。这样做100万次(对于每列)就可以得到解向量。迟来的答案,但希望它仍然有帮助!

相关问题