精选文章 Crout分解法

Crout分解法

作者:iteye_14050 时间: 2021-07-06 09:11:33
iteye_14050 2021-07-06 09:11:33
【摘要】
                    前面介绍了Cholesky分解法,但是Cholesky分解法只是用于对称正定矩阵,对于不是对称矩阵、或不是正定矩阵时,要计算线性方程组时,在矩阵阶数不是很大时可以采用Cramer法则,也可以采用高斯消元法来求解!顺便介绍一下高斯消元法,对于一个n阶矩阵,用高斯消元法不计加减运算,只记乘除运算,要运算n的立方/3+n的平方-n/3次,计算量比较大,而且...

前面介绍Cholesky分解法,但是Cholesky分解法只是用于对称正定矩阵,对于不是对称矩阵、或不是正定矩阵时,要计算线性方程组时,在矩阵阶数不是很大时可以采用Cramer法则,也可以采用高斯消元法来求解!顺便介绍一下高斯消元法,对于一个n阶矩阵,用高斯消元法不计加减运算,只记乘除运算,要运算n的立方/3+n的平方-n/3次,计算量比较大,而且精度较差。所以后来有了改进的高斯消元法——高斯主元素消去法,即先找出主元,然后利用高斯消元法来计算,也是实际计算中常用的一直方法。

但是,如果先将矩阵进行分解成一个下三角矩阵与一个上三角矩阵的程序,然后计算线性方程组的工作量将会大大减少,这就引出了矩阵的LU分解。Crout分解就是其中一种常用的方法,其思路比较适合计算机程序设计。

Crout分解法

Crout分解法可用于非对称、非正定的矩阵。当然,如果矩阵是对称正定矩阵,Crout分解法当然也适用。

Crout分解法1

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;

}

勿删,copyright占位
您找到想要的结果了吗?
Crout分解法
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:显示栅格图层和矢量图层的属性表(AE开发)

下一篇:SQL Server TEXT类型字段字符串替换示例处理脚本

您可能感兴趣

  • CRC查表法——表的由来 【转载】

    原文地址:http://www.xjtudll.cn/Exp/273/ On-line CRC calculation and free library https://www.lammertbies.nl/comm/info/crc-calculation.html 为了更容易理解这篇文章,拿出纸笔跟着算一遍吧。文中的一些假定:a0,a1,b...

  • C#面试题:快速排序法

    快速排序法:找到一个基准点key,和left,right,比较,比key小的值放到key的坐边,比key大的值,放到key的右边。 采用递归方式,重复执行判断,直到排序完成。 //快速排序法法 //排序找出基准点。       private static int SortID (int[] arr, int left, int right) ...

  • 驱动专题:源码编写 3 简单button驱动(中断法+休眠唤醒机制)及测试程序

    汇总地址:https://blog.csdn.net/chichi123137/article/details/80946381 简单按键驱动,采用中断法 驱动程序如下,third_drv.c #include <linux/module.h> #include <linux/kernel.h> #include <linux/fs.h> #i...

  • Gym - 101615C Fear Factoring 因子分解

    1.题意:给出a,b,求出所有 [ a, b ] 之间的每个数字的所有因子之和。 比如 6 = 1* 6 = 2*3 则 f(6) = 1 + 6 + 2 + 3 (其中 a<=b <= 10^12) 2.分析:让人头疼的是数据范围达到10^12 , o(n)的欧拉筛也会超时 , 于是 我们 转换一下思维: (1)求因子也就是 n = x*y ...

  • 深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件(转)

    关于鞍点的定义可以参考论文 《鞍点定理在Lagrange乘数法上的应用》 下面这篇文章的重点是是提到了鞍点  在学习之前,先说一些题外话,由于博主学习模式识别没多久,所以可能对许多问题还没有深入的认识和正确的理解,如有不妥,还望海涵,另请各路前辈不吝赐教。        好啦,我们开始学习吧。。        同样假设有样本集: 由于线性...

  • POJ 1094 Sorting It All Out(入度法求拓扑排序,成环判断)

    题目来源:http://poj.org/problem?id=1094 问题描述 Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 39161   Accepted: 13808 Description An ascending...

  • 产品经理面试技巧:分解-量化-整合

    例题:   假如以“国庆节”为主题,请分析怎样进行特价机票推广? 分解-量化-整合 1. 分解 我们思想成熟的过程,是我们分解事物认知尺度的过程。我们对事物认知维度的分解方式直接影响了思考的深度。而如果选择了一个错误的、不客观的维度去思考问题,就会得出片面甚至错误的结论。 分解和挖掘的维度并不止“目标人群”一个。可以从关键词提取维...

  • 简单理解java快速排序法

    首先,下面的代码是我学了网上大神教的快速排序法修改的,代码里每一部分都有注释,不多说了,直接上代码,简单粗暴 public class QuickSort {      public static void main(String[] args) {          /*           * 思想:二分法           * 建议:不太理...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
Crout分解法介绍:华为云为您免费提供Crout分解法在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多Crout分解法的相关内容。| 移动地址: Crout分解法 | 写博客