Как использовать метод наименьших квадратов в Matlab?

У меня есть 37 линейных уравнений и 36 переменных в виде матричного уравнения; А*Х=В. Уравнения не имеют точного ответа. Я хочу использовать метод наименьших квадратов Matlab, чтобы найти ответы с наименьшей ошибкой. Я новичок в Matlab, поэтому любые комментарии помогут. Спасибо


person nasim    schedule 19.05.2015    source источник
comment
Х=А\б. Так просто.check mldivide   -  person Ander Biguri    schedule 19.05.2015
comment
@AnderBiguri, лучше сделай это ответом.   -  person A. Donda    schedule 19.05.2015
comment
Вот это да !! Это сработало! Как насчет того, чтобы применить условие, что x(i)›0   -  person nasim    schedule 19.05.2015
comment
@nasim, я думаю, это делает его линейным программированием проблема. Лучше опубликуйте еще один вопрос об этом — предварительно проведя небольшое исследование.   -  person A. Donda    schedule 19.05.2015


Ответы (3)


Если A имеет полный ранг, т. е. столбцы A линейно независимы, решение методом наименьших квадратов переопределенной системы линейных уравнений

A * x = b

можно найти, обратив нормальное уравнение (см. Линейный метод наименьших квадратов):

x = inv(A' * A) * A' * b

Если A не имеет полного ранга, A' * A необратимо. Вместо этого можно использовать псевдоинверсию A

x = pinv(A) * b

или оператор Matlab left-division

x = A \ b

Оба дают одно и то же решение, но левое деление более эффективно с точки зрения вычислений.

Два последних метода вычислений также могут иметь дело с недоопределенными системами линейных уравнений, но в этом случае они дают разные решения: псевдообратный метод дает решение, в котором x имеет наименьшую сумму квадратов, а лево- оператор деления дает решение с максимально возможным числом нулевых коэффициентов.

person A. Donda    schedule 19.05.2015
comment
Я думаю, что ваш x = inv(A' * A) * A * b должен быть x = inv(A' * A) * A' * b - person Tamás Szabó; 19.05.2015

Самый общий способ решить эту проблему — использовать псевдоинверсию:

X = pinv(A) * B;
person rlbond    schedule 19.05.2015
comment
Как насчет того, чтобы применить условие, что x(i)›0 - person nasim; 19.05.2015
comment
Для этого вам нужна функция lsqlin. Я считаю, что синтаксис x = lsqlin(A,B,[],[],0,inf). - person rlbond; 19.05.2015
comment
Это численно уступает использованию mldivide (оператор обратной косой черты) с точки зрения вычислительной сложности и числовой стабильности. - person knedlsepp; 19.05.2015
comment
mldivide и pinv эквивалентны для переопределенной задачи, такой как этот вопрос, но для недоопределенной задачи pinv дает фактическое решение методом наименьших квадратов (решение с наименьшей энергией). - person rlbond; 19.05.2015
comment
Я согласен с knedlsepp. Вычисление обратной (или псевдообратной) матрицы почти никогда не бывает хорошей идеей, если все, что вы хотите сделать, это решить линейную систему, как из соображений эффективности, так и из соображений стабильности. - person cfh; 19.05.2015

Вы можете рассчитать x следующим образом:

x = (A'*A)\A'*B

person Tamás Szabó    schedule 19.05.2015
comment
Я не уверен, что это правильно - person Ander Biguri; 19.05.2015
comment
@AnderBiguri Ты прав. Я только что исправил это, хотя ваш ответ компактнее моего. - person Tamás Szabó; 19.05.2015
comment
Это выражение верно только тогда, когда A имеет полный ранг столбца. pinv является более общим. - person rlbond; 19.05.2015
comment
@TamásSzabó, если A обратимо, (A'*A)*inv(A) дает то же решение, что и pinv, и обратную косую черту. Если A необратима, ваше уравнение с использованием обратной косой черты все еще работает, но излишне сложно. - person A. Donda; 19.05.2015
comment
@rlbond, это также работает, если A не имеет полного ранга, потому что Тамас использует оператор обратной косой черты - person A. Donda; 19.05.2015
comment
Как насчет того, чтобы применить условие, что x(i)›0 - person nasim; 19.05.2015
comment
@nasim, вы не можете накладывать ограничения на решение, когда ваша проблема сформулирована в виде уравнения. Если ваша проблема связана с неравенством, взгляните на функцию Matlab linprog - person Tamás Szabó; 19.05.2015
comment
@ TamásSzabó, я снова должен исправить себя. Я часто путаюсь в том, как идет оператор обратной косой черты. - person A. Donda; 19.05.2015
comment
@ A.Donda - Просто помните, куда учится косая черта. Везде, где он склоняется, там и происходит обратное... так что A\b с ` \ ` склоняется к A означает inv(A)*b (принимая полный ранг), а выполнение A/b означает A*inv(b) (также принимает полный ранг). Я все время путаюсь, и, наконец, я понял это, просто посмотрев в направлении, куда наклоняется косая черта. - person rayryeng; 20.05.2015