LU分解算法(串行、并行)

一、串行LU分解算法(详细见MIT线性代数)

1. LU分解

矩阵分解 LU分解
分解形式 L(下三角矩阵)、U(上三角矩阵)
目的 提高计算效率
前提 (1)矩阵A为方阵;(2)矩阵可逆(满秩矩阵);(3)消元过程中没有0主元出现,也就是消元过程中不能出现行交换的初等变换

LU分解其实就是将线性方程组:
A x = b Ax = b Ax=b
分解为:
L U x = b LUx = b LUx=b
这样一来就会有:
{ L y = b U x = y \begin{cases}Ly = b \\ Ux = y \end{cases} { Ly=bUx=y
先由下三角矩阵求解出y,再通过上三角矩阵完成对x的求解。

2. Gussian Elimination

高斯迭代求解其实就是我们在小学时候学习的二元一次方程组的解法。将一个方程中的未知数,用含有另一未知数的代数式来表示。比如:
{ x 1 − 2 x 2 + x 3 = 0 2 x 2 − 8 x 3 = 8 5 x 1 − 5 x 3 = 10 \left\{\begin{array}{l}x_{1}-2 x_{2}+x_{3}=0 \\ 2 x_{2}-8 x_{3}=8 \\ 5 x_{1}-5 x_{3}=10\end{array}\right. x12x2+x3=02x28x3=85x15x3=10
写成增广形式则有:
[ 1 − 2 1 0 0 2 − 8 8 5 0 − 5 10 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 5 & 0 & -5 & 10\end{array}\right] 1052201850810
使用高斯迭代求解,先使用式1消去式3中的 x 1 x_1 x1,则有:
[ 1 − 2 1 0 0 2 − 8 8 0 10 − 10 10 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 10 & -10 & 10\end{array}\right] 100221018100810
再使用式2消去式3中的 x 2 x_2 x2,则有:
[ 1 − 2 1 0 0 2 − 8 8 0 0 30 − 30 ] \left[\begin{array}{ccc|c}1 & -2 & 1 & 0 \\ 0 & 2 & -8 & 8 \\ 0 & 0 & 30 & -30\end{array}\right] 10022018300830
最后通过这个上三角矩阵,可以很轻松的求解出x:
{ x 1 − 2 x 2 + x 3 = 0 x 2 − 4 x 3 = 4 x 3 = − 1 \left\{\begin{array}{l}x_{1}-2 x_{2}+x_{3}=0 \\ x_{2}-4 x_{3}=4 \\ x_{3}=-1\end{array}\right. x12x2+x3=0x24x3=4x3=1
简单进行回代即可。

void Guass(float *A,float *x,float *b,int n)
{
   
    float *At = (float *)malloc(sizeof(float)*n*n);
    memcpy(At,A,sizeof(float)*n*n);
    float *bt = (float *)malloc(sizeof(float)*n);
    memcpy(bt,b,sizeof(float)*n);
    for (int i=0;i<n;i++)
    {
   
		

你可能感兴趣的:(高性能计算,并行程序,高性能计算,数值分析)