1 не равно 1? Сравнение матричной записи в MATLAB - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь проверить инверсию матрицы, умножив ее, чтобы получить 1. Я проверяю, равняется ли она 1, а если нет, то печатаю сообщение и значение записи матрицы.

Проблема в том, что напечатанная матричная запись равна 1. Я даже использую функцию округления, которая, как я знаю, работает, чтобы убедиться, что нет ничего плохого в неточностях с плавающей запятой.

Вот мой код:

 function [D1,f]=stiff(D,y)
 n = size(D,2);
 D1 = inv(D);
 f = D1 * y;
 for i = 1:n
        for j = 1:n
            if j == i % checking for diagonal entry
                yTempVar = D * D1 (1:n, i);
                if truncateFunction (yTempVar(j), 1) ~= 1
                    fprintf ("something's wrong")
                    truncateFunction (yTempVar(j), 1)
                 return
             end
         end
     end
 end

function B=truncateFunction(A,pow)
A(abs(A)<10^-pow)=0;
B=A;

Соответствующий вывод такой:

something's wrong
ans = 1.0000

Я также пробовал это без функции округления, и я пробовал против 1.0000

Вот что у меня есть в моем реальном сценарии для проверки с

D=rand(4)*0.1;
y=randi([10 20], 4,1);
stiff(D,y)

1 Ответ

2 голосов
/ 21 февраля 2020

truncateFunction не делает то, что вы думаете, что делает. Он только округляет значения ниже заданной степени от десяти до нуля - он не округляется до ближайшего целого числа, если только это целое число не равно нулю.

В общем, лучше с проблемами с плавающей запятой (которые это is) проверить, что значения находятся в пределах небольшого значения, а не равны.

epsilon = .00001
if abs(yTempVar(j)-1) > epsilon
    fprintf ("something's wrong")
    truncateFunction (yTempVar(j), 1)
    return
...