Вы ищете нетривиальное решение v для A*v=v с v=[x;y;z] и...
A =
0.70710678118655 0 0.70710678118655
-0.50000000000000 0.70710678118655 0.50000000000000
-0.50000000000000 -0.70710678118655 0.50000000000000
Вы можете преобразовать это в (AI)v=0, где I — единичная матрица 3x3. Что вам нужно сделать, чтобы найти нетривиальное решение, так это проверить нулевое пространство A-I:
>> null(A-eye(3))
ans =
0.67859834454585
-0.67859834454585
0.28108463771482
Итак, у вас есть одномерное нулевое пространство. В противном случае вы увидите более одного столбца. Каждая линейная комбинация столбцов является точкой в этом пустом пространстве, которую A-I отображает в нулевой вектор. Таким образом, каждое кратное этому вектору является решением вашей проблемы.
На самом деле ваша матрица A является матрицей вращения первого рода, потому что det(A)=1 и A'*A=identity. Таким образом, он имеет собственное значение 1 с осью вращения в качестве соответствующего собственного вектора. Вектор, который я вычислил выше, является нормализованной осью вращения.
Примечание. Для этого я заменил ваш 0,7071 на sqrt (0,5). Если ошибки округления вызывают беспокойство, но вы заранее знаете, что должно быть нетривиальное решение, лучше всего выполнить сингулярное разложение A-I и выбрать самый правый сингулярный вектор:
>> [u,s,v] = svd(A-eye(3));
>> v(:,end)
ans =
0.67859834454585
-0.67859834454585
0.28108463771482
Таким образом, вы можете вычислить вектор v, который минимизирует |A*v-v| при условии, что |v|=1, где |.| является евклидовой нормой.
person
sellibitze
schedule
13.11.2009