前面介绍了Cholesky分解法,但是Cholesky分解法只是用于对称正定矩阵,对于不是对称矩阵、或不是正定矩阵时,要计算线性方程组时,在矩阵阶数不是很大时可以采用Cramer法则,也可以采用高斯消元法来求解!顺便介绍一下高斯消元法,对于一个n阶矩阵,用高斯消元法不计加减运算,只记乘除运算,要运算n的立方/3+n的平方-n/3次,计算量比较大,而且精度较差。所以后来有了改进的高斯消元法——高斯主元素消去法,即先找出主元,然后利用高斯消元法来计算,也是实际计算中常用的一直方法。
但是,如果先将矩阵进行分解成一个下三角矩阵与一个上三角矩阵的程序,然后计算线性方程组的工作量将会大大减少,这就引出了矩阵的LU分解。Crout分解就是其中一种常用的方法,其思路比较适合计算机程序设计。
Crout分解法
Crout分解法可用于非对称、非正定的矩阵。当然,如果矩阵是对称正定矩阵,Crout分解法当然也适用。

2)程序设计
程序设计主要分为计算LU矩阵、计算Y矩阵和计算X矩阵三个部分。
(1)计算LU矩阵
计算LU矩阵的程序主要根据式(5-6)和(5-7)来设计,其代码如下:
//计算LU矩阵
double[,] L = new double[arrayCount, arrayCount];
double[,] U = new double[arrayCount, arrayCount];
for (i = 0; i < arrayCount; i++)
{
U[i, i] = 1;
}
for (k = 0; k < arrayCount; k++)
{
for (i = k; i < arrayCount; i++)
{
temp = 0.0;
for (r = 0; r < k ; r++)
{
temp+=L[i,r]*U[r,k];
}
L[i, k] = A[i, k] - temp;
}
for (j = k+1; j < arrayCount; j++)
{
temp = 0.0;
for (r = 0; r < k ; r++)
{
temp += L[k, r] * U[r, j];
}
U[k, j] = (A[k, j] - temp) / L[k, k];
}
}
(2)计算Y矩阵
计算Y矩阵主要根据式(5-8),其代码如下:
//计算Y矩阵
double[] Y = new double[arrayCount];
for (i = 0; i < arrayCount; i++)
{
temp = 0.0;
for (j = 0; j < i; j++)
{
temp += L[i, j] * Y[j];
}
Y[i]=(B[i]-temp)/L[i,i];
}
(3)计算X矩阵
计算X矩阵主要根据式(5-9),其代码如下:
//计算X矩阵
double[] XX = new double[arrayCount];
for (i = arrayCount-1; i >=0 ; i--)
{
temp = 0.0;
for (j = i; j < arrayCount; j++)
{
temp += U[i, j] * XX[j];
}
XX[i] = Y[i] - temp;
}
至此,整个Crout分解法的函数如下:
private void CalFoundation2(double[,] A, out double[] X, double[] B)
{
int arrayCount = B.Length;//矩阵的行、列数
int i, j, k, r;
double temp;
//计算LU矩阵
double[,] L = new double[arrayCount, arrayCount];
double[,] U = new double[arrayCount, arrayCount];
for (i = 0; i < arrayCount; i++)
{
U[i, i] = 1;
}
for (k = 0; k < arrayCount; k++)
{
for (i = k; i < arrayCount; i++)
{
temp = 0.0;
for (r = 0; r < k ; r++)
{
temp+=L[i,r]*U[r,k];
}
L[i, k] = A[i, k] - temp;
}
for (j = k+1; j < arrayCount; j++)
{
temp = 0.0;
for (r = 0; r < k ; r++)
{
temp += L[k, r] * U[r, j];
}
U[k, j] = (A[k, j] - temp) / L[k, k];
}
}
//计算Y矩阵
double[] Y = new double[arrayCount];
for (i = 0; i < arrayCount; i++)
{
temp = 0.0;
for (j = 0; j < i; j++)
{
temp += L[i, j] * Y[j];
}
Y[i]=(B[i]-temp)/L[i,i];
}
//计算X矩阵
double[] XX = new double[arrayCount];
for (i = arrayCount-1; i >=0 ; i--)
{
temp = 0.0;
for (j = i; j < arrayCount; j++)
{
temp += U[i, j] * XX[j];
}
XX[i] = Y[i] - temp;
}
X = XX;
}
分享到:
相关推荐
这是数值计算第二章的第五个程序---Crout 分解法解线性方程组。
《C语言实现Crout分解法解析》 在计算机科学领域,线性代数是不可或缺的基础,其中求解线性方程组是常见的问题之一。针对这一需求,C语言提供了多种算法实现,其中之一便是Crout分解法。本篇将详细介绍C语言如何...
Crout分解法求解方程组
在提供的"exe2-2-LUdecomposition.zip_lu分解crout"文件中,重点是实现Crout分解法,这是一种LU分解的具体算法。Crout分解法的基本思想是通过迭代过程逐步构建L和U矩阵。在C语言编写的"exe2-2 LUdecomposition.c"源...
在网上找了很久都找不到python编写的,于是自己写了,在这里分享一下,代码调试通过,有...这里主要编写了一个自定义函数Crout(A,B)用于解AX=B的方程组,途中输出L、U矩阵和中间矩阵y和最终的解x。希望对大家有帮助!
平方根法,也称为Cholesky分解,是针对对称正定矩阵的一种高效求解方法。对于方程组Ax=b,其中A是对称正定的,Cholesky分解可以将A表示为LL^T的形式,其中L是下三角矩阵,L^T是L的转置。解线性方程组可以通过先求解...
线性方程组的直接法:Gauss消去法与矩阵三角分解法(Doolittle分解法相比Crout分解法更常用)及其选择列主元的改进方法、Doolittle分解法的延伸(实对称正定矩阵利用Cholesky分解得到的平方根法、三对角矩阵作为线性...
【实验1】拉格朗日插值,...【实验4】Dolittle分解法和Crout分解法 【实验5】Jaccobi迭代和Gauss-Seidel迭代法 【实验6】复化梯形积分和复化Simpson积分 【实验7】Euler方法和Runge-Kutta方法 【实验8】 幂法,反幂法
Crout 算法是一种实现 LU 分解的方法,尤其适用于方阵。在 MATLAB 环境中,我们可以编写函数来高效地执行这种分解。 LU 分解将一个方阵 A 分解为两个下三角矩阵 L 和上三角矩阵 U 的乘积,即 A = L * U。这种分解...
直接三角分解法分为Doolittle分解法和Crout分解法,它们分别将矩阵分解为单位下三角矩阵与上三角矩阵的乘积,以及下三角矩阵与单位上三角矩阵的乘积。在这些分解法中,选取主元是一个关键步骤,它可以通过变换矩阵来...
- 题目19和20要求应用Crout分解法和Gauss列主元素消去法求解线性方程组,这是矩阵求解的经典方法。 - 题目18则涉及到复合梯形求积公式和复合Simpson求积公式的应用,用于近似积分。 综上所述,这份复习资料全面...
矩阵三角分解法在数值计算领域占有重要地位,是解决线性方程组问题的有效工具。线性方程组广泛存在于科学计算、工程问题和数据分析等多个领域,而矩阵三角分解法通过将系数矩阵转换为三角矩阵的乘积形式,显著简化了...
- **算法**: 包括直接分解法、Crout分解法等。 - **用途**: 在数值计算中的重要应用之一。 以上概述了矩阵理论中的一些核心知识点,包括线性方程、矩形系统与阶梯形、矩阵代数等方面的基本概念、运算规则及其实际...
1. **效率与稳定性**:虽然提供的代码能够完成任务,但在实际应用中,可能需要考虑更高效的算法,如Crout分解或Doolittle分解,以及增加对矩阵奇异性的检查,以提高计算的稳定性和鲁棒性。 2. **代码可读性与维护性*...
本篇将详细探讨几种常用的直接解法,包括列主元消元法、LU分解法、改进的平方根法、追赶法以及雅可比迭代和高斯—塞德尔迭代。 ### 列主元消元法 列主元消元法是一种基于Gauss消元法的优化策略,目的是减少数值稳定...
在本资源中,我们将详细介绍部分选主元素三角分解法的原理和算法,并提供了几个实例来演示其应用。 17. 带状矩阵 带状矩阵是一种特殊的矩阵,它的元素满足某些条件。在本资源中,我们将详细介绍带状矩阵的定义和...
这里提到的"Numerical-Analysis.rar_crout_lu_factorization"是一个关于矩阵分解的压缩包,包含了一些特定的算法实现,如Crout法、LU分解以及LUL分解等。这些方法都是为了解决线性代数中的基本问题,即如何高效地...
全局优化算法如模拟退火算法,蚁群算法不予以考虑,雅可比(Jacobi)...即当可逆时显然有唯一解,当不可逆时,我们得到的解是(范数最小的一个),Doolittle分解、Crout分解、Cholesky分解求解线性方程组有待进一步验证。
在本PPT课件中,主要探讨了两种特殊的矩阵分解方法:Doolittle分解和Crout分解,以及LDR分解,这些都是LU分解的不同形式。 **Doolittle分解**指的是将一个矩阵\( A \)表示为单位下三角矩阵\( L \)、对角矩阵\( D \)...
在题目中提到了三种直接解法:列主元Gauss消去法、平方根算法(Cholesky分解)和Crout分解。列主元Gauss消去法是一种改进的高斯消元法,通过选择每列的最大元素作为主元,减少数值不稳定性的影响。平方根算法是针对...