使用MathNet.Numerics计算矩阵行列式如何实现高精度求解
问题原因
double类型的有效位数仅为15~17位,你需要的精确结果是30位整数,已经超出double的精度上限,用Matrix<double>计算行列式时必然会出现精度丢失,只能得到近似的科学计数法结果。
解决方法
- 更换矩阵元素的存储类型,使用支持任意精度的整数类型
System.Numerics.BigInteger承载矩阵元素,全程用整数运算避免精度损失。如果原始矩阵元素为小数,可先对所有元素做统一缩放转为整数,计算出行列式后再按比例还原即可。 - 若使用MathNet.Numerics库,原生已经支持
BigInteger类型的矩阵运算,直接修改矩阵声明即可,示例代码如下:
Matrix<BigInteger> m = Matrix<BigInteger>.Build.Dense(8, 8, (i, j) => 对应位置的整数值); Console.WriteLine(m.Determinant());
- 也可以自行实现整数行列式计算逻辑,比如用高斯消元法将矩阵转为上三角矩阵后计算对角线元素的乘积,全程用
BigInteger运算即可得到完全精确的结果,8阶矩阵的计算量极低,不会有性能问题。
内容的提问来源于stack exchange,提问作者David A
相关产品推荐
相关产品推荐

