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

Hana ·
更新时间:2024-09-21
· 614 次阅读

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

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

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

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

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

/*接下来我们来创建一个方法,来计算生成新的Arr数组*/
void Triangle_decomp01(double (*Arr)[3], int N){
    // 本方法是为了实现将系数矩阵中的具体内容写入到原系数矩阵中去
    // 首先第一行不去变化,因为原L中的对角线上元素将不再出现
    // 接下来处理第一列,对于第一列元素,
    for(int i=1; i<N; i++) Arr[i][0] /= Arr[0][0];
    double sum_val = 0.0;
    // 接下来该是先去处理行上的元素,然后再去处理列上的元素
    for(int i=1; i<N; i++){
        // 接下来首先需要进行列上元素的遍历,对于列上元素的起始索引,应该是当前的行数
        for(int col_i=i; col_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];
        }
    }
}

运算结果见下图:

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

/*接下来创建一个方法,该方法将采用1D的系数矩阵来进行方程组的求解*/
void Triangle_decomp02(double *Arr, int N){
    // 第一行中的所有元素将不会再改变,
    // 我们要做的是先来处理第一列上的元素
    for(int i=1; i<N; i++){
        // 这里的遍历是第一列上的索引
        Arr[i*N+0] = Arr[i*N+0] / Arr[0];
    }
    // 接下来我们要做的便是该去进行后续的行的数据操作了
    // 首先遍历的是当前要处理的行
    double sum_val = 0.0;
    for(int i=1; i<N; i++){
        // 内部的循环应该首先是列,因为已经制定了要处理的行
        // 接下来需要首先指定我们要处理的列
        for(int col_i=i; col_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];
         }
    }
}

运算结果见下图:

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

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


作者:LongZhu8



线性方程 线性方程组 方法 线性

需要 登录 后方可回复, 如果你还没有账号请 注册新账号
相关文章