Matlab 用最小二乘法求正弦近似值

Matlab 用最小二乘法求正弦近似值,matlab,least-squares,trigonometry,Matlab,Least Squares,Trigonometry,我在做一个项目,我用最小二乘法找到正弦函数的近似值。我也可以用我自己选择的12个值,因为我不知道怎么解,所以我想用泰勒级数求正弦,然后把它作为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个值,因为我不知道怎么解,所以我想用泰勒级数求正弦,然后把它作为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.et=pi/2时,我得到了错误的结果

>> t=pi/2;
fun=t-t^3*a(4)+a(6)*t^5
fun =
    2.0967
当我替换泰勒级数中
a
矩阵的值时,我做错了什么,或者我最初的想法有缺陷吗


注意:我不能使用任何内置函数

如果需要最小二乘近似值,只需确定要近似的固定间隔,并在该间隔上生成一些
x
横坐标(可能是使用
linspace
-等间距横坐标,或如示例中所示的非等间距横坐标)。然后在每个点上计算正弦函数,以便

y = sin(x)
然后只需使用
polyfit
函数(已记录)即可获得最小二乘参数

b = polyfit(x,y,n)
其中,
n
是要近似的多项式的阶数。然后可以使用
polyval
(有文档记录)获得其他x值的近似值

编辑:由于不能使用
polyfit
,因此可以直接为最小二乘近似生成Vandermonde矩阵(以下假定
x
为行向量)

然后简单地使用

b = A\y;

你可以清楚地优化上面我刚刚写的笨拙的Vandermonde生成循环来说明这个概念。为了更好的数值稳定性,你最好使用一个很好的正交多项式系统,比如第一类切比雪夫多项式。如果你甚至不被允许使用矩阵除法
\
函数,那么你需要对你自己的QR分解的实现进行编码,并用这种方法(或其他数值稳定的方法)求解系统.

我不能使用
polyfit
或任何其他内置函数。你能写下你最初的想法吗?它让我想起了a,但另外你有所有这些总和。如果你问的是这个,我用它作为指导。如果不是,告诉我,这样我可以更好地解释。那么你的测试函数是错误的-你需要使用所有
a
s.相关的/有用的:@bdecaf我如何在测试中使用所有的
a
s?你能解释一下吗?@Rody Oldenhuis我会检查一下,谢谢
b = A\y;