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

У меня есть набор линейных алгебраических уравнений, Ax = К. куда это матрица 36х20 и Икс вектор 20х1, В 36×13 и Y 13×1. Ранг (A) = 20. Поскольку система переопределена, решение наименьших квадратов возможно, i, e; x = (A ^ TA) ^ — 1A ^ TBy. Мне нужно решение, чтобы остаточная ошибка e = Ax-By была минимизирована. Я использовал кленовый чтобы взять транспозицию и обратную матрицу, но обратная такая большая матрица занимает гораздо больше времени и оперативной памяти. Я даже целый день тратил на обратную матрицу, но из-за нехватки оперативной памяти она была прервана. Это очень медленно, и я думаю, что это невозможно с 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 и Yaw).
Однако B не является матрицей фиксированной ones а также zeros, B — матрица с элементами sin, cos углов, которые являются данными датчиков в реальном времени, а не фиксированными данными. В клене B это почти матрица переменных и фиксированных элементов, можно сказать dense sparse матрица. Между тем, у является вектором всех датчиков или кодеров.

0

Решение

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

С чисто плавающими данными 36×20 наименьших квадратов — это крошечная проблема, и Maple сможет сделать это за доли секунды.

Вы должны позволить LinearAlgebra:-LeastSquares рутина делает подъем, и не пытайтесь формировать или использовать нормальные уравнения или для матричных инверсий самостоятельно. Использовать method=SVD вариант, если вы хотите надежный подход. Пусть с этим справятся численные трудности.

1

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

Других решений пока нет …

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