用最小二乘法计算拟合曲线系数的MATLAB 程序
(1) 输入数据点m k y x k k ,,2,1),,( =
选择逼近函数类:)}(,),(),({10x x x span D n ϕϕϕ =
(2)求解法方程y A Ac A T T =*
(3)得出拟合函数)()(0*
*x c x n
j j
j ∑==ϕϕ
clear all %% 清除了所有的变量,包括全局变量global
load('F:\XX\XXX\datafile.mat') %%加载数据(mat 数据格式是matlab 的数据存储的标准格式)
[r,c]=size(data); %%data 数据第一列为点序号,第二列为x 坐标,第三列为y 坐标 m=20; %%假设其运行次数
for n=1:m;
for i=1:r/2 %%用数据的前半部分计算系数
x1=data(i,2); %%把数据的第i 行第2列赋值给x1
y1=data(i,3); %%把数据的第i 行第3列赋值给y1
for j=1:n;
B1(i,j)=x1^(j-1); %%B1矩阵计算
end
l(i,1)=y1; %%l 矩阵
end
X=inv(B1'*B1)*B1'*l; %%系数矩阵
V=B1*X-l;
[r1,c1]=size(B1);
m0(n,1)=sqrt((V'*V)/(r1-c1)); %%单位权中误差
if n>2&&m0(n,1)>=m0(n-1,1); %%判断单位权中误差
disp(n)
xsgs=n-1; %%单位权中误差最小时其系数的个数
zgcs=n-2; %%单位权中误差最小时其x 的最高次数
break %%如果找到了最优值时跳出循环
end
end
for i=1:r
x2=data(i,2);
y2=data(i,3);
for k=1:xsgs;
B2(i,k)=x2^(k-1);
end
l2(i,1)=y2;
X1=inv(B2'*B2)*B2'*l2; %%计算出最优的系数矩阵
end
x2=data(:,2); %%把数据的所有行第2列赋值给x2
y2=data(:,3); %%把数据的所有行第2列赋值给y2
plot(x2,y2,'bo'); %%作出测量点的图形
hold on
y3(i,1)=0;
for i=1:r;
for k=1:5;
a=X1(k,1)*data(i,2)^(k-1);
y3(i,1)=y3(i,1)+a;
end %%该循环是将求出的系数代入拟合曲线,验证所有数据end
y4=y3(:,1);
plot(x2,y4,'r'); %%作出拟合曲线的图形
title('最小二乘法拟合'); %%作给做出的图形加上标题
xlabel('数据'); %%x轴标注
ylabel('拟合'); %%y轴标注
legend('观测数据点','拟合曲线',1); %%添加图例的标注msgbox '计算完毕!';。