%% 曲线拟合的最小二乘法
%% 微信公众号:海洋与大气科学
%% 时间:20221105
%% 作者:mapm
clear;clc;close all;
x=[1.9;2;2.1;2.5;2.7;2.7;3.5;3.5;4;4;4.5;…
4.6;5;5.2;6;6.3;6.5;7.1;8;8;8.9;9;9.5;10;…
];
y=[1.4;1.3;1.8;2.5;2.8;2.5;3;2.7;…
4;3.5;4.2;3.5;5.5;5;5.5;6.4;6;5.3;6.5;7;…
8.5;8;8.1;8.1];
% 颜色的调用
cmap(1:5,:)=colormore_26([1 2 3 4 5]);
cmap(1:4,:)=colormore_44([1 2 3 4]);
num=44;
figure
scatter(x,y,‘*’,‘MarkerEdgeColor’, cmap(2,:),‘MarkerFaceColor’, cmap(2,:),‘LineWidth’,1.5,‘SizeData’, 36);
%% 最小二乘法
%1 内积各个数字求法:
f0f0=24;
f0f1=sum(x);
f1f1=sum(x.^2);
f0f=sum(1.*y);
f1f=sum(x.*y);
%% 法方程组
A=[f0f0 f0f1
f0f1 f1f1];
B=[f0f;f1f];
c=A\B;% 线性方程组简单求解
% 因此,方程组为:yy=c(1)+c(2)*xx;
syms xx
yy=c(1)+c(2)xx;
% 画图
figure
scatter(x,y,'‘,‘MarkerEdgeColor’, cmap(2,:),‘MarkerFaceColor’, cmap(2,:),‘LineWidth’,1.5,‘SizeData’, 36);
hold on
plt_h=fplot(yy);
set(plt_h,‘color’,cmap(4,:),‘linewidth’,1.5)
grid on
set(gca,‘GridLineStyle’,’:‘,‘GridColor’,cmap(5,:),‘LineWidth’,1.5)
leg_h=legend(‘散点’,‘最小二乘法拟合’,‘orientation’,‘horizontal’);
set(leg_h,‘position’,[0.25 0.80 0.4 0.1],‘fontsize’,10)
legend boxoff;
axis([1 10 0 10])
% 平方误差:ff=sum(y.^2)
wucha=sum(y.^2)-(c(1)*f0f+c(2)f1f)
text(5,2,[‘平方误差:’,num2str(wucha)])
text(5,3,‘拟合曲线为:y=0.1505+0.8587x’)
export_fig([‘例题一:最小二乘法拟合’,num2str(num),‘.png’],‘-r300’)
%% 例二
% clear;clc;close all;
x=[0.24;0.65;0.95;1.24;1.73;2.01;2.23;2.52;2.77;2.99];
y=[0.23;-0.26;-1.10;-0.45;0.27;0.1;-0.29;0.24;0.56;1];
% 颜色的调用
% cmap=colormore_12([1 2 3 4 5]);
figure
scatter(x,y,'’,‘MarkerEdgeColor’, cmap(2,:),‘MarkerFaceColor’, cmap(2,:),‘LineWidth’,1.5,‘SizeData’, 36);
grid on
set(gca,‘GridLineStyle’,‘:’,‘GridColor’,cmap(5,:),‘LineWidth’,1.5)
figure
scatter(x,y,‘*’,‘MarkerEdgeColor’, cmap(2,:),‘MarkerFaceColor’, cmap(2,:),‘LineWidth’,1.5,‘SizeData’, 36);
hold on
plot(x,y,‘-’,‘linewidth’,1.5,‘color’,cmap(4,:))
grid on
set(gca,‘GridLineStyle’,‘:’,‘GridColor’,cmap(5,:),‘LineWidth’,1.5)
%% 最小二乘法
f0f0=sum(log(x).^2);
f0f1=sum(log(x).*cos(x));
f0f2=sum(log(x).*exp(x));
f1f1=sum(cos(x).^2);
f1f2=sum(cos(x).*exp(x));
f2f2=sum(exp(x).^2);
f0f=sum(log(x).*y);
f1f=sum(cos(x).*y);
f2f=sum(exp(x).*y);
%
A=[f0f0 f0f1 f0f2
f0f1 f1f1 f1f2
f0f2 f1f2 f2f2];
B=[f0f;f1f;f2f];
c=A\B;% 线性方程组简单求解
% 因此,方程组为:yy=c(1)*log(xx)+c(2)*cos(xx)+c(3)*exp(x);
syms xx
yy=c(1)*log(xx)+c(2)cos(xx)+c(3)exp(xx);
% 画图
% 颜色的调用
% cmap=colormore_12([1 2 3 4 5]);
% num=12;
figure
scatter(x,y,'‘,‘MarkerEdgeColor’, cmap(2,:),‘MarkerFaceColor’, cmap(2,:),‘LineWidth’,1.5,‘SizeData’, 36);
hold on
plot(x,y,’-‘,‘linewidth’,1.5,‘color’,cmap(4,:))
hold on
plt_h=fplot(yy);
set(plt_h,‘color’,cmap(3,:),‘linewidth’,1.5)
grid on
set(gca,‘GridLineStyle’,’:',‘GridColor’,cmap(5,:),‘LineWidth’,1.5)
leg_h=legend(‘散点’,‘折线’,‘最小二乘法拟合’,‘orientation’,‘horizontal’);
set(leg_h,‘position’,[0.25 0.80 0.4 0.1],‘fontsize’,10)
legend boxoff;
axis([0.2 3.2 -1.5 1.5])
text(1.1,-1,'拟合曲线为:y=-1.04lnx-1.2613cos(x)+0.03exp(x)‘)
export_fig([‘例题二:最小二乘法拟合’,num2str(num),’.png’],‘-r300’)