改进平方根法解对称正定方程组

博客围绕改进平方根法展开,介绍了对称阵的三角分解定理,给出计算L的元素及D的对角元素公式。还展示了用Python实现改进平方根法,并用该方法求解对称正定方程组,最后进行了测试并给出运行截图。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.改进平方根法

对称阵的三角分解定理

A A A n n n阶对称矩阵,且 A A A的所有顺序主子式均不为零,则 A A A可唯一分解为 A = L D L T , A=LDL^T, A=LDLT,
其中 L L L为单位下三角矩阵, D D D为对角矩阵.即
A = [ 1 l 21 1 ⋮ ⋮ ⋱ l n 1 l n 2 … 1 ] [ d 1 d 2 ⋱ d n ] [ 1 l 21 … l n 1 1 … l n 2 ⋱ ⋮ 1 ] A=\begin{bmatrix} 1&&&\\ l_{21}&1&&\\ \vdots&\vdots&\ddots&\\ l_{n1}&l_{n2}&\ldots&1 \end{bmatrix} \begin{bmatrix} d_1&&&\\ &d_2&&\\ &&\ddots&\\ &&&d_n \end{bmatrix} \begin{bmatrix} 1&l_{21}&\ldots&l_{n1}\\ &1&\ldots&l_{n2}\\ &&\ddots&\vdots\\ &&&1\end{bmatrix} A= 1l21ln11ln21 d1d2dn 1l211ln1ln21
由矩阵乘法,并注意 l j j = 1 , l j k = 0 ( j < k ) , 得 l_{jj}=1,l_{jk}=0(j<k),得 ljj=1,ljk=0(j<k),
a i j = ∑ k = 1 n ( L D ) i k ( L T ) k j = ∑ k = 1 n l i k d k l j k = ∑ k = 1 j − 1 l i k d k l j k + l i j d j l j j a_{ij}=\sum_{k = 1}^{n}(LD)_{ik}(L^T)_{kj}=\sum_{k = 1}^{n}l_{ik}d_kl_{jk}=\sum_{k = 1}^{j-1}l_{ik}d_kl_{jk}+l_{ij}d_jl_{jj} aij=k=1n(LD)ik(LT)kj=k=1nlikdkljk=k=1j1likdkljk+lijdjljj
于是得到计算 L L L的元素及 D D D的对角元素公式:
对于 i = 1 , 2 , … , n . i=1,2,\ldots,n. i=1,2,,n.
( 1 ) l i j = ( a i j − ∑ k = 1 j − 1 l i k d k l j k ) / d j , j = 1 , 2 , … , i − 1 (1)l_{ij}=(a_{ij}-\sum\limits_{k = 1}^{j-1}l_{ik}d_kl_{jk})/d_j,j=1,2,\ldots,i-1 (1)lij=(aijk=1j1likdkljk)/dj,j=1,2,,i1
( 2 ) d i = a i i − ∑ k = 1 i − 1 l i k 2 d k . ( i ) (2)d_i=a_{ii}-\sum\limits_{k = 1}^{i-1}l_{ik}^2d_k.(i) (2)di=aiik=1i1lik2dk.(i)
为了避免重复计算,引进 t i j = l i j d j , t_{ij}=l_{ij}d_j, tij=lijdj,由(i)式得到按行计算 L , T L,T L,T元素的公式: d 1 = a 11 . d_1=a_{11}. d1=a11.
对于 i = 2 , 3 , … , n . i=2,3,\ldots,n. i=2,3,,n.
( 1 ) t i j = a i j − ∑ k = 1 j − 1 t i k l j k , j = 1 , 2 , … , i − 1 ; (1)t_{ij}=a_{ij}-\sum\limits_{k=1}^{j-1}t_{ik}l_{jk},j=1,2,\ldots,i-1; (1)tij=aijk=1j1tikljk,j=1,2,,i1;
( 2 ) l i j = t i j / d j , j = 1 , 2 , … , i − 1 ; (2)l_{ij}=t_{ij}/d_j,j=1,2,\ldots,i-1; (2)lij=tij/dj,j=1,2,,i1;
( 3 ) d i = a i i − ∑ k = 1 i − 1 t i k l i k . (3)d_i=a_{ii}-\sum\limits_{k = 1}^{i-1}t_{ik}l_{ik}. (3)di=aiik=1i1tiklik.
求解 L y = b , D L T x = y Ly=b,DL^Tx=y Ly=b,DLTx=y计算公式:
( 4 ) { y 1 = b 1 ; y i = b i − ∑ k = 1 i − 1 l i k y k , i = 2 , 3 , … , n . (4)\begin{cases} y_1=b_1;\\ y_i=b_i-\sum\limits_{k = 1}^{i-1}l_{ik}y_k,i=2,3,\ldots,n. \end{cases} (4) y1=b1;yi=bik=1i1likyk,i=2,3,,n.
5 ) { x n = y n / d n ; x i = y i / d i − ∑ k = i + 1 n l k i x k , i = n − 1 , n − 2 , … , 1. 5)\begin{cases} x_n=y_n/d_n;\\ x_i=y_i/d_i-\sum\limits_{k=i+1}^{n}l_{ki}x_k,i=n-1,n-2,\ldots,1. \end{cases} 5) xn=yn/dn;xi=yi/dik=i+1nlkixk,i=n1,n2,,1.

