[matlab] MATLAB中利用cftool导出代码实现一张图中拟合多条平滑曲线

转自:https://blog.csdn.net/zyj1286076714/article/details/50375935

MATLAB中自带的cftool拟合工具箱不能将多条曲线同时画在同一副图中,而常规的plot()函数又不能拟合平滑直线,接下来总结一种可以利用cftool导出的代码,在一张图中拟合多条平滑曲线。

首先输入所要拟合的数据,如x, y, x1, y1, x2, y2等等。

之后打开cftool工具箱,使用数据拟合曲线,在拟合方式一栏选择Smoothing Spline。可以得到图像。

之后在文件菜单栏中点击Generate Code,之后将在工作空间里看到导出的m文件。


   
  1. function [fitresult, gof] = createFit(x, y)
  2. % CREATEFIT (X,Y)
  3. % Create a fit .
  4. %
  5. % Data for untitled fit 1’ fit :
  6. % X Input : x
  7. % Y Output: y
  8. % Output:
  9. % fitresult : a fit object representing the fit.
  10. % gof : structure with goodness- of fit info.
  11. %
  12. % 另请参阅 FIT, CFIT, SFIT.
  13. % 由 MATLAB 于 22-Dec- 2015 00: 27: 49 自动生成
  14. %% Fit: ’untitled fit 1’.
  15. [xData, yData] = prepareCurveData( x, y );
  16. % Set up fittype and options.
  17. ft = fittype( ’smoothingspline’ );
  18. % Fit model to data.
  19. [fitresult, gof] = fit( xData, yData, ft );
  20. % Plot fit with data.
  21. figure( ’Name’, ’untitled fit 1’ );
  22. h = plot( fitresult, xData, yData );
  23. legend( h, ’y vs. x’, ’untitled fit 1’, ’Location’, ’NorthEast’ );
  24. % Label axes
  25. xlabel( ’x’ );
  26. ylabel( ’y’ );
  27. grid on

也就是说,其实也可以通过编写函数来实现拟合平滑曲线,但是由cftool工具箱导出的代码可以减少自己的工作量,减少由于MATLAB语言不熟练导致效率低下的工作。

之后在这个m文件的适当位置加入拟合多条曲线的代码,就可以实现与cftool拟合平滑曲线效果相同的多条曲线了。

以下是我修改的代码,注意注释。



   
  1. function [fitresult, gof] = e1(x, y, x1, y1, x2, y2) %将需要绘制图像的数据加入参数中
  2. %CREATEFIT(X,Y)
  3. % Create a fit.
  4. %
  5. % Data for 'untitled fit 1' fit:
  6. % X Input : x
  7. % Y Output: y
  8. % Output:
  9. % fitresult : a fit object representing the fit.
  10. % gof : structure with goodness- of fit info.
  11. %
  12. % 另请参阅 FIT, CFIT, SFIT.
  13. % 由 MATLAB 于 21-Dec -2015 23: 23: 33 自动生成
  14. %% Fit: 'untitled fit 1'.
  15. [xData, yData] = prepareCurveData( x, y );
  16. [xData1, yData1] = prepareCurveData( x1, y1 );<span style= "white-space:pre"> </span>%第二条曲线需要的代码,注意改变参数
  17. [xData2, yData2] = prepareCurveData( x2, y2 );<span style= "white-space:pre"> </span>%第三条曲线需要的代码,注意改变参数
  18. % Set up fittype and options.
  19. ft = fittype( 'smoothingspline' );<span style="white-space:pre"> </span>%顾名思义,将拟合方式设置为光滑曲线
  20. % Fit model to data.
  21. [fitresult, gof] = fit( xData, yData, ft );
  22. [fitresult1, gof1] = fit( xData1, yData1, ft );<span style= "white-space:pre"> </span>%第二条曲线需要的代码,注意改变参数
  23. [fitresult2, gof2] = fit( xData2, yData2, ft );<span style= "white-space:pre"> </span>%第三条曲线需要的代码,注意改变参数
  24. % Plot fit with data.
  25. figure( 'Name', 'fit 1' );
  26. h = plot( fitresult, xData, yData );
  27. hold on;<span style= "white-space:pre"> </span>%加入hold on 可以使之后的曲线画在同一张图中
  28. h1 = plot( fitresult1, xData1, yData1, 'o' );<span style="white-space:pre"> </span>%绘制第二条曲线,注意参数
  29. hold on;<span style= "white-space:pre"> </span>%作用同上
  30. h2 = plot( fitresult2, xData2, yData2, 'o' );<span style="white-space:pre"> </span>%绘制第三条曲线,注意参数
  31. hold on;
  32. % Label axes
  33. xlabel( 'x' );
  34. ylabel( 'y' );
  35. grid on


