当前位置:服务支持 >  软件文章 >  自定义求解器进阶:LDLT分解法原理与应用详解

自定义求解器进阶:LDLT分解法原理与应用详解

阅读数 335
点赞 0
article_banner

分解法解方程组是一些有限元软件的主流求解器常用的方法,比如PKPM软件就采用这个方法。

对称正定矩阵 可以分解为 ,这里 为下三角矩阵且主对角元素皆为1。 ,则 这种分解也是 分解的特殊形式。

对于方程组 ,可以写成 ,令 ,依次解三个简单方程组即可。

考察一个3X3矩阵:

之后的矩阵分解算法同 分解。

对于多工况分析时形成的荷载矩阵 ,若令 ,则 ,亦即 ,求解更简单。


import numpy as np

def LDLTSolver(A, b):
    n = len(A)
    D = np.zeros((n))
    for k in range(n):
        D[k] = A[k, k] - np.dot(A[k, 0:k], A[0:k, k])
        for i in range(k+1, n):           
            A[i, k] = ( A[i, k] - np.dot(A[i, 0:k], A[0:k, k]) ) / D[k]
            A[0:i, i] = D[0:i] * A[i, 0:i]            

    for k in range(1,n): 
        A[0:k,k] = 0.0

    for k in range(n):
        A[k,k] = 1

    # 求解 [L]{y} = {b} 
    y = np.zeros((n))
    for k in range(n):
        h = b[k] - np.dot(A[k,0:k], y[0:k]) 
        y[k] = h

    
    # 求解 [D]{z} = {y}
    b = y/D
    # 求解 [L^T]{x} = {z} 
    for k in range(n-1,-1,-1):
        h = b[k] - np.dot(A[k+1:n,k], b[k+1:n])
        b[k] = h

    return b
    


A = np.array([   [1,  0.50.5],
                [0.5,   10.5],
                [ 0.50.51] ])

b = np.array([1-23])
x = LDLTSolver(A, b)


print(x)


免责声明:本文系网络转载或改编,未找到原创作者,版权归原作者所有。如涉及版权,请联系删
相关文章
QR Code
微信扫一扫,欢迎咨询~

联系我们
武汉格发信息技术有限公司
湖北省武汉市经开区科技园西路6号103孵化器
电话:155-2731-8020 座机:027-59821821
邮件:tanzw@gofarlic.com
Copyright © 2023 Gofarsoft Co.,Ltd. 保留所有权利
遇到许可问题?该如何解决!?
评估许可证实际采购量? 
不清楚软件许可证使用数据? 
收到软件厂商律师函!?  
想要少购买点许可证,节省费用? 
收到软件厂商侵权通告!?  
有正版license,但许可证不够用,需要新购? 
联系方式 155-2731-8020
预留信息,一起解决您的问题
* 姓名:
* 手机:

* 公司名称:

姓名不为空

手机不正确

公司不为空