У меня есть 37 линейных уравнений и 36 переменных в виде матричного уравнения; А*Х=В. Уравнения не имеют точного ответа. Я хочу использовать метод наименьших квадратов Matlab, чтобы найти ответы с наименьшей ошибкой. Я новичок в Matlab, поэтому любые комментарии помогут. Спасибо
Как использовать метод наименьших квадратов в Matlab?
Ответы (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
имеет наименьшую сумму квадратов, а лево- оператор деления дает решение с максимально возможным числом нулевых коэффициентов.
x = inv(A' * A) * A * b
должен быть x = inv(A' * A) * A' * b
- person Tamás Szabó; 19.05.2015
Самый общий способ решить эту проблему — использовать псевдоинверсию:
X = pinv(A) * B;
lsqlin
. Я считаю, что синтаксис x = lsqlin(A,B,[],[],0,inf)
.
- person rlbond; 19.05.2015
mldivide
(оператор обратной косой черты) с точки зрения вычислительной сложности и числовой стабильности.
- person knedlsepp; 19.05.2015
mldivide
и pinv
эквивалентны для переопределенной задачи, такой как этот вопрос, но для недоопределенной задачи pinv
дает фактическое решение методом наименьших квадратов (решение с наименьшей энергией).
- person rlbond; 19.05.2015
Вы можете рассчитать x следующим образом:
x = (A'*A)\A'*B
pinv
является более общим.
- person rlbond; 19.05.2015
(A'*A)*inv(A)
дает то же решение, что и pinv
, и обратную косую черту. Если A необратима, ваше уравнение с использованием обратной косой черты все еще работает, но излишне сложно.
- person A. Donda; 19.05.2015
linprog
- person Tamás Szabó; 19.05.2015
A\b
с ` \ ` склоняется к A
означает inv(A)*b
(принимая полный ранг), а выполнение A/b
означает A*inv(b)
(также принимает полный ранг). Я все время путаюсь, и, наконец, я понял это, просто посмотрев в направлении, куда наклоняется косая черта.
- person rayryeng; 20.05.2015