Решение линейных (переопределенных) алгебраических уравнений

0

У меня есть набор линейных алгебраических уравнений, 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

1 ответ

1
Лучший ответ

Если ваши данные с плавающей точкой, то 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 если вам нужен надежный подход. Пусть речь идет о числовых трудностях.

  • 0
    Я отредактировал свой вопрос теперь с более подробной формулировкой матриц.
  • 0
    Что вы подразумеваете под "минимальной 2-нормой"? остаточная ошибка?
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню