Matlab中的正弦拟合与封闭式表达式(线性最小二乘法)

时间:2019-05-16 15:04:23

标签: matlab curve-fitting least-squares sin

给出数组:

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,则系数可以确定为:

enter image description here

(Chapra,《 Matlab的应用数值方法》,第四版)

所以我编码:

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

但是,根据mldvide help,我们可以使用MATLAB mldivide运算符,

如果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

这些结果与之前获得的结果不同。我在这里想念什么?为什么这些结果不一样?

我怀疑我不能使用封闭形式的表达式,但是为什么呢?

0 个答案:

没有答案