我用scilab计算高斯消去(没有parcial pivot)的函数在等操作中返回了一个奇怪的结果
0.083333 - 1.000000*0.083333 = -0.000000
(减零,我真的不明白)
当我访问矩阵中的这个结果时,显示的数字是-1.388D-17
。有人知道为什么这样吗?下面是我的高斯消去代码。A是展开矩阵(A|b)
function [r] = gaussian_elimination(A)
//Get a tuple representing matrix dimension
[row, col] = size(A)
if ( (row ~= 1) & (col ~= 2) ) then
for k = 1:row
disp(A)
if A(k, k) ~= 0 then
for i = k+1:row
m = real(A(i, k)/A(k, k))
for j = 1:col
a = A(k, j)
new_element = A(i, j) - m*a
printf("New Element A(%d, %d) = %f - %f*%f = %fn", i, j, A(i,j), m, a, new_element)
A(i,j) = 0
A(i,j) = new_element
end
end
else
A = "Inconsistent system"
break
end
end
else
A = A(1,1)
end
r = A
最奇怪的是,对于一些矩阵来说,这种情况没有发生。
这是一个舍入错误。有关更多背景信息,请参阅"每个计算机科学家应该知道的浮点运算"。简言之:由于你所代表的数字不是以2为基数,而是以2为基础表示的,因此有时很难准确地代表整个数字。找出显著性并对结果进行四舍五入。
举个例子:
// fround(x,n)
// Round the floating point numbers x to n decimal places
// x may be a vector or matrix// n is the integer number of places to round to
function [y ]= fround(x,n)
y=round(x*10^n)/10^n;
endfunction
-->fround(%pi,5)
ans = 3.14159
注意:n是小数位数,而不是数字位数。
如果这只是一个舍入错误,您可以通过clean
函数清理结果,该函数将矩阵的小条目舍入为零。通过此功能,您还可以设置绝对或相对大小的清洁公差。
clean(r); //it will round to zero the very small elements e.g. 1.388D-17