Scipy稀疏矩阵因式分解无内存重新分配

2024-09-30 10:41:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在Python中使用scipy稀疏矩阵进行非线性有限元求解。解算器生成一个名为KTscipy.sparse.csc_matrix())的切线刚度矩阵,该矩阵在运行时会更新几次,但形状和载荷向量不会改变F。然后迭代位移deltaU计算为KT * deltaU = F

当前程序(示意图)为:

import scipy.sparse as sps
while error > max_error:
    KT = updateKT()
    F = updateF()
    solveRHS = sps.linalg.factorized(KT)
    deltaU = solveRHS(F)
    error = calculate_error(F,deltaU,...)

如果我模拟相当大的模型,分解会消耗几GB的内存。因此,在第一次迭代之后,在KT11的因式分解过程中,需要双内存(solveRHS+spslinalg.factoried(self.KT)的内存)

在解出SLAE之后删除solveRHS

import scipy.sparse as sps
while error > max_error:
    KT = updateKT()
    F = updateF()
    solveRHS = sps.linalg.factorized(KT)
    deltaU = solveRHS(F)
    del solveRHS
    error = calculate_error(F,deltaU,...)

我可以减少内存占用,但代价是为每次迭代中的因式分解分配内存,每次迭代只需几秒钟

有没有可能“new”solver函数直接写入solveRHS,而不必重新分配内存


Tags: 内存importas矩阵errorscipymaxsparse
1条回答
网友
1楼 · 发布于 2024-09-30 10:41:58

根据sps.linalg.factorized sourcehttps://github.com/scipy/scipy/blob/v0.16.1/scipy/sparse/linalg/dsolve/linsolve.py#L318,factorized调用splu(A).solve使用函数编程。所以可以像函数一样将参数输入sps.linalg.factorized(KT)

import scipy.sparse as sps
while error > max_error:
    KT = updateKT()
    F = updateF()
    deltaU = sps.linalg.factorized(KT)(F)
    error = calculate_error(F,deltaU,...)

另一种解决方案是,您可以通过数据透视实现自己的LU分解,这样可以更有效地优化代码,但风险也更大

希望这有帮助!快乐的编码

相关问题 更多 >

    热门问题