用scilab高斯消除的奇怪结果

时间:2014-10-19 19:33:26

标签: linear-algebra scilab

我用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

最奇怪的是,对于某些矩阵而言,这种情况并未发生。

2 个答案:

答案 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