2014-01-22 71 views
0

我做的一个项目,我发现正弦函数的近似,采用最小二乘法查找正弦逼近。我也可以使用我自己选择的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 

然而当我尝试替换的值在泰勒级数和解决FE T = PI/2 I得到错误的结果

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

我正在做一些事情吴当我更换a矩阵的值泰勒级数或者是我最初的想法有缺陷?

注:如果你需要一个最小二乘近似,只是在要接近上并产生一些x横坐标固定的时间间隔决定我不能使用任何内置函数

+0

你能否写下你原来的想法 - 它让我想起[Vandermonde矩阵](http://en.wikipedia.org/wiki/Vandermonde_matrix),但你还有所有这些金额。 – bdecaf

+0

我用这个作为指南[链接](http://kobus.ca/seminars/ugrad/NM5_curve_s02.pdf),如果这是你的要求。如果没有,告诉我,我可以更好地解释 –

+0

啊我明白了。那么你的测试功能是错误的 - 你需要使用所有的'a's。 – bdecaf

回答

0

间隔(可能相等间隔的横坐标使用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; 

上述我刚写入说明该概念可以清楚地优化笨拙范德蒙生成循环获得最小二乘参数。为了获得更好的数值稳定性,最好使用像第一类Chebyshev多项式这样的好的正交多项式系统。如果您甚至不允许使用矩阵分割函数,那么您需要编写自己的QR因式分解的实现并以这种方式解决系统问题(或其他一些数字稳定的方法)。

+0

我不能使用'polyfit'或任何其他内置函数。 –