首页/文章/ 详情

自定义求解器之Cholesky分解法

7月前浏览5563

对称正定矩阵    可以分解为    ,这种分解被称为Cholesky分解,是LU分解的一个重要特例,可以显著降低计算量。在计算机程序中常常用到这种方法解线性代数方程组。它的优点是节省存储量,得到的L矩阵可以覆盖原来的A矩阵。

对于方程组    ,可以写成    ,令    ,则    

考察一个3X3矩阵:

 
 

 
 
 
 
 
 

   分解的算法:

 
 
 
import numpy as np
import math

class LinerSolver:
    def __init__(self, A, b):
        self.A = A
        self.b = b

    def CholeskiSolver(self):
        n = len(self.A)
        # 分解 [A] = [L] [L^T]
        for k in range(n):
            self.A[k,k] = math.sqrt(self.A[k,k] - np.dot(self.A[k,0:k], self.A[k,0:k]))
            for i in range(k+1,n):
                self.A[i,k] = (self.A[i,k] - np.dot(self.A[i,0:k], self.A[k,0:k])) / self.A[k,k]
        for k in range(1,n): 
            self.A[0:k,k] = 0.0
        
        # 求解 [L]{y} = {b} 
        for k in range(n):
            self.b[k] = (self.b[k] - np.dot(self.A[k,0:k], self.b[0:k])) / self.A[k,k]
        # 求解 [L^T]{x} = {y} 
        for k in range(n-1,-1,-1):
            self.b[k] = (self.b[k] - np.dot(self.A[k+1:n,k], self.b[k+1:n])) / self.A[k,k]
        
        return self.b



A = np.array([  [ 4,   -1,     1],
                [-1,  4.25,  2.75],
                [1,   2.75,   3.5] ])



b = np.array([467.25])

cls =  LinerSolver(A, b) #创建一个求解器的实例cls

x = cls.CholeskiSolver() #调用Choleski法求解
print(x)


与高斯消去法相比,LL分解的优点在于,一旦A被分解,我们就可以对任意多个常量向量b求解Ax=b。每个附加解决方案的成本相对较小,因为前向和后向替换操作比分解过程花费的时间少得多.


来源:数值分析与有限元编程
UM
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2024-04-02
最近编辑:7月前
太白金星
本科 慢慢来
获赞 5粉丝 14文章 326课程 0
点赞
收藏
作者推荐

非线性|弧长法改进

非线性 | 弧长法(Arc-Length Methods)非线性| 弧长法算例弧长法改进算法之一是用垂直于迭代向量的平面代替圆弧,如图所示:用第 个迭代步的增量向量 垂直于 个迭代步的迭代向量 个迭代步的迭代(累积)向量为: 第 个迭代步的增量向量为: 这里荷载增量 手动给出,再由牛顿-拉夫逊方法得到 .令 可得到 弧长法通过自动建立适当的荷载增量进一步优化了牛顿-拉夫逊方法,使用弧长法,可以跟踪复杂的荷载-变形路径。弧长法通过自动建立适当的荷载增量进一步优化了牛顿-拉夫逊方法,使用弧长法,可以跟踪复杂的荷载-变形路径。弧长法通过自动建立适当的荷载增量进一步优化了牛顿-拉夫逊方法,使用弧长法,可以跟踪复杂的荷载-变形路径。弧长法通过自动建立适当的荷载增量进一步优化了牛顿-拉夫逊方法,使用弧长法,可以跟踪复杂的荷载-变形路径。来源:数值分析与有限元编程

未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