Нетривальное решение для AX = 0 с использованием собственного переполнения стека

Как я могу получить нетривиальное решение M*x=0 используя библиотеку линейной алгебры.
Я пробовал это, но решение — все нули.

Matrix<float,2,3> m ;
Matrix<float,2,1> y ;
m << 2 , 3 ,5 , -4 , 2, 3;
y(0,0) = 0;
y(1,0) = 0;
cout << "Here is matrix m:" << endl << m << endl;
cout << "Here is matrix y:" << endl << y << endl;
cout<<"solution: \n"<<m.fullPivLu().solve(y);

1

Решение

Вы хотите найти ненулевой элемент в ядре вашей матрицы (ядро — это такой набор x, что Mx = 0), поищите в Eigen декомпозицию, предлагающую метод kernel (), например, fullPivLu:

http://eigen.tuxfamily.org/dox/classEigen_1_1FullPivLU.html#a6e8f1d2fcbd86d3dc5a8a013b6e7200a

2

Другие решения

Вы пытаетесь решить M * x = 0так что имеет смысл вернуть x=0, Если вы хотите избежать этого тривиального решения, вы должны добавить дополнительные ограничения. Например, вы можете сказать, что хотите минимизировать |M * x|^2 при условии |x|=1 в этом случае вы сталкиваетесь с проблемой собственных значений (через множители Лагранжа). Ваше решение — собственный вектор, соответствующий минимальному собственному значению. Используя Eigen:

Matrix3f A = m.adjoint() * m;
Vector3f x = SelfAdjointEigenSolver<Matrix3f>(A).eigenvectors().col(0);

Здесь я получаю:

x = 0.032739  0.851202 -0.523816

а также m * x в порядке 1e-16,

1

По вопросам рекламы [email protected]