因为向量和矩阵的计算工作量比较大,为了更好的书写代码,这里增加了几个定义类,这些定义或者扩展方法将在以后的代码中应用到:
1、公共枚举类型
/*
文件:PublicEnums.cs
* 目的:定义公共枚举类型.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMathLib
{
/// <summary>
/// 初等变换类型(课本上是加,这里是减,仅仅是个系数符号的区别.
/// </summary>
public enum BasicTransMethod
{
/// <summary>
/// 交换i< == >j
/// </summary>
Swap,
/// <summary>
/// 乘以非零数:i=i*M
/// </summary>
Multipler,
/// <summary>
/// 第i行减去第j行乘以一个系数:i=i-j*M
/// </summary>
CoPlus1,
/// <summary>
/// 第i行乘以系数减去第j行乘以一个系数:i=i*M1 - j*M2
/// </summary>
CoPlus2
}
/// <summary>
/// 行变换还是列变换.
/// </summary>
public enum TransRowOrCol
{
/// <summary>
/// 行
/// </summary>
Row,
/// <summary>
/// 列
/// </summary>
Col
}
public static class ConstDef
{
public const int Decimals = 15;
}
public enum SolutionType
{
/// <summary>
/// 无解
/// </summary>
None,
/// <summary>
/// 只有零解
/// </summary>
OnlyZero,
//仅有一个非零解
OnlyOne,
/// <summary>
/// 有很多解.
/// </summary>
Many
}
}
2、方程求解结果
/*
* SolutionOfEquation.cs
* Added by Hawksoft.
*/
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMathLib
{
/// <summary>
/// 方程解结果,用于方程组求解后的结果存放.
/// </summary>
public class SolutionOfEquation
{
/// <summary>
/// 解类型
/// </summary>
public SolutionType SolutionType{ get; set; }
/// <summary>
/// 解向量
/// </summary>
public List<double[]> SolutionVectors { get; set; }
/// <summary>
/// 基本未知量
/// </summary>
public List<int> PrimaryUnknownVariations { get; set; }
/// <summary>
/// 自由未知量.
/// </summary>
public List<int> FreeUnknownVariations { get; set; }
public SolutionOfEquation()
{
SolutionVectors = new List<double[]>();
PrimaryUnknownVariations = new List<int>();
FreeUnknownVariations = new List<int>();
}
}
}
3、初等变换记录项
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MyMathLib
{
/// <summary>
/// 初等变换记录项,用于矩阵初等变换的过程演示和矩阵求逆.
/// </summary>
public class TransformItem
{
public BasicTransMethod TransMethod { get; set; }
public int i { get; set; }
public int j { get; set; }
public double M1 { get; set; }
public double M2 { get; set; }
public TransRowOrCol RowOrCol { get; set; }
public static TransformItem CreateEleTransRow1(int i, int j)
{
return new TransformItem()
{
i = i,
j = j,
M1 = 1,
TransMethod = BasicTransMethod.Swap,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransRow2(int i,double Multipler)
{
return new TransformItem()
{
i = i,
j = i,
M1 = Multipler,
M2 = Multipler,
TransMethod = BasicTransMethod.Multipler,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransRow3(int i, int j,double Multipler)
{
return new TransformItem()
{
i = i,
j = j,
M1 = Multipler,
M2 = Multipler,
TransMethod = BasicTransMethod.CoPlus1,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransRow4(int i, int j, double M1,double M2)
{
return new TransformItem()
{
i = i,
j = j,
M1 = M1,
M2 = M2,
TransMethod = BasicTransMethod.CoPlus2,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransCol1(int i, int j)
{
return new TransformItem()
{
i = i,
j = j,
M1 = 1,
M2 = 1,
TransMethod = BasicTransMethod.Swap,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransCol2(int i, double Multipler)
{
return new TransformItem()
{
i = i,
j = i,
M1 = Multipler,
M2 = Multipler,
TransMethod = BasicTransMethod.Multipler,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransCol3(int i, int j, double Multipler)
{
return new TransformItem()
{
i = i,
j = j,
M1 = 1,
M2 = Multipler,
TransMethod = BasicTransMethod.CoPlus1,
RowOrCol = TransRowOrCol.Row
};
}
public static TransformItem CreateEleTransCol4(int i, int j, double M1,double M2)
{
return new TransformItem()
{
i = i,
j = j,
M1 = M1,
M2 = M2,
TransMethod = BasicTransMethod.CoPlus2,
RowOrCol = TransRowOrCol.Row
};
}
}
另外说明一下:原来一直用decimal来计算,但在矩阵计算测试中发现,decimal很容易爆仓,所以改用double类型,其实decimal的位数比double多很多,但由于其特殊性,其表达的范围要比double小,所以后面改成了double.