Matrix Julia矩阵乘法逆舍入误差
为什么结果显示在左下角Matrix Julia矩阵乘法逆舍入误差,matrix,precision,julia,matrix-multiplication,matrix-inverse,Matrix,Precision,Julia,Matrix Multiplication,Matrix Inverse,为什么结果显示在左下角8.88178e-16,而不是右上角的0.0?如何执行该操作以获得结果[1.0 0.0;0.0 1.0] 有没有一种方法可以根据需要显示结果,但实际上可以像在muPad或其他符号计算器中那样以符号方式执行矩阵运算?如注释中所述,最好的方法是使用Rational type。E.x.,A=Rational{Int}[12;34],要获得所需格式的输出,请使用A*float(inv(A))。归功于@mschauer 更详细地说,计算中通常使用的浮点数精度有限,不能代表所有实数。因
8.88178e-16
,而不是右上角的0.0
?如何执行该操作以获得结果[1.0 0.0;0.0 1.0]
有没有一种方法可以根据需要显示结果,但实际上可以像在muPad或其他符号计算器中那样以符号方式执行矩阵运算?如注释中所述,最好的方法是使用Rational type。E.x.,
A=Rational{Int}[12;34]
,要获得所需格式的输出,请使用A*float(inv(A))
。归功于@mschauer
更详细地说,计算中通常使用的浮点数精度有限,不能代表所有实数。因此,在使用浮点数进行操作时会出现此类错误。有关此问题的详细信息,请参阅评论中的链接
然而,Julia使定义其他数值类型变得非常容易,如果需要,还可以对它们进行操作。其中之一是有理数类型,它可以精确地表示分数。我们可以将数组创建为有理数:
julia>A=Rational{Int}[12;34]
2x2数组{Rational{Int64},2}:
1//1 2//1
3//14//1
然后,此数组上的操作将返回精确的rational结果
julia>A*(inv(A))
2x2数组{Rational{Int64},2}:
1//1 0//1
0//1//1
如果我们希望结果是浮点数,可以在计算结束时转换它们
julia>float(A*(inv(A)))
2x2数组{Float64,2}:
1.0 0.0
0.01.0
需要注意的是,默认情况下使用浮点数的原因是性能。CPU经过优化,可以在浮点数上运行,使用上面提到的有理数将会慢得多。然而,朱莉娅给了你工具,让你自己根据自己的需要做出选择 这就是浮点数的工作原理。IEEE双精度64位给出16位精度。欢迎来到浮点计算的世界。这种行为是正常的。您可以使用类似十进制的数字对象实现自己的矩阵运算,但有一个原因,那就是为什么浮点数在科学界占主导地位如果您想在
Julia
中使用符号数学,您可以使用symphy
:使用symphy;A=[Sym(1)2;34];A*inv(A)
。(这只是将任务传递给Python的Symphy模块。)@jverzani的可能副本:或者,Arthur可以使用原生Rational类型:A=Rational[12;34];A*inv(A)
julia> A = [1 2; 3 4]
2x2 Array{Int64,2}:
1 2
3 4
julia> A * inv(A)
2x2 Array{Float64,2}:
1.0 0.0
8.88178e-16 1.0