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

本文将会介绍如何使用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微信公众号 了解产品的最新动态及最新资讯。

标签:

来源:慧都

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2019年11月3日
下一篇 2019年11月3日

相关推荐

发表回复

登录后才能评论