解线性方程组的直接方法 ------ 三角分解法

矩阵分解 三角分解(LU分解) - billbliss的专栏 - CSDN博客  https://blog.csdn.net/billbliss/article/details/78559289

矩阵的三角分解其基本原理可见上面的博客链接(写的很好,此处不再赘述)。

本博客主要是给出三角分解的C语言实现过程。

这里举出的计算实例如下所示:

\begin{bmatrix} 1 & 2 &3 \\ 2 & 5 &2 \\ 3 & 1&5 \end{bmatrix}\begin{bmatrix} x_{1}\\ x_{2}\\ x_{3} \end{bmatrix}=\begin{bmatrix} 14\\ 18\\ 20 \end{bmatrix}

1. 我们采用的第一种方法是,给L矩阵和U矩阵在main函数中进行初始化。然后传入到子函数中进行赋值。

/*我们在这里来创建一个函数,来实现三角分解法
    以下函数的参数中,所有名为: Arr是方程组的稀释矩阵
                                  L是存储三角分解的下三角矩阵的内存空间
                                  U是存储三角分解的上三角矩阵的内存空间
                                  N 是矩阵的阶数  */

void Triangle_decomp(double (*Arr)[3], double (*L)[3], double (*U)[3], int N){
    // 对于三角分解的方式是进行先是行的赋值,然后是列的赋值
    // 首先要记得L是单位下三角矩阵,U是上三角矩阵
    // 对于三角分解的方式是先行后列,也就是说需要先确定U的一行,然后才能确定L的一列

    // 首先对于U的第一行可以直接赋值
    for(int i=0; i=0; row_i--){
                sum_val += L[i][row_i] * U[row_i][d];
            }
        // 然后我们来得到对应的L上的元素
        U[i][d] = Arr[i][d] - sum_val;
        }
        // 当跳出循环后,便完成了U的行的赋值
        // 当进行L的赋值之后,对应的遍历i变成了对应的列索引
        for(int row_i=i+1; row_i=0; d--){ // 这里的d是对应的列索引
                sum_val += L[row_i][d] * U[d][i];
            }
        L[row_i][i] = (Arr[row_i][i] - sum_val) / U[i][i];
        }
    }
}

运算结果如下图:

解线性方程组的直接方法 ------ 三角分解法_第1张图片

2. 我们采用的第二种方法是直接将L中的元素和U中的元素写入到Arr矩阵中去.

/*接下来我们来创建一个方法,来计算生成新的Arr数组*/
void Triangle_decomp01(double (*Arr)[3], int N){
    // 本方法是为了实现将系数矩阵中的具体内容写入到原系数矩阵中去
    // 首先第一行不去变化,因为原L中的对角线上元素将不再出现
    // 接下来处理第一列,对于第一列元素,
    for(int i=1; i=0; d--){
                sum_val += Arr[i][d] * Arr[d][col_i];
            }
        // 接下来来计算对应的U上的元素
        // 对于U上对应位置上的元素,我们只需要将原索引上的值减去sum_val即可
        Arr[i][col_i] -= sum_val;
        }

        // 接下来我们需要做的便是来处理L的列上的元素
        // 当我们来遍历列上的元素时,对应的i将会转为遍历的列上
        for(int row_i=i+1; row_i=0; col_i--){
                // 这里遍历的col_i 是在L中对应的列
                sum_val += Arr[row_i][col_i] * Arr[col_i][i];
            }
        Arr[row_i][i] = (Arr[row_i][i]-sum_val) / Arr[i][i];
        }
    }
}

运算结果见下图:

解线性方程组的直接方法 ------ 三角分解法_第2张图片

3. 我们采用的第三种方式是,将系数矩阵写为1D,并将L中的数据和U中的数据覆盖到原Arr中去。

/*接下来创建一个方法,该方法将采用1D的系数矩阵来进行方程组的求解*/
void Triangle_decomp02(double *Arr, int N){
    // 第一行中的所有元素将不会再改变,
    // 我们要做的是先来处理第一列上的元素
    for(int i=1; i=0; d--){
                // 内部的求和,必须是所操作行上面的所有行
                // sum_val += Arr[i][d]*Arr[d][col_i];
                sum_val += Arr[i*N+d] * Arr[d*N+col_i];
            }
            // Arr[i][col_i] -= sum_val;
            Arr[i*N+col_i] -= sum_val;
        }
        // 接下来我们该来处理L中对应的列上的元素了
        // 此处i将自动转为L中的列索引
        // 那么下面我们首先应该去进行行的遍历了
        for(int row_i=i+1; row_i=0; col_i--){
                // sum_val += Arr[row_i][col_i] * Arr[col_i][i];
                sum_val += Arr[row_i*N+col_i] * Arr[col_i*N+i];
            }
            // Arr[row_i][i] = (Arr[row_i][i] - sum_val) / Arr[i][i];
            Arr[row_i*N+i] = (Arr[row_i*N+i] - sum_val) / Arr[i*N+i];
         }
    }
}

运算结果见下图:

解线性方程组的直接方法 ------ 三角分解法_第3张图片

程序有什么问题,请留言,相互讨论共同进步。千万不要停下学习的脚步,社会竞争压力很大。从学校出来以后,感觉钱真是太难挣了,尤其房价高的吓人。估计等我攒够买房子的钱的时候,我已经250岁了。

龙猪是个贫苦大户,当前支持以下扶贫方式。

解线性方程组的直接方法 ------ 三角分解法_第4张图片

解线性方程组的直接方法 ------ 三角分解法_第5张图片

你可能感兴趣的:(c,数值分析,矩阵的三角分解)