.NET数学库NMath使用教程——使用LU分解

翻译|使用教程|编辑:况鱼杰|2019-12-06 11:35:17.413|阅读 26 次

概述:本文将会介绍如何使用LU分解,一旦从矩阵构造了LU分解,就可以将其重新用于求解不同的右侧,计算逆,计算条件数,等等。

相关链接:

    NMath是一个适用于所有.NET语言,如C#、Visual Basic、F#和.NET的数学库,它包含了.NET平台上的面向对象数字计算的基础类。我们将以连载的形式向大家介绍NMath的实用教程。

最新版NMath点击下载


    一旦从矩阵构造了LU分解>>,就可以将其重新用于求解不同的右侧,计算逆,计算条件数,等等。

矩阵组成

    只读属性提供对LU分解的组件矩阵的访问:

  • P获得置换矩阵。

  • L获得下三角矩阵。

  • U获取上三角矩阵。

  • Pivots获取一系列枢纽索引,第i行与Pivots [i]互换。

解决右侧

    您可以使用Sol分解()方法使用LU分解来求解右侧。例如,此代码解决的一个右侧问题:

代码示例– C#LU分解

var A = new DoubleMatrix( "3x3 [2 1 1 4 1 0 -2 2 1]" );
var lu = new DoubleLUFact( A );
 
var v = new DoubleVector( "[8 11 3]" );DoubleVector x = lu.Solve( v );

代码示例– VB LU分解

Dim A As New DoubleMatrix("3x3 [2 1 1 4 1 0 -2 2 1]")
Dim LU As New DoubleLUFact(A)

Dim V As New DoubleVector("[8 11 3]")
Dim X As DoubleVector = LU.Solve(V)

    返回的向量x是线性系统Ax = v的解。请注意,向量v的长度必须等于分解矩阵A中的行数,否则会引发MismatchedSizeException。

    同样,您可以使用Solve()方法来求解多个右侧:

代码示例– C#LU分解

var A = new FloatMatrix( "3x3 [2 1 1  4 1 0 -2 2 1]" );
var lu = new FloatLUFact( A );

var B = new FloatMatrix( "3x2[8 3  11 11  3 8]" );FloatMatrix X = fact.Solve( B );

代码示例– VB LU分解

Dim A As New FloatMatrix("3x3 [2 1 1  4 1 0 -2 2 1]")
Dim LU As New FloatLUFact(A)

Dim B As New FloatMatrix("3x2[8 3  11 11  3 8]")
Dim X As FloatMatrix = Fact.Solve(B)

    返回的矩阵X是线性系统AX = B的解。也就是说,右侧是B的列,解决方案是X的列。矩阵B的行数必须与因数相同。矩阵A还提供了SolveInPlace()方法,该方法将解决方案放置在给定的向量或矩阵中,而无需分配新的内存。给定的右侧数据必须具有步幅。

计算逆数,行列式和条件数

    您可以使用LU分解使用Inverse()方法来计算逆数,而行列式可以使用Determinant()方法来计算。例如:

代码示例– C#LU分解

var A = new FloatMatrix( "3x3 [2 1 1  4 1 0 -2 2 1]" );
var lu = new FloatLUFact( A );FloatMatrix AInv = lu.Inverse();
float ADet = lu.Determinant();

代码示例– VB LU分解

Dim A As New FloatMatrix("3x3 [2 1 1  4 1 0 -2 2 1]")
Dim LU As New FloatLUFact(A)

Dim AInv As FloatMatrix = LU.Inverse()
Dim ADet As Single = LU.Determinant()

ConditionNumber()方法以指定的规范类型计算条件编号。 矩阵A的条件数为:

kappa = ||A|| ||AInv||

    其中AInv是矩阵A的逆数。

注:ConditionNumber()方法返回条件数rho的倒数,其中rho = 1 / kappa。

    提供的NormType枚举包含用于指定矩阵范数的值。您您也可以选择估计条件编号(更快但不准确),或直接计算它,对于小矩阵,结果通常是相同的。因此,此代码估算无穷范数中的条件数:

代码示例– C#LU分解

var A = new DoubleMatrix( "3x3 [2 1 1   4 3 3   8 7 9 ]" );
var lu = new DoubleLUFact( A );

double AEstimatedConditionNum =
  lu.ConditionNumber( NormType.InfinityNorm, true );

代码示例– VB LU分解

Dim A As New DoubleMatrix("3x3 [2 1 1   4 3 3   8 7 9 ]")
Dim LU As New DoubleLUFact(A)

Dim AEstimatedConditionNum As Double = 
  LU.ConditionNumber(NormType.InfinityNorm, True)

    此代码直接在1范数中计算条件编号:

代码示例– C#LU分解

double AComputedConditonNum = 
   lu.ConditionNumber( NormType.OneNorm, false );

代码示例– VB LU分解

Dim AComputedConditonNum As Double = 
  LU.ConditionNumber(NormType.OneNorm, False)

上一章:创建LU分解

下一章:静态方法

==========================================

如果想要购买正版授权NMath的朋友,可以联系在线客服

关注慧聚IT微信公众号 ☟☟☟,了解产品的最新动态及最新资讯。

1561953111.jpg



标签:

本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处,尊重他人劳动成果

文章转载自:CenterSpace https://www.centerspace.net/doc/NMath/user/linear-systems-77485.htm

登录 慧都网发表评论


暂无评论...

为你推荐

  • 推荐视频
  • 推荐活动
  • 推荐产品
  • 推荐文章
  • 慧都慧问
相关厂商
相关产品
NMath

NMath是一个.NET的数学库,包含了NET平台上的面向对象数字计算的基础类。

在线
客服
在线
QQ
电话
咨询
400-700-1020
购物车 反馈 返回
顶部
在线客服系统
live chat