保存之后,在命令行窗口中运行该m函数文件,即可得到在一张图中同时拟合三条光滑曲线。






同理,其他拟合方式也可以使用相同的方式达到多条曲线同时拟合的图像。



<think>我们被要求在一个中创建多条拟合曲线。根据引用[4],在GUI编程中,我们可以通过设置坐标轴的'NextPlot'属性为'add'来实现多条曲线的叠加。在普通脚本中,我们可以使用`hold on`命令。以下将介绍在MATLAB中绘制多条拟合曲线到同一形的几种方法。 ### 方法1:使用`hold on`命令(适用于脚本或命令行) 1. **准备数据**:假设我们有多组数据,每组数据需要分别拟合。 2. **分段拟合**:对每组数据进行曲线拟合(如多项式拟合)。 3. **绘制拟合曲线**:使用`hold on`保持形,依次绘制每条拟合曲线。 **示例代码**: ```matlab % 生成示例数据 x1 = 1:10; y1 = 2*x1 + randn(1,10); % 第一组数据 x2 = 1:0.5:10; y2 = 3*sin(x2) + randn(1,19); % 第二组数据 % 第一组拟合:线性拟合 p1 = polyfit(x1, y1, 1); x1_eval = linspace(min(x1), max(x1), 100); y1_eval = polyval(p1, x1_eval); % 第二组拟合:三次多项式拟合 p2 = polyfit(x2, y2, 3); x2_eval = linspace(min(x2), max(x2), 100); y2_eval = polyval(p2, x2_eval); % 绘制原始数据点及拟合曲线 figure; hold on; % 开启形保持 scatter(x1, y1, 'r'); % 绘制第一组数据点 plot(x1_eval, y1_eval, 'r-', 'LineWidth', 2); % 绘制第一组拟合曲线 scatter(x2, y2, 'b'); % 绘制第二组数据点 plot(x2_eval, y2_eval, 'b-', 'LineWidth', 2); % 绘制第二组拟合曲线 hold off; % 关闭形保持 legend('Data1', 'Fit1', 'Data2', 'Fit2'); xlabel('x'); ylabel('y'); title('Multiple Fitted Curves'); ``` ### 方法2:使用Curve Fitting Toolbox(适用于复杂拟合) 如果安装了Curve Fitting Toolbox,可以使用`fit`和`plot`函数,并结合`hold on`。 **示例代码**: ```matlab % 使用fit函数拟合 f1 = fit(x1', y1', 'poly1'); % 线性拟合 f2 = fit(x2', y2', 'poly3'); % 三次多项式拟合 % 绘制 figure; hold on; plot(f1, 'r-', x1, y1, 'ro'); % 绘制第一组拟合曲线及数据点 plot(f2, 'b-', x2, y2, 'b*'); % 绘制第二组拟合曲线及数据点 hold off; legend('Data1', 'Fit1', 'Data2', 'Fit2'); ``` ### 方法3:在GUI编程中设置坐标轴属性(适用于App Designer或GUIDE) 在GUI中,我们可以通过设置坐标轴的`NextPlot`属性为`'add'`来实现多条曲线的叠加。 **示例步骤**(在GUIDE或App Designer中): 1. 在坐标轴创建时(或初始化代码中)设置: ```matlab % 在GUIDE的OpeningFcn中或App Designer的回调函数中 ax = handles.axes1; % 假设坐标轴标签为axes1 set(ax, 'NextPlot', 'add'); % 设置叠加绘 ``` 2. 在需要绘制多条曲线的地方,直接使用`plot`等绘函数,不需要每次调用`hold on`,因为坐标轴已经设置为叠加模式。 **注意**:在GUI中,每次更新形前可能需要清除原有形(使用`cla`),或者通过管理形句柄来更新。 ### 关键点总结 - **普通脚本**:使用`hold on`和`hold off`是最直接的方法[^4]。 - **Curve Fitting Toolbox**:提供更专业的拟合函数和绘选项[^1]。 - **GUI编程**:通过设置坐标轴的`NextPlot`属性为`'add'`实现叠加绘[^4]。 ### 相关问题 1. **如何在MATLAB中为不同曲线设置不同的线型和颜色?** - 在`plot`函数中指定颜色和线型,如`'r--'`表示红色虚线,`'bs:'`表示蓝色方形标记点虚线[^3]。 2. **如何将拟合曲线导出为函数?** - 使用`fit`函数返回的拟合对象可以直接作为函数使用,或使用`polyval`计算多项式拟合值[^1]。 3. **MATLAB中如何拟合非线性模型?** - 使用`fit`函数并指定非线性模型,如`'exp1'`、`'gauss2'`等,或自定义模型[^2]。 4. **如何避免多条曲线绘制时的形重叠问题?** - 调整坐标轴范围(`xlim`, `ylim`)或使用`subplot`创建子分区显示[^4]。 [^1]: MATLAB提供了多种插值和拟合算法,用于数据处理、曲线构建和模型预测等。 [^2]: Matlab是一个很强大的数据处理软件,是人们进行数据分析的得力助手。 [^3]: MATLAB提供了一些绘选项,用于确定所绘曲线的线型、颜色和数据点标记符号。 [^4]: 在gui编程中,要把属性浏览器中的“nextplot”选项调整为“add”。</think>### MATLAB 在同一形中绘制多条拟合曲线的完整指南 在MATLAB中绘制多条拟合曲线到同一形,核心是**保持形状态叠加**和**分别执行拟合操作**。以下是三种实用方法: --- #### **方法1:使用`hold on`命令(推荐)** ```matlab % 生成示例数据 x1 = 1:10; y1 = 2*x1 + randn(1,10); % 第一组数据 x2 = 5:15; y2 = sin(x2) + randn(1,11); % 第二组数据 % 创建形 figure; hold on; % 开启形保持 % 第一组数据拟合(线性拟合) p1 = polyfit(x1, y1, 1); x1_fit = linspace(min(x1), max(x1), 100); y1_fit = polyval(p1, x1_fit); plot(x1_fit, y1_fit, 'r-', 'LineWidth', 2); % 第二组数据拟合(三次多项式) p2 = polyfit(x2, y2, 3); x2_fit = linspace(min(x2), max(x2), 100); y2_fit = polyval(p2, x2_fit); plot(x2_fit, y2_fit, 'b--', 'LineWidth', 2); % 添加原始数据点 scatter(x1, y1, 50, 'r', 'filled'); scatter(x2, y2, 50, 'b', 'filled'); hold off; % 关闭形保持 legend('线性拟合', '三次多项式拟合', 'Data1', 'Data2'); title('多条拟合曲线对比'); xlabel('X'); ylabel('Y'); grid on; ``` **关键点**: - `hold on` 使后续绘叠加在当前形上[^4] - 不同曲线使用不同颜色和线型(如`'r-'`红色实线,`'b--'`蓝色虚线) - 添加`scatter`显示原始数据点 --- #### **方法2:使用Curve Fitting Toolbox(高级拟合)** ```matlab % 准备数据 t = 0:0.1:10; y1 = 0.5*exp(-t/2) + randn(size(t))*0.05; y2 = sin(2*pi*t/5) + randn(size(t))*0.1; % 创建形 figure; % 第一组拟合(指数拟合) f1 = fit(t', y1', 'exp1'); plot(f1, 'r-'); hold on; % 第二组拟合(正弦拟合) f2 = fit(t', y2', 'sin1'); plot(f2, 'b--'); % 添加数据点 plot(t, y1, 'ro', 'MarkerSize', 6); plot(t, y2, 'bd', 'MarkerSize', 6); legend('指数拟合', 'Data1', '正弦拟合', 'Data2'); title('高级曲线拟合对比'); ``` **优势**: - 支持复杂模型(指数、正弦、高斯等)[^1] - 自动显示拟合公式和统计指标 - 提供交互式拟合工具(命令窗口输入 `cftool`) --- #### **方法3:GUI编程(App Designer)** 在GUI中实现多条曲线叠加: 1. 在坐标轴属性面板设置: ```matlab % 在OpeningFcn中设置 app.UIAxes.NextPlot = 'add'; % 关键设置[^4] ``` 2. 在按钮回调函数中: ```matlab % 拟合曲线1 p1 = polyfit(app.xData1, app.yData1, 2); x_fit = linspace(min(app.xData1), max(app.xData1), 100); y_fit = polyval(p1, x_fit); plot(app.UIAxes, x_fit, y_fit, 'Color', [0.8 0.2 0.2]); % 拟合曲线2 p2 = polyfit(app.xData2, app.yData2, 3); y_fit2 = polyval(p2, x_fit); plot(app.UIAxes, x_fit, y_fit2, 'Color', [0.2 0.4 0.8]); ``` --- ### 关键技巧与问题解决 1. **曲线重叠问题**: - 调整显示范围:`xlim([xmin xmax])`, `ylim([ymin ymax])` - 使用双Y轴:`yyaxis left` / `yyaxis right` 2. **拟合效果优化**: ```matlab % 调整多项式阶数 order = 4; % 通过交叉验证选择最佳阶数 p = polyfit(x, y, order); % 使用稳健拟合(抗离群值) f = fit(x, y, 'poly3', 'Robust', 'Bisquare'); ``` 3. **大数据集处理**: ```matlab % 分段拟合避免内存不足 segments = 5; for i = 1:segments idx = (i-1)*floor(length(x)/segments)+1 : i*floor(length(x)/segments); p_seg = polyfit(x(idx), y(idx), 2); % ... 绘制分段曲线 ... end ``` 4. **专业可视化**: ```matlab % 设置专业绘样式 set(gca, 'FontSize', 12, 'LineWidth', 1.5); set(gcf, 'Color', 'w'); % 白色背景 exportgraphics(gcf, 'multi_curve.png', 'Resolution', 300); % 导出高清 ``` --- ### 相关问题 1. **如何比较不同拟合曲线的精度?** - 使用`goodnessOfFit`函数计算RMSE、R-square等指标[^1] 2. **MATLAB中如何实现交互式曲线选择?** - 使用`ginput`函数获取鼠标选点,动态更新拟合区域 3. **如何处理带噪声数据的拟合?** - 采用平滑样条(`csaps`)或小波去噪预处理 4. **如何将拟合结果导出为可调用函数?** - 使用`fit`函数返回对象可直接作为函数调用,或生成MATLAB函数文件: ```matlab f = fit(x, y, 'poly3'); cfun = fittype(f); % 获取函数类型 ``` [^1]: MATLAB提供了多种插值和拟合算法,用于数据处理、曲线构建和模型预测等。 [^2]: Matlab是一个很强大的数据处理软件,是人们进行数据分析的得力助手。 [^3]: MATLAB提供了一些绘选项,用于确定所绘曲线的线型、颜色和数据点标记符号。 [^4]: 在gui编程中,要把属性浏览器中的“nextplot”选项调整为“add”。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值