2014-10-19 1 views
0

Моя функция для рассчитает Гауссово исключение (без parcial поворота) с Scilab возвращаются странный результат для таких операций, какСтранный результат в гауссовой ликвидации с Scilab

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

Это ошибка округления. См. "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 

Осторожно: п есть число знаков после запятой, а не количество цифр.

+0

Спасибо, парень, я действительно подозревал, что это круглая ошибка, потому что я выполняю вторую половину кода (обратная подстановка) с помощью этой матрицы, результат был верным. Я перепроверяю, если об этом говорится в документации scilab. Большое спасибо. – frodrigues

0

Если это только ошибка округления, вы можете очистить результаты функцией clean, которая округляет до нуля небольшие записи матрицы. С помощью этой функции вы также можете установить допуски на очистку в абсолютной или относительной величине.

clean(r); //it will round to zero the very small elements e.g. 1.388D-17 

 Смежные вопросы

  • Нет связанных вопросов^_^