2017-01-21 20 views
0

Я решаю 3 линейных алгебраических уравнения с использованием MATLAB. Я знаю ожидаемые решения, один из которых должен быть 0, но он показывает 2.2204e-16.MATLAB показывает очень маленькое значение вместо 0 (ноль)

MATLAB Код:

a=[2 5 -3; 9 2 3; 7 -12 5] 
b=[-11; 0; 8] 
x=inv(a)*b 

Ожидаемое решение -1, 0, 3, но он показывает:

-1.0000e+00 
2.2204e-16 
3.0000e+00 

Технически, я не использовал программное обеспечение MATLAB для этого, но употребил this онлайн Октава переводчик.

Я ожидаю ровно 0 как выход, а не 2.2204e-16. Как мне подойти к этому?

+0

Это называется "машина точность" .. См [это сообщение] (http://stackoverflow.com/q/686439/3372061) Чтобы получить больше информации. –

+0

Да, это решило !! – partho

+2

@SandipanDey Это опасный совет, потому что если выход деления - это некоторое _legit_ десятичное число - эта информация будет потеряна. @partho - если вы _must_ вокруг него, сделайте это, используя известное количество степеней точности - 'round (..., N)', где 'N' около 6 должно делать в вашем случае. Однако проблема заключается в том, что вы используете неправильные операторы для решения линейного уравнения .... Я отправлю ответ в ближайшее время. –

ответ

6

То, что вы видите, является результатом, который является правильным до machine precision (номер, который вы получаете, фактически равен eps(1) или eps('double')).

Для решения линейных уравнений, таких как один в вашем примере, следует использовать деление матрицы. Эти функции: mldivide, \ и mrdivide, / (вам рекомендуется прочитать их документы).

При использовании этих операторов MATLAB (или Octave) выбирает правильный решатель для использования в зависимости от свойств входов. Эти решатели не инвертируют a явно (по крайней мере, не решатели, чьи документы я читаю), которые сделаны для того, чтобы сделать решение быстрее, точнее, более численно устойчивым или их комбинацией. В качестве примера того, как избежать инверсии, проверьте документацию LU solver.

Например:

a=[2 5 -3; 9 2 3; 7 -12 5]; 
b=[-11; 0; 8]; 
x=a\b 

Урожайность:

x = 

    -1 
    0 
    3 
+0

Я не верю, что решатель Octave (или решатель MATLAB) определит, что выход должен быть целым числом. Непосредственно вычисление обратного является основным источником улучшенной точности. – stephematician

+1

@stephematician Я снял это безответственное требование из моего ответа. Спасибо :) –

+0

Вы придавали значения целым или оставляли их как двойные? Я спрашиваю, потому что с 2016a, если выражение 'format' -' g' или 'e', я не мог получить' 0'. Это все еще сводится к точности машины. Например, мой вывод - '6.5521e-17' для' x (2) 'с' format short e'. Я предпочитаю этот подход над 'inv', хотя, следовательно, +1. – Matt

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

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