Ответ 1
Проблема действительно в вашей математике. Матрица, которую вы предоставили, не имеет полного ранга, поэтому она не обратима. Вы можете проверить это вручную (не потратив время на это), но MATLAB уже указывает это, показывая это предупреждение.
Поскольку вы работаете с числами с плавающей запятой, это иногда вызывает другие тонкие проблемы, один из которых вы можете увидеть в результате det(A)
, который находится в порядке 1e-16
, то есть точность машины или 0 на практике.
Вы можете видеть, что эта матрица не имеет полного ранга, выполняя функцию rank
: rank(A) = 8
. Для матрицы 9x9
это действительно означает, что матрица не обратима для удвоений (поскольку функция rank
учитывает точность машины).
Если вы хотите использовать MATLAB для получения результата, который соответствует расчету вручную, вы можете использовать Symbolic Toolbox и его vpa
(арифметику с переменной точностью) для решения возможных числовых задач за счет более медленного вычисления.
B = [5 1 -2 0 0 -1 -1 0 0;
1 1 0 0 0 -1 -1 0 0;
-2 0 5 -1 -2 0 0 -1 1;
0 0 -1 1 0 0 0 1 -1;
0 0 -2 0 3 -1 1 0 0;
-1 -1 0 0 -1 4 0 -2 0;
-1 -1 0 0 1 0 2 0 0;
0 0 -1 1 0 -2 0 4 0;
0 0 1 -1 0 0 0 0 2];
A = B/2;
size(A) % = [9 9]
det(A) % = -1.38777878078145e-17
rank(A) % = 8
C = vpa(A);
det(C) % = 0.0
rank(C) % = 8
Как с VPA, так и с плавающими точками вы получите, что ранг равен 8, размер [9 9], а детерминант - практически 0, то есть сингулярный или не обратимый. Изменение нескольких записей может привести к тому, что ваша матрица будет регулярной (неособой), но она не будет гарантирована, и она решит другую проблему.
Чтобы решить вашу актуальную проблему A*x=b
для x
, вы можете попробовать использовать mldivide
(a.k.a. оператор обратной косой черты) или псевдообратный псевдоним Moore-Penrose:
x1 = A\b;
x2 = pinv(A)*b;
Но помните, что такая система не имеет уникального решения, поэтому и псевдо-обратный, и обратный слэш-оператор могут (и в этом случае) возвращать очень разные решения, независимо от того, приемлемо ли какое-либо из них, действительно зависит от вашего приложение.