在 Julia 中,使用矩阵乘法与移位和加法进行有限差分时,似乎会发现一些误差项。
julia> n = 1000
1000
julia> hessM = circshift(eye(n),-1) + circshift(eye(n),1) - 2* eye(n);
julia> function hess(x::Vector)
return circshift(x,-1) + circshift(x,1) - 2*x
end
hess (generic function with 1 method)
julia> x = rand(n);
julia> maximum(hessM * x - hess(x))
0.0
julia> x = rand(n)/300;
julia> maximum(hessM * x - hess(x))
8.673617379884035e-19
我知道这是浮点错误,因为如果我这样做x = rand(n) / 256
(或任何 2 的幂),错误就会消失,但是如果我们除以 3 这样简单的东西,错误就会出现。
但是在运行上述代码时,浮点错误到底在哪里呢?为什么它对划分敏感?
编辑:事实上,我已将差异本地化为
julia> x = rand(n)/3;
julia> maximum(hessM * x + 2 * eye(n) * x - circshift(eye(n),-1) * x - circshift(eye(n),1)*x)
1.1102230246251565e-16
julia> x = rand(n);
julia> maximum(hessM * x + 2 * eye(n) * x - circshift(eye(n),-1) * x - circshift(eye(n),1)*x)
0.0
julia> x = rand(n) * 3;
julia> maximum(hessM * x + 2 * eye(n) * x - circshift(eye(n),-1) * x - circshift(eye(n),1)*x)
8.881784197001252e-16
是什么赋予了?