最小二乘法的曲线拟合方法在MATLAB中的实现

、实验内容

已知一组实验数据如下表,求它的拟合曲线。

 x(i)

1

2

3

4

5

 f(i)

4

4.5

6

8

8.5

 w(i)

2

1

3

1

1

、程序清单与运行结果 

M文件代码如下:

function S=mypolyfit(X,F,W,m,n)
% mypolyfit输出通过最小二乘法求得的拟合曲线并绘图验证
% 例如:
% X=[1 2 3 4 5];
% F=[4 4.5 6 8 8.5];
% W=[2 1 3 1 1];
% S=mypolyfit(X,F,W,4,1)
% 
% G =
% 
%     [  8, 22]
%     [ 22, 74]
% 
% 
% d =
% 
%     47
%     291/2
% 
% 
% S =
% 
%     (65*x)/54 + 277/108
 
% 判断输入参数是否足够
if nargin~=5
    error('请输入最小二乘的用矩阵表示的离散点集、权值与点的个数和拟合次方')
end
 
% 判断离散点集和权值的个数是否充分
C=[X',F',W'];
[r c]=size(C);
number=r*c;
if number~=3*(m+1)
    error('离散点集和权值的个数不充分')
end

% 生成线性无关函数族
syms x;
for i=1:n+1
    A(i)=x^(i-1);
end
 
% 计算G
for j=1:n+1
    for i=1:n+1
        for k=1:m+1
            B(k)=W(k)*subs(A(i),x,k)*subs(A(j),x,k);
        end
        G(i,j)=sum(B);
    end
end
G
 
% 计算d
for j=1:n+1
    for k=1:m+1
        B(k)=W(k)*F(k)*subs(A(j),x,k);
    end
    d(j)=sum(B);
end
d=d'
 
% 求出拟合曲线的系数
G=G^-1;
C=G*d;
S=0;
for i=1:n+1
    S=S+C(i)*x^(i-1);
end
 
% 画图
scatter(X,F,'+');
hold on;
ezplot(S,[0,6]);
xlabel('x')
ylabel('y')
title('拟合曲线')

end

运行结果如下:

>> S=mypolyfit(X,F,W,4,1)
 
G =
 
[  8, 22]
[ 22, 74]
 
 
d =
 
    47
 291/2
 
 
S =
 
(65*x)/54 + 277/108

拟合曲线如下所示:

、实验总结

在本次实验中,我将编写的算法的功能扩大,使之不仅仅限于能够完成进行五个离散点、一次方的最小二乘拟合,而是能够完成任意多离散点、任意次的最小二乘拟合,离散点集、权值由控制台手动创立一个矩阵来输入,而所求的拟合次方也能在控制台输入,达到了普遍适用的目的。

微信扫码订阅
UP更新不错过~
关注
  • 17
    点赞
  • 121
    收藏
  • 打赏
    打赏
  • 7
    评论

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:技术黑板 设计师:CSDN官方博客 返回首页
评论 7

打赏作者

万物基于滑稽

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值