Вы делаете [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 )