使用最小二乘法找出正弦的近似值

时间:2014-01-22 11:05:06

标签: matlab least-squares sine

我正在做一个项目,我使用最小二乘法找到Sine函数的近似值。此外,我可以使用我自己选择的12个值。因为我无法弄清楚如何解决它我想到使用泰勒的Sine系列然后将其解决为5阶多项式。这是我的代码:

%% Find the sine of the 12 known values
x=[0,pi/8,pi/4,7*pi/2,3*pi/4,pi,4*pi/11,3*pi/2,2*pi,5*pi/4,3*pi/8,12*pi/20];
y=zeros(12,1);
for i=1:12
    y=sin(x);
end
n=12;
j=5;
%% Find the sums to populate the matrix A and matrix B
s1=sum(x);s2=sum(x.^2);
s3=sum(x.^3);s4=sum(x.^4);
s5=sum(x.^5);s6=sum(x.^6);
s7=sum(x.^7);s8=sum(x.^8);
s9=sum(x.^9);s10=sum(x.^10);
sy=sum(y);
sxy=sum(x.*y);
sxy2=sum( (x.^2).*y);
sxy3=sum( (x.^3).*y);
sxy4=sum( (x.^4).*y);
sxy5=sum( (x.^5).*y);
A=[n,s1,s2,s3,s4,s5;s1,s2,s3,s4,s5,s6;s2,s3,s4,s5,s6,s7;
    s3,s4,s5,s6,s7,s8;s4,s5,s6,s7,s8,s9;s5,s6,s7,s8,s9,s10];
B=[sy;sxy;sxy2;sxy3;sxy4;sxy5];

然后在matlab我得到了这个结果

>> a=A^-1*B
a =
   -0.0248
    1.2203
   -0.2351
   -0.1408
    0.0364
   -0.0021

然而,当我尝试替换泰勒系列中a的值并解决f.e t = pi / 2时,我得到了错误的结果

>> t=pi/2;
fun=t-t^3*a(4)+a(6)*t^5
fun =
    2.0967

当我在泰勒系列中替换a矩阵的值时,我做错了什么,或者我最初认为有缺陷?

注意:我无法使用任何内置功能

1 个答案:

答案 0 :(得分:0)

如果您需要最小二乘近似,只需决定您要近似的固定间隔,并在该间隔上生成一些x横坐标(可能使用linspace等距离横坐标 - 或非 - 在你的例子中,均匀间隔)。然后在每个点评估你的正弦函数,以便你有

y = sin(x)

然后只需使用polyfit函数(记录为here)即可获得最小二乘参数

b = polyfit(x,y,n)

其中n是您想要近似的多项式的次数。然后,您可以使用polyval(记录为here)来获取x的其他值的近似值。

编辑:由于您无法使用polyfit,因此您可以直接生成最小二乘近似的Vandermonde矩阵(以下假设x是行向量)。

A = ones(length(x),1);
x = x';
for i=1:n
    A = [A x.^i];
end

然后使用

简单地获得最小二乘参数
b = A\y;

你可以清楚地优化我刚刚编写的笨拙的Vandermonde生成循环来说明这个概念。为了获得更好的数值稳定性,您最好使用一个很好的正交多项式系统,如第一类Chebyshev多项式。如果您甚至不允许使用矩阵除\函数,那么您将需要编写自己的QR因子分解实现并以这种方式解决系统(或其他一些数值稳定的方法)。