С учетом массивов:
t = 0:0.25:2;
y = [3.0800 3.4900 3.1500 2.2300 1.2300 0.6900 0.8900 1.7300 2.7600];
Массив y
был создан на основе выражения 2+sin(3*t)+cos(3*t)
, добавил немного шума и урезан до 2 десятичных знаков.
Мы хотим получить параметры модели
y = A0 + A1*cos(w0*t) + B1*sin(w0*t)
Это, конечно, анализ Фурье, но мы хотим изучить его в смысле наименьших квадратов.
Если у нас есть N
наблюдений, равномерно распределенных с интервалами dt
и общей длиной записи T=(N-1)*dt
, коэффициенты могут быть определены как:
(Чапра, Прикладные численные методы с Matlab, 4-е издание)
Так что я код:
N = length(t)
A0 = sum(y)/N
A1 = 2*sum(y.*cos(3*t))/N
B1 = 2*sum(y.*sin(3*t))/N
И получите результаты
N =
9
A0 =
2.138888888888889
A1 =
1.337796008190744
B1 =
0.868485945765937
Однако мы можем использовать оператор MATLAB mldivide
при условии, что, согласно mldvide help :
Если A - прямоугольная матрица m-на-n с m ~ = n, а B - матрица с m строками, то A \ B возвращает решение наименьших квадратов в система уравнений A x = B. *
Я могу кодировать, тогда:
X = [ones(length(t),1) (cos(w0*t)).' (sin(w0*t)).']
a = X\(y.')
Что дает мне результаты:
a =
2.079400007449057
0.999055551110904
1.000625226465150
Эти результаты не совпадают с полученными ранее. Что мне здесь не хватает? Почему эти результаты не совпадают?
Я подозреваю, что не могу использовать выражения закрытой формы, но почему именно?