转自:https://blog.csdn.net/zyj1286076714/article/details/50375935
MATLAB中自带的cftool拟合工具箱不能将多条曲线同时画在同一副图中,而常规的plot()函数又不能拟合平滑直线,接下来总结一种可以利用cftool导出的代码,在一张图中拟合多条平滑曲线。
首先输入所要拟合的数据,如x, y, x1, y1, x2, y2等等。
之后打开cftool工具箱,使用数据拟合曲线,在拟合方式一栏选择Smoothing Spline。可以得到图像。
之后在文件菜单栏中点击Generate Code,之后将在工作空间里看到导出的m文件。
-
function [fitresult, gof] = createFit(x, y)
-
%
CREATEFIT
(X,Y)
-
%
Create
a
fit
.
-
%
-
%
Data
for
‘
untitled
fit
1’
fit
:
-
% X Input : x
-
% Y Output: y
-
% Output:
-
% fitresult : a fit
object representing the fit.
-
% gof : structure
with goodness-
of fit info.
-
%
-
% 另请参阅 FIT, CFIT, SFIT.
-
-
% 由 MATLAB 于
22-Dec-
2015
00:
27:
49 自动生成
-
-
-
%% Fit:
’untitled fit 1’.
-
[xData, yData] = prepareCurveData( x, y );
-
-
%
Set up fittype
and options.
-
ft = fittype(
’smoothingspline’ );
-
-
% Fit model
to data.
-
[fitresult, gof] = fit( xData, yData, ft );
-
-
% Plot fit
with data.
-
figure(
’Name’,
’untitled fit 1’ );
-
h = plot( fitresult, xData, yData );
-
legend( h,
’y vs. x’,
’untitled fit 1’,
’Location’,
’NorthEast’ );
-
%
Label axes
-
xlabel(
’x’ );
-
ylabel(
’y’ );
-
grid
on
也就是说,其实也可以通过编写函数来实现拟合平滑曲线,但是由cftool工具箱导出的代码可以减少自己的工作量,减少由于MATLAB语言不熟练导致效率低下的工作。
之后在这个m文件的适当位置加入拟合多条曲线的代码,就可以实现与cftool拟合平滑曲线效果相同的多条曲线了。
以下是我修改的代码,注意注释。
-
function [fitresult, gof] = e1(x, y, x1, y1, x2, y2) %将需要绘制图像的数据加入参数中
-
%CREATEFIT(X,Y)
-
% Create a fit.
-
%
-
% Data
for
'untitled fit 1' fit:
-
% X Input : x
-
% Y Output: y
-
% Output:
-
% fitresult : a fit
object representing the fit.
-
% gof :
structure
with goodness-
of fit info.
-
%
-
% 另请参阅 FIT, CFIT, SFIT.
-
-
% 由 MATLAB 于
21-Dec
-2015
23:
23:
33 自动生成
-
-
-
%% Fit:
'untitled fit 1'.
-
[xData, yData] = prepareCurveData( x, y );
-
[xData1, yData1] = prepareCurveData( x1, y1 );<span style=
"white-space:pre"> </span>%第二条曲线需要的代码,注意改变参数
-
[xData2, yData2] = prepareCurveData( x2, y2 );<span style=
"white-space:pre"> </span>%第三条曲线需要的代码,注意改变参数
-
-
%
Set up fittype
and options.
-
ft = fittype(
'smoothingspline' );<span style="white-space:pre"> </span>%顾名思义,将拟合方式设置为光滑曲线
-
-
% Fit model
to data.
-
[fitresult, gof] = fit( xData, yData, ft );
-
[fitresult1, gof1] = fit( xData1, yData1, ft );<span style=
"white-space:pre"> </span>%第二条曲线需要的代码,注意改变参数
-
[fitresult2, gof2] = fit( xData2, yData2, ft );<span style=
"white-space:pre"> </span>%第三条曲线需要的代码,注意改变参数
-
-
% Plot fit
with data.
-
figure(
'Name', 'fit 1' );
-
h = plot( fitresult, xData, yData );
-
hold
on;<span style=
"white-space:pre"> </span>%加入hold
on 可以使之后的曲线画在同一张图中
-
h1 = plot( fitresult1, xData1, yData1,
'o' );<span style="white-space:pre"> </span>%绘制第二条曲线,注意参数
-
hold
on;<span style=
"white-space:pre"> </span>%作用同上
-
h2 = plot( fitresult2, xData2, yData2,
'o' );<span style="white-space:pre"> </span>%绘制第三条曲线,注意参数
-
hold
on;
-
-
% Label axes
-
xlabel(
'x' );
-
ylabel(
'y' );
-
grid
on
同理,其他拟合方式也可以使用相同的方式达到多条曲线同时拟合的图像。