2.Python实现改进平方根

# 自己原创改进平方根
def improved_square_root(symmetric_positive_define_matrix: np.ndarray, right_hand_side_vector: np.ndarray):
    rows, columns = symmetric_positive_define_matrix.shape
    # judge if it is a square matrix
    if rows == columns:
        # 判断是否对称
        if (symmetric_positive_define_matrix.T == symmetric_positive_define_matrix).all():
            for k in range(rows):  # 判断各阶顺序主子式是否为0,即判定是否正定
                if det(symmetric_positive_define_matrix[:k + 1, :k + 1]) == 0:
                    raise Exception("error, cannot decompose")
            else:
                # 初始化单位下三角矩阵L
                square_ones_matrix = np.ones((rows, columns))
                lower_triangle_matrix = np.tril(square_ones_matrix)
                diagonal_matrix = np.diag(np.diag(square_ones_matrix))
                t = lower_triangle_matrix @ diagonal_matrix
                diagonal_matrix[0, 0] = symmetric_positive_define_matrix[0, 0]
                for i in range(1, rows):
                    for j in range(i):
                        prod = 0
                        for k in range(j):
                            prod += t[i, k] * lower_triangle_matrix[j, k]
                        t[i, j] = symmetric_positive_define_matrix[i, j] - prod
                        lower_triangle_matrix[i, j] = t[i, j] / diagonal_matrix[j, j]
                    prod = 0
                    for k in range(i):
                        prod += t[i, k] * lower_triangle_matrix[i, k]
                    diagonal_matrix[i, i] = symmetric_positive_define_matrix[i, i] - prod

                return inv(
                    lower_triangle_matrix @ diagonal_matrix @ lower_triangle_matrix.T) @ right_hand_side_vector
                # 自己写的发现第一个解x0=1.,而不是1.11111111,有精度损失,所以采用矩阵运算
                # # Ly=b,此处不指定双精度浮点数据类型,则可能会损失精度,导致结果偏差太大
                # y = np.ones_like(right_hand_side_vector, dtype=np.float64)
                # for i in range(rows):
                #     prod = 0
                #     for k in range(i):
                #         prod += lower_triangle_matrix[i, k] * y[k, 0]
                #     y[i, 0] = right_hand_side_vector[i, 0] - prod
                # # DL^Tx=y,此处不指定双精度浮点数据类型,则可能会损失精度,导致结果偏差太大
                # x = np.ones_like(right_hand_side_vector, dtype=np.float64)
                # x[rows - 1, 0] = y[rows - 1, 0] / diagonal_matrix[rows - 1, rows - 1]
                # for i in range(rows - 2, 0, -1):
                #     prod = 0
                #     for k in range(i + 1, rows):
                #         prod += lower_triangle_matrix[k, i] * x[k, 0]
                #     x[i, 0] = y[i, 0] / diagonal_matrix[i, i] - prod
                # return x

                # for i in range(rows):
                #     for j in range(i):
                #         prod = 0
                #         for k in range(j):
                #             prod += lower_triangle_matrix[i, k] * diagonal_matrix[k, k] * lower_triangle_matrix[j, k]
                #         lower_triangle_matrix[i, j] = (symmetric_positive_define_matrix[i, j] - prod) / diagonal_matrix[
                #             j, j]
                #     prod = 0
                #     for k in range(i):
                #         prod += lower_triangle_matrix[i, k] * diagonal_matrix[k, k] * lower_triangle_matrix[i, k]
                #     diagonal_matrix[i, i] = symmetric_positive_define_matrix[i, i] - prod
        else:
            raise Exception("error,the input matrix must be a symmetric-matrix")
    else:
        raise Exception("ERROR:please pass a square matrix.")

3.用改进平方根解对称正定方程组

[ 2 − 1 1 − 1 − 2 3 1 3 1 ] [ x 1 x 2 x 3 ] = [ 4 5 6 ] . \begin{bmatrix} 2&-1&1\\ -1&-2&3\\ 1&3&1 \end{bmatrix} \begin{bmatrix} x_1\\ x_2\\ x_3 \end{bmatrix}= \begin{bmatrix} 4\\ 5\\ 6 \end{bmatrix}. 211123131 x1x2x3 = 456 .

4.测试

if __name__ == '__main__':
    # 改进平方根法测试成功,来源详见李庆扬数值分析第5版P177,e.g.10
    symmetric_positive_define_matrix1 = np.array([[2, -1, 1], [-1, -2, 3], [1, 3, 1]])
    column_vector = np.array([4, 5, 6]).reshape((3, 1))
    print(improved_square_root(symmetric_positive_define_matrix1, column_vector))

5.运行截图

在这里插入图片描述

<think>嗯,用户想要了平方根法对称正定矩阵方程组的逻辑框图。首先,我需要回忆一下平方根法,也就是Cholesky分解法的基本步骤。平方根法适用于对称正定矩阵,对吧?那它的主要步骤应该包括分解、求三角方程组和转置的上三角方程组。 首先,我得确认用户的需求。他们可能需要一个流程图或者逻辑框图来说明整个过程。不过用户提到的是“逻辑框图”,所以可能需要分步骤的文字描述,或者结构化的流程,而不是图形。但可能需要用文字来构建这个框图的结构。 接下来,我需要考虑逻辑框图的组成部分。通常,这样的算法分为几个阶段:分解矩阵A为LL^T,前代求y,再回代求x。每一步都需要详细说明。 然后,要注意平方根法的条件,矩阵必须对称正定。所以在框图中可能需要先验证这个条件,不过在实际计算中,通常假设已经满足,所以可能不需要特别判断,但用户可能需要知道前提条件。 分解步骤中,Cholesky分解的具体计算,比如对每个元素计算平方根,然后更新后面的列。这部分可能需要循环结构,按行或列进行处理。 前代过程是Ly=b,回代是L^Tx=y。这两个步骤都是三角方程组,前代是下三角,回代是上三角,但因为是转置,所以可能需要从下往上。 需要确保每个步骤的公式正确,并且用LaTeX格式,按照用户的要求,行内公式用$...$,独立公式用$$...$$,并且正确换行。例如,分解后的矩阵L,前代和回代的方程。 然后,逻辑框图的结构应该分步骤,可能用步骤1、步骤2、步骤3这样的结构,每个步骤中的子步骤也要明确。例如,分解阶段如何计算每个元素,前代如何逐行求y,回代如何从后往前求x。 还需要注意用户可能需要每个步骤的数学表达式,所以需要用正确的LaTeX语法,比如分解的公式,前代的公式,回代的公式。例如,L的元素计算是$l_{jj} = \sqrt{a_{jj} - \sum_{k=1}^{j-1} l_{jk}^2}$,然后$l_{ij} = \frac{a_{ij} - \sum_{k=1}^{j-1} l_{ik}l_{jk}}{l_{jj}}$。 同时,要确保回答结构清晰,分点说明,可能用编号列表,每个大步骤下有小步骤。例如: 1. Cholesky分解:将A分解为LL^T - 计算L的对角线元素 - 计算L的非对角线元素 2. 前代过程:Ly=b - 按顺序计算y_i 3. 回代过程:L^Tx=y - 逆序计算x_i 每个步骤中的具体公式需要用独立公式块,比如使用$$...$$,而变量如i, j等用行内公式。 另外,要确认是否需要在逻辑框图中包含输入和输出,比如输入矩阵A和向量b,输出向量x。可能需要在步骤前加上输入,步骤后加上输出。 还要考虑可能的异常情况,比如矩阵不是正定的,但用户可能只需要正常流程,所以可能不需要处理异常,但需要指出前提条件。 最后,整理整个流程,确保逻辑正确,步骤连贯,数学公式正确无误,并且符合用户要求的格式,比如使用中文,LaTeX格式正确。</think>用平方根法(Cholesky分解法)对称正定矩阵方程组的逻辑框图如下: --- ### **1. 输入条件验证** - **输入**:对称正定矩阵 $A$,右端向量 $b$ - **验证条件**:$A$ 必须满足对称性和正定性(实际计算中通常假设已满足) --- ### **2. Cholesky分解** 将矩阵 $A$ 分解为下三角矩阵 $L$ 与其转置的乘积: $$ A = LL^T $$ **分解过程**: 1. **初始化**:$L$ 为全零矩阵 2. **逐列计算**: - 对 $j=1$ 到 $n$: - 计算对角线元素: $$ l_{jj} = \sqrt{a_{jj} - \sum_{k=1}^{j-1} l_{jk}^2} $$ - 对 $i=j+1$ 到 $n$: $$ l_{ij} = \frac{a_{ij} - \sum_{k=1}^{j-1} l_{ik}l_{jk}}{l_{jj}} $$ --- ### **3. 前代过程(三角方程组 $Ly = b$)** **计算中间变量 $y$**: 1. 对 $i=1$ 到 $n$: $$ y_i = \frac{b_i - \sum_{k=1}^{i-1} l_{ik}y_k}{l_{ii}} $$ --- ### **4. 回代过程(三角方程组 $L^Tx = y$)** **计算最终 $x$**: 1. 对 $i=n$ 到 $1$(逆序): $$ x_i = \frac{y_i - \sum_{k=i+1}^n l_{ki}x_k}{l_{ii}} $$ --- ### **5. 输出结果** - **输出**:向量 $x$ --- ### **逻辑框图总结** ```plaintext 开始 │ ├─ 输入A和b │ ↓ ├─ Cholesky分解:A → LL^T │ ↓ ├─ 前代过程:Ly = b → 得y │ ↓ ├─ 回代过程:L^Tx = y → 得x │ ↓ └─ 输出x 结束 ``` --- ### **关键说明** 1. **对称性利用**:仅需存储下三角部分,节省内存。 2. **稳定性**:平方根法正定条件下数值稳定,无需选主元。 3. **复杂度**:计算量为 $\frac{n^3}{6}$ 量级,优于高斯消元法。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值