У меня есть набор линейных алгебраических уравнений, Ax = By. Где A - матрица 36x20, а x - вектор 20x1, B - 36x13, а y - 13x1. Ранг (A) = 20. Поскольку система переопределена, возможно решение наименьших квадратов, i, e; x = (A ^ TA) ^ -1A ^ TBy. Я хочу решение так, чтобы остаточная ошибка e = Ax-By была минимизирована. Я использовал Maple для переноса и инверсии матриц, но для обращения к такой большой матрице требуется намного больше времени и ОЗУ. Я даже потратил целый день на матрицу обратного, но из-за нехватки оперативной памяти она была прервана. Это очень медленно, и я думаю, что это невозможно достичь с помощью Maple.
Может ли кто-нибудь предложить какое-либо решение этого способа в C++ или любой другой способ решения уравнений, а не принимать инверсии и транспонировать.
Формирование матриц,
[ 1 0 0 ...0]
[ 0 1 0 ...0]
[ 0 0 1 ...0] [LinearVelocity_x]
[ 0 0 0 ...1] [LinearVelocity_y]
[ . . . ....], x=[LinearVelocity_z]
A = [ . . . ....] [RotationalVelocity_ROLL]
[ . . . ....] [RotationalVelocity_PITCH]
[ 1 0 0 ...0] [RotationalVelocity_YAW]
[ 0 1 0 ...0]
[ 0 0 1 ...0]
[ 0 0 0 ...1]
x - это в основном положение (x, y, z) и вектор ориентации (Roll, Pitch and Yaw). Однако B не является матрица основных ones
и zeros
. B - матрица с элементами sin
, cos
углов, которые являются данными в режиме реального времени, а не фиксированными данными. В клене B есть почти матрица переменных и фиксированных элементов, вы можете сказать dense sparse
матрицу. Между тем, y является вектором всех датчиков или энкодеров.
Если ваши данные с плавающей точкой, то Maple должен получить это очень быстро. Если A
, B
и y
имеют только числовые записи, попробуйте,
ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y) );
или, если вы хотите, чтобы решение, которое само по себе имело минимальную 2-норму,
ans := LinearAlgebra:-LeastSquares( evalf(A), evalf(B.y), 'optimize'=true );
Я предполагаю, что ваши данные являются чисто рациональными или целыми, и вы не можете понять, что использование этого приведет к тому, что Maple попытается найти точный рациональный ответ. Или у вас может быть некоторое неизвестное символическое количество в данных (... хотя это может сделать задачу вычисления минимальной остаточной проблематики). Такие чисто точные данные, будь то рациональные или символические, являются потенциальным кошмаром, связанным с памятью, и, вероятно, совсем не то, что вы действительно хотите в вас, рассматриваете C++ как альтернативную схему. Вот почему я завернул с призывами evalf
, чтобы данные были плавающими.
С чисто поплавковыми данными наименьшие квадраты 36x20 являются крошечной проблемой, и Maple должен иметь возможность сделать это всего за долю секунды.
Вы должны позволить LinearAlgebra:-LeastSquares
выполнить LinearAlgebra:-LeastSquares
, а не пытаться формировать или использовать обычные уравнения или инверсии матрицы. Используйте опцию method=SVD
если вам нужен надежный подход. Пусть речь идет о числовых трудностях.