我用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 = %f\n", 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
最奇怪的是,对于某些矩阵而言,这种情况并未发生。
答案 0 :(得分:0)
这是一个舍入错误。有关更多背景信息,请参阅"What Every Computer Scientist Should Know About Floating-Point Arithmetic"。简而言之:由于您所代表的数字不是base2而且它们在base2中表示,因此有时难以准确地表示整数。弄清楚结果的重要性和四舍五入。
以here:
为例// 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是小数位数,而不是数字位数。
答案 1 :(得分:0)
如果这只是一个舍入错误,您可以通过clean
函数清理结果,该函数将矩阵的小条目舍入为零。通过此功能,您还可以设置绝对或相对大小的清洁公差。
clean(r); //it will round to zero the very small elements e.g. 1.388D-17