一、实验内容
已知一组实验数据如下表,求它的拟合曲线。
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~=5error('请输入最小二乘的用矩阵表示的离散点集、权值与点的个数和拟合次方')
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+1A(i)=x^(i-1);
end% 计算G
for j=1:n+1for i=1:n+1for k=1:m+1B(k)=W(k)*subs(A(i),x,k)*subs(A(j),x,k);endG(i,j)=sum(B);end
end
G% 计算d
for j=1:n+1for k=1:m+1B(k)=W(k)*F(k)*subs(A(j),x,k);endd(j)=sum(B);
end
d=d'% 求出拟合曲线的系数
G=G^-1;
C=G*d;
S=0;
for i=1:n+1S=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 =47291/2S =(65*x)/54 + 277/108
拟合曲线如下所示:
三、实验总结
在本次实验中,我将编写的算法的功能扩大,使之不仅仅限于能够完成进行五个离散点、一次方的最小二乘拟合,而是能够完成任意多离散点、任意次的最小二乘拟合,离散点集、权值由控制台手动创立一个矩阵来输入,而所求的拟合次方也能在控制台输入,达到了普遍适用的目的。