MATALB运用——最小二乘法拟合

实验一

编制以函数 { x k } k = 0 n \{x^k\}_{k=0}^n {xk}k=0n为基的多项式最小二乘拟合程序,并用于对下表中的数据作3次多项式最小二乘拟合。
在这里插入图片描述
取权函数 w i = 1 w_i=1 wi=1,求拟合曲线 φ n = ∑ k = 0 n α k n x k \varphi^n=\sum_{k=0}^n\alpha_k^nx^k φn=k=0nαknxk中的参数 { α k } \{\alpha_k\} {αk}、平方误差 δ 2 {\delta^2} δ2,并作离散数据 { x i , y i } \{x_i,y_i\} {xi,yi}的拟合函数 y = φ ∗ ( x ) y=\varphi^*(x) y=φ(x)的图形。

1、思路

在MATLAB中,多项式最小二乘法的拟合可以采用库函数polyfit()
p = polyfit(x,y,n) :返回次数为 n 的多项式 p(x) 的系数,该阶数是 y 中数据的最佳拟合(在最小二乘方式中)。p 中的系数按降幂排列,p 的长度为 n+1。

2、程序

function test_1
format long
%利用库函数polyfit做3次多项式最小二乘拟合
%求参数{a_k}、平方误差、拟合函数的图形
x=[-1.0,-0.5,0.0,0.5,1.0,1.5,2.0];
y=[-4.447,-0.452,0.551,0.048,-0.447,0.549,4.552];
p=polyfit(x,y,3);%3次多项式最小二乘拟合
y1=polyval(p,x);
r=sum((y-y1).^2);%平方误差
clf;
plot(x,y,'*');
hold on;
x0=[-1:0.01:2];
plot(x0,polyval(p,x0),'r-');
axis([-1.5,2.5,-5,5]);
xlabel('x轴');ylabel('y轴');title('3次多项式最小二乘拟合');
disp(['平方误差:',sprintf('%g',r)]);
disp(['参数:',sprintf('%g\t',p)]);

3、运行结果

平方误差:2.17619e-05
参数:1.99911 -2.99767 -3.96825e-05
在这里插入图片描述

实验二

编制正交化多项式最小二乘法拟合程序,并用于求解上题中的3次多项式最小二乘法拟合问题,做拟合曲线的图形,计算平方误差,并于实验一进行比较。

1、思路

在这里插入图片描述

2、程序


function test_3_2
format long
%利用正交化求数据的二次多项式拟合
%输出:拟合系数参数、平方误差、拟合图像
x=[-1.0,-0.5,0.0,0.5,1.0,1.5,2.0];
y=[-4.447,-0.452,0.551,0.048,-0.447,0.549,4.552];
w=[1,1,1,1,1,1,1];
n=3;
[a,b,c,alph,r]=flp(x,y,w,n)
disp(['平方误差:',sprintf('%g',r)]);
disp(['参数:',sprintf('%g\t',alph)]);
clf;
plot(x,y,'*');
hold on;
x0=[-1:0.01:2];
plot(x0,polyval(alph,x0),'r-');
axis([-1.5,2.5,-5,5]);
xlabel('x轴');ylabel('y轴');title('正交化的3次多项式最小二乘拟合');


function [a,b,c,alph,r]=flp(x,y,w,n)
%求正交递推公式的参数a、b,拟合多项式的系数c,整理之后的降幂系数alpha
m=length(x);
s1=ones(1,m);
v1=sum(w);
d(1)=y*w';c(1)=d(1)/v1;
for k=1:n
    xs=x.*s1.^2*w';
    a(k)=xs/v1;
    if (k==1)
        s2=(x-a(k)).*s1;
    else
        b(k)=v2/v11;
        s2=(x-a(k)).*s1-b(k)*s0;
    end
    v2=s2.^2*w';
    d(k+1)=y.*s2*w';c(k+1)=d(k+1)/v2;
    v11=v1;v1=v2;s0=s1;s1=s2;
end

%求平方误差r
r=y.*y*w'-c*d';

%拟合多项式合并同类项后的降幂系数
syms x
p0=1;
T=c(1)*p0;
for k=2:n+1
    if (k==2)
        p2=x-a(k-1);
    else
        p2=(x-a(k-1))*p1-b(k-1)*p0;
        p0=p1;
    end
    T=T+c(k)*p2;
    p1=p2;
end
T=collect(T);%合并同类项
alph=sym2poly(T);

3、运行结果

在这里插入图片描述
在这里插入图片描述
可见,但多项式次数为3时,两种方法拟合的结果和误差基本一致。

  • 11
    点赞
  • 138
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲谈社

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值