2014-02-04 6 views
0

У меня есть набор линейных алгебраических уравнений, Ax = By. Там, где является матрица 36x20 и х представляет собой вектор 20х1, Б является 36x13 и у является 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] 

х в основном положении (х, у, г) и ориентации (крен, тангаж и рыскание) вектор. Однако B не является матрицей фиксированных ones и zeros. B - матрица с элементами sin, cos углов, которые являются данными датчиков реального времени, а не фиксированными данными. В клене B есть почти матрица переменных и фиксированных элементов, вы можете сказать, что матрица dense sparse. Между тем, y является вектором всех датчиков или энкодеров.

ответ

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 делать подъем, а не пытаться формировать или использовать обычные уравнения или инверсии матрицы. Используйте опцию method=SVD, если вам нужен надежный подход. Пусть речь идет о числовых трудностях.

+0

Я сейчас редактировал свой вопрос с более подробной формулировкой матриц. –

+0

Что вы подразумеваете под «минимальной 2-нормой»? остаточная ошибка? –

+0

Я пробовал, но .... Ошибка, (в LinearAlgebra: -LeastSquares) объект слишком большой –

Смежные вопросы