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 = %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

相关内容

  • 没有找到相关文章

最新更新