Левая матрица делится на векторы - PullRequest
0 голосов
/ 10 января 2019

Насколько явно Matlab решает самое правое уравнение в c1, в частности, ((x-1)\y)?

Мне хорошо известно, что происходит, когда вы используете матрицу, например, A \ b (где A - матрица, а b - вектор столбцов), но что происходит, когда вы используете обратную косую черту для двух векторов с одинаковыми строками?

Проблема:

x = (1:3)';
y = ones(3,1);
c1 = ((x-1)\y) % why does this =0.6?

1 Ответ

0 голосов
/ 10 января 2019

Вы делаете [0;1;2]\[1;1;1]. По существу, x=0.6 является решением наименьших квадратов для

[0;1;2]*x=[1;1;1]

Дело, которое у вас есть из документации , выглядит следующим образом:

Если A - прямоугольная матрица размером m на n с m ~ = n, а B - матрица с m строками, то A \ B возвращает решение системы наименьших квадратов для системы уравнений A * x = B .

(В частности, у вас есть m=3, n=1).

A = (1:3).' - 1; % = [0;1;2]
B = ones(3,1);   % = [1;1;1]

x = A\B; % = 0.6

Алгебраически легко понять, что это решение минимизации наименьших квадратов

% Calculate least squares
leastSquares = sum( ((A*x) - B).^2 )
             = sum( ([0;1;2]*x - [1;1;1]).^2 )
             = sum( [-1; x-1; 2x-1].^2 )
             = 1 + (x-1)^2 + (2x-1)^2
             = 1 + x^2 - 2*x + 1 + 4*x^2 - 4*x + 1
             = 5*x^2 - 6*x + 3
% Minimum least squares -> derivative = 0
d(leastSquares)/dx = 10*x - 6 = 0
              10*x = 6
                 x = 0.6

Я не сомневаюсь, что MATLAB использует более сложный алгоритм , чтобы прийти к такому же выводу, но это довольно просто объясняет математику.


Экспериментально можно увидеть, что лучшего решения не существует, проверив следующее для различных значений x ... 0,6 дает наименьшую ошибку:

sum( ([0;1;2]*x - [1;1;1]).^2 ) 
...