本文将会介绍如何使用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进行处理,非常感谢!