`
peizhiinfo
  • 浏览: 1427056 次
文章分类
社区版块
存档分类
最新评论

Crout分解法

 
阅读更多

前面介绍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 分解法解线性方程组

    这是数值计算第二章的第五个程序---Crout 分解法解线性方程组。

    C语言crout分解法.rar_C语言crout分解法_choicev4m

    使用C语言的一个简单Crout分解法解线性方程组的程序,需要在同目录下创建&quot;lu.txt&quot;

    Crout分解法求解方程组2.c

    Crout分解法求解方程组

    Crout法矩阵LU分解求解方程组

    在网上找了很久都找不到python编写的,于是自己写了,在这里分享一下,代码调试通过,有...这里主要编写了一个自定义函数Crout(A,B)用于解AX=B的方程组,途中输出L、U矩阵和中间矩阵y和最终的解x。希望对大家有帮助!

    exe2-2-LUdecomposition.zip_lu分解crout

    LU分解之Crout分解法。对从文件中读取的A矩阵进行LU分解并输出L矩阵,U矩阵。

    数值分析+编程代码汇总+追赶法、拉格朗日插值、最小二乘法、不动点迭代、雅可比迭代、牛顿法下山法、割线法、乘幂法

    线性方程组的直接法:Gauss消去法与矩阵三角分解法(Doolittle分解法相比Crout分解法更常用)及其选择列主元的改进方法、Doolittle分解法的延伸(实对称正定矩阵利用Cholesky分解得到的平方根法、三对角矩阵作为线性...

    线性方程组的直接求法(上机程序)

    数值线性代数的内容,主要是高斯消去法、列主元消去法和平方根法、改进的平方根法的上机程序(对应北大出版社数值线性代数的第一章上机题)

    数值计算实验报告(8个)

    【实验1】拉格朗日插值,...【实验4】Dolittle分解法和Crout分解法 【实验5】Jaccobi迭代和Gauss-Seidel迭代法 【实验6】复化梯形积分和复化Simpson积分 【实验7】Euler方法和Runge-Kutta方法 【实验8】 幂法,反幂法

    使用 Crout 算法对方阵进行 LU 分解:函数提供 LU 因子来求解线性系统。-matlab开发

    此函数使用 Crout 算法提供方阵的 LU 因子。

    线性方程组的求解-列主元消元法,LU分解法,改进的平方根法,追赶法和雅可比迭代,高斯—塞德尔迭代

    线性方程组的直接法主要有Gauss消元法及其变形、LU(如Doolittle、Crout方法等)分解法和一些求解特殊线性方程组的方法(如追赶法、LDLT法等)。这里主要有列主元消元法,LU分解法,改进的平方根法,追赶法和雅可比迭代...

    MATLAB应用于数据融合,空间处理的算法

    全局优化算法如模拟退火算法,蚁群算法不予以考虑,雅可比(Jacobi)...即当可逆时显然有唯一解,当不可逆时,我们得到的解是(范数最小的一个),Doolittle分解、Crout分解、Cholesky分解求解线性方程组有待进一步验证。

    数值计算实验代码

    包含了数值计算课程内的部分算法的源代码,包括Crout分解,Doolittle分解,Lagrange插值法,Newton插值法,Romberg算法,二分,复化梯形积分法,顺序高斯消元,列选主元高斯消元,全选主元高斯消元,数据拟合的最小...

    MATLAB常用算法

    Crout 克劳特分解法求线性方程组Ax=b的解 Doolittle 多利特勒分解法求线性方程组Ax=b的解 SymPos1 LL分解法求线性方程组Ax=b的解 SymPos2 LDL分解法求线性方程组Ax=b的解 SymPos3 改进的LDL分解法求线性方程组Ax=b的...

    数值计算实验项目代码

    5、Crout(克洛特)分解解线性方程组 6、平方根法解线性方程组 三 、插值法与曲线拟合的最小二乘法 1、拉格朗日插值法 2、牛顿插值法 3、Hiemite 插值法 4、最小二乘法(线性拟合) 四 、数值积分 1、使用变步长梯形...

    矩阵算法集(Gauss\Jacobi\Doolittle\……)

    含有的算法如下:追赶法(上、下三角)、高斯塞德尔迭代、雅可比迭代、高斯消去、约当消去、杜力特分解法、乔累斯基分解法、克劳特分解法。此cpp仅供学习和参考,代码如有不对之处,请批评指正,谢谢!

    MATLAB语言常用算法程序集

    Crout 克劳特分解法求线性方程组Ax=b的解 Doolittle 多利特勒分解法求线性方程组Ax=b的解 SymPos1 LL分解法求线性方程组Ax=b的解 SymPos2 LDL分解法求线性方程组Ax=b的解 SymPos3 改进的LDL分解法求线性方程组Ax=b的...

    运用追赶法来解三对角线性方程组MATLAB

    运用追赶法来解三对角线性方程组MATLAB. 三对角矩阵是一种具有特殊意义的带状矩阵.用差分法求解二阶常微分方程边值问题时,...对三对角矩阵实行Doolittle(或Crout)分解,便得到求解三对角方程组的最有效方法---追赶法.

    C#科学计算讲义[光盘源码]

    4.6 QR分解法计算最小二乘问题 158 4.6.1 基本原理 158 4.6.2 实验内容与数据 159 4.6.3 程序源代码 159 4.6.4 实验结论 167 4.7 加权最小二乘与Gauss-Markov估计 167 4.7.1 基本原理 167 4.7.2 实验...

    C#科学计算讲义

    4.6 QR分解法计算最小二乘问题 158 4.6.1 基本原理 158 4.6.2 实验内容与数据 159 4.6.3 程序源代码 159 4.6.4 实验结论 167 4.7 加权最小二乘与Gauss-Markov估计 167 4.7.1 基本原理 167 4.7.2 实验...

Global site tag (gtag.js) - Google Analytics