开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
2015-05-05 08:56
525 查看
原文:【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数 本博客所有文章分类的总目录:http://www.cnblogs.com/asxinyu/p/4288836.html
开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html
上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容。这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相关的,或者可以将其中的源码快速移植到自己的系统中去(有时候并不需要所有的功能,只需要其中的部分功能代码),今天要介绍的是Math.NET中利用C#计算矩阵条件数的功能。
矩阵条件数的概念比较难懂,以前学线性代数的时候,还比较了解,很久没接触了,也忘记了,所以理论部分引用百科的内容,对需要的还是看课本比较好。如果太复杂可以直接跳过看调用即可。但为了保持支持的完整性,我还是写出来。
本文原文地址:http://www.cnblogs.com/asxinyu/p/4304307.html
其他过程比较简单雷同,就不再说明了。如有需要看源码,重要的还是使用的情况。
结果如下:
开源Math.NET基础数学类库使用总目录:http://www.cnblogs.com/asxinyu/p/4329737.html
上个月对Math.NET的基本使用进行了介绍,主要内容有矩阵,向量的相关操作,解析数据格式,数值积分,数据统计,相关函数,求解线性方程组以及随机数发生器的相关内容。这个月接着深入发掘Math.NET的各种功能,并对源代码进行分析,使得大家可以尽可能的使用Math.NET在.NET平台下轻易的开发数学计算相关的,或者可以将其中的源码快速移植到自己的系统中去(有时候并不需要所有的功能,只需要其中的部分功能代码),今天要介绍的是Math.NET中利用C#计算矩阵条件数的功能。
矩阵条件数的概念比较难懂,以前学线性代数的时候,还比较了解,很久没接触了,也忘记了,所以理论部分引用百科的内容,对需要的还是看课本比较好。如果太复杂可以直接跳过看调用即可。但为了保持支持的完整性,我还是写出来。
本文原文地址:http://www.cnblogs.com/asxinyu/p/4304307.html
1.什么是矩阵条件数
矩阵A的条件数等于A的范数与A的逆的范数的乘积,即cond(A)=‖A‖·‖A^(-1)‖,对应矩阵的3种范数,相应地可以定义3种条件数。 函数 cond(A,1)、cond(A)或cond(A inf) 是判断矩阵病态与否的一种度量,条件数越大矩阵越病态。条件数事实上表示了矩阵计算对于误差的敏感性。对于线性方程组Ax=b,如果A的条件数大,b的微小改变就能引起解x较大的改变,数值稳定性差。如果A的条件数小,b有微小的改变,x的改变也很微小,数值稳定性好。它也可以表示b不变,而A有微小改变时,x的变化情况。2.Math.NET矩阵条件数的实现
Math.NET在对矩阵条件数的计算过程与行列式和秩的计算都相同,直接用在矩阵分解算法使用ConditionNumber来获取,如上文http://www.cnblogs.com/asxinyu/p/4304304.html的代码中就有ConditionNumber的实现。public override float ConditionNumber { get { var tmp = Math.Min(U.RowCount, VT.ColumnCount) - 1; return Math.Abs(S[0]) / Math.Abs(S[tmp]); } }
其他过程比较简单雷同,就不再说明了。如有需要看源码,重要的还是使用的情况。
3.Math.NET计算矩阵条件数的代码
上述过程和原理只是便于大家理解其实现过程,下面简单演示一下在Math.NET中计算矩阵条件数的过程,就是直接调用计算即可。// 格式设置 var formatProvider = (CultureInfo)CultureInfo.InvariantCulture.Clone(); formatProvider.TextInfo.ListSeparator = " "; //创建一个随机的矩阵 var matrix = new DenseMatrix(5); var rnd = new Random(1); for (var i = 0; i < matrix.RowCount; i++) { for (var j = 0; j < matrix.ColumnCount; j++) { matrix[i, j] = rnd.NextDouble(); } } Console.WriteLine(@"Initial matrix"); Console.WriteLine(matrix.ToString("#0.00\t", formatProvider)); Console.WriteLine(); //条件数 Condition number Console.WriteLine(@"矩阵条件数"); Console.WriteLine(matrix.ConditionNumber()); Console.WriteLine();
结果如下:
Initial matrix DenseMatrix 5x5-Double 0.25 0.11 0.47 0.77 0.66 0.43 0.35 0.94 0.10 0.64 0.03 0.25 0.32 0.99 0.68 0.65 0.28 0.62 0.70 0.70 0.95 0.09 0.16 0.38 0.80 矩阵条件数 21.581238807809
4.资源
包括源代码以及案例都可以去官网下载,下载地址本系列文章的目录中第一篇文章:http://www.cnblogs.com/asxinyu/p/4264638.html,有介绍。由于源码很大,如果找不到相应的案例,可以进行搜索,可以比较快的找到相应的代码。相关文章推荐
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
- 【原创】开源Math.NET基础数学类库使用(17)C#计算矩阵条件数
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
- 【原创】开源Math.NET基础数学类库使用(11)C#计算相关系数
- 开源Math.NET基础数学类库使用(11)C#计算相关系数
- 【原创】开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 开源Math.NET基础数学类库使用(15)C#计算矩阵行列式
- 【原创】开源Math.NET基础数学类库使用(16)C#计算矩阵秩
- 开源Math.NET基础数学类库使用(16)C#计算矩阵秩
- 【原创】开源Math.NET基础数学类库使用(02)矩阵向量计算
- 【原创】开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式
- 【原创】开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式
- 【原创】开源Math.NET基础数学类库使用(05)C#解析Delimited Formats数据格式
- 【原创】开源Math.NET基础数学类库使用(08)C#进行数值积分
- 开源Math.NET基础数学类库使用(08)C#进行数值积分
- 【原创】开源Math.NET基础数学类库使用(10)C#进行基本数据统计
- 开源Math.NET基础数学类库使用(03)C#解析Matlab的mat格式
- 开源Math.NET基础数学类库使用(04)C#解析Matrix Marke数据格式