Square Root Method

平方根法

在有限元法求解结构力学和最优化方法等诸多问题中,都需要求解一个系数矩阵是正定的线性方程组Ax=b。针对这种方程组的特点,采用平方根法更加有效。所谓平方根法是将系数矩阵分解为一个下三角形矩阵和该矩阵的转置的乘积,然后在此基础上求解方程。

引理

  1. 若矩阵的各阶顺序主子式都不为零,则矩阵可以进行LU分解(1),且矩阵的LU分解唯一。现对(2)进行证明

  2. A为对称矩阵,当A的各阶顺序主子式都不等于零时,A可以唯一的分解为

    ​ $A=LDL^{T}$

    现证明之

平方根法重要定理

(对称正定矩阵的楚列斯基分解)设A是n阶对称正定矩阵,则存在一个可逆下三角矩阵G,使得

​ $A=GG^{T}$

且当限定G的对角元为正时,这种分解是唯一的。

证明:

平方根法的计算公式

根据$A=GG^{\frac{1}{2}}$,由矩阵乘法得

有分解公式可知

​ $a_{jj}=\sum_{k=1}^jg_{jk}^{2} \Rightarrow \vert g_{jk} \vert \le\sqrt {a_{jj}},j=1,2,\dots,n;k=1,2,\dots,j.$

由此可见,G的元素是可以控制的,舍入误差不会无限增长,这种分解是稳定的。

平方根法的一个分解示例

mark

使用平方根法求解方程

由$A=GG^{T}$可得

平方根法算法分析

用平方根法求解Ax=b共需要$\frac{1}{6}n^{3}+n^{2}-\frac{1}{6}n$个乘除法和n个开方运算,相比于高斯消元法和lU分解法求解方程减少了近一半的运算量。但是n个开放运算需要耗费较多的机器时间。

平方根法的程序实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Square_Root_Method
{
class Program
{
static void Main(string[] args)
{
Matrix m = new Matrix(4, 4);
m.CholeskyDecomposition();
m.DisPlay();
Console.Read();
}
}

class Matrix
{
public int row = 0;
public int column = 0;
private float[,] matrix;
//矩阵的初始化(输入)
public Matrix(int row, int column)
{
this.row = row;
this.column = column;
Console.WriteLine($"Please enter a matrix with {this.row}rows,{this.column}colums");
matrix = new float[row, column];
try
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < column; j++)
{
string mid = Console.ReadLine();
var rows = mid.Split(' ');
foreach (var item in rows)
{
matrix[i, j++] = float.Parse(item);
}

}

}
Console.WriteLine("\r\n");
}
catch (Exception e)
{
Console.WriteLine($"something wrong!\n{e.Message}");
}
}
//输出矩阵
public void DisPlay()
{
for (int i = 0; i < this.row; i++)
{
for (int j = 0; j < this.column; j++)
{
Console.Write(matrix[i, j] + " ");
}
Console.WriteLine("\r");
}
}
//矩阵的Cholesky分解
//我们把结果保存在原矩阵的下三角中
public void CholeskyDecomposition()
{
//计算第一个元素
matrix[0, 0] = (float)Math.Sqrt(matrix[0, 0]);
//计算第一列元素
for (int i = 1; i < this.row; i++)
{
matrix[i, 0] = matrix[i, 0] / matrix[0, 0];
}
for (int i = 1; i < this.row; i++)
{
//计算第i,j(i!=j)个元素
for (int j = 1; j < i; j++)
{
matrix[i, j] = (matrix[i, j] - TempValue(i, j)) / matrix[j, j];
}
//计算第j,j个元素,也可以放到上面的循环中去,并加判断
//注意这一行代码不能放到上面的for之前(与LU分解不同),这是算法决定的
matrix[i, i] = (float)Math.Sqrt(matrix[i, i] - TempValue(i, i));

}
}
//用于计算中间值
public float TempValue(int i, int j)
{
float result = 0;
for (int k = 0; k < j; k++)
{
result += matrix[i, k] * matrix[j, k];
}
return result;
}

}
}

运行上面的代码,输入上面示例中的矩阵,我们将得到如下结果:

mark

经验证,与上面计算结果相同

文章目录
  1. 1. 平方根法
    1. 1.1. 引理
    2. 1.2. 平方根法重要定理
    3. 1.3. 平方根法的计算公式
    4. 1.4. 平方根法的一个分解示例
    5. 1.5. 使用平方根法求解方程
    6. 1.6. 平方根法算法分析
    7. 1.7. 平方根法的程序实现