再谈MATLAB封闭曲线拟合之杂散点

开篇之前,首先感谢K对巴山学长的赞赏,欢迎他加入了科研学术交流群。他是通过咱在CSDN上分享的《matlab封闭曲线拟合 (针对一些列离散点)》文章循迹找到的巴山学长

根据他的反馈,咱之前分享的函数interpclosed并不太适合他的数据处理,希望咱能用顾天奇等人的方法试试它的数据,咱使用他数据用了顾天奇等人的方法试了试,效果并不是特别的好,这也可能更参数的调节有关。想必大家也是知道的,使用移动最小二乘法求解涉及到矩阵求逆,参数选择的不合适很容易导致结果与预期大相径庭。下图是采用matlab的曲线拟合器操作之后得出的结果:

0c24d2d277b7a74589783ef7c2de0cfd.jpeg

从上图可看出,数据点并不是像《matlab封闭曲线拟合 (针对一些列离散点)》中那样平滑有秩,相对比较杂散。对于这种,二维的闭合曲线,咱是比较倾向于使用参数方程来解决,不妨以数据个数作为中间参数t,则有:

x = x(t);

y = y(t).

只要得出t与x、t与y的关系,就很容易重建出拟合曲线。

操作方法很简单,读入待处理数据,并计算数据长度len,构建中间变量t=1:len。打开MATLAB曲线拟合器,点击选择数据,x变量处导入t,y变量处导入x。对于y采用同样的处理方式:

6e328c9a277ca1a26e3b44bbdf9d0675.png

选择一种自己喜欢的拟合方法,咱这里选用咱常用平滑样条:

695c86980adb869e5d35e27c926fa703.png

设置合适参数,这里由于数据比较散杂,因此决定系数并不是越高越好,而是要样得出的样条曲线尽可能平滑更好。

8a04f56ac89f3eeb9a84ef064fa32851.jpeg

点击导出生成代码,并将函数名称命名为createFitX,对于y则命名为createFitY

919aa9ec6a058427a83c47798e65c059.png

以上就是关于MATLAB闭合曲线拟合的一点补充内容,希望能对大家有用。

本文涉及的相关代码如下:

% main 函数
clc;clear;close all;
filename = '你的数据文件'; % 请删掉表头,以免
data = readtable(filename);
x    = data(:,1).Variables';
y    = data(:,2).Variables';


mx = mean(x);
my = mean(y);


ptsnum = 2000;
ord    = 3;
lenn   = size(x,2);
t      = 1:lenn;
nt   = linspace(1,lenn,ptsnum);
fx   = createFitX(t,x);
fy   = createFitY(t,y);
sx   = fx(nt);
sy   = fy(nt);


[~,nx] = mlsfit(t,x,ord,ptsnum);
[~,ny] = mlsfit(t,y,ord,ptsnum);
% nx([1,ptsnum]) = (nx(1)+nx(end))/2;
% ny([1,ptsnum]) = (ny(1)+ny(end))/2;
% plot(x, y,'g-', [sx(2:end-1);sx(2)], [sy(2:end-1);sy(2)],'b-', [nx(2:end-1),nx(2)], [ny(2:end-1),ny(2)],'r-','LineWidth',2.4);
figure('Color','w','Position',[338 123 1151 860]);
plot(x, y,'k.', [sx(2:end-1);sx(2)], [sy(2:end-1);sy(2)],'b-','LineWidth',2.6,'MarkerSize',12);
hold on;
plot(mx,my,'r.','MarkerSize',50);
text(mx-13,my-6,'几何中心','FontName','楷体','FontWeight','bold','FontSize',25);
axis([min(x)-5 max(x)+5 min(y)-5 max(y)+5]);
set(gca,'LineWidth',1.8,'Color','w','FontWeight','bold','FontSize',12);
title('matlab封闭曲线拟合')
axis equal;
function [fitresult, gof] = createFitX(t, x)
%CREATEFIT(T,X)
%  创建一个拟合。
%
%  要进行 '无标题拟合 1' 拟合的数据:
%      X 输入: t
%      Y 输出: x
%  输出:
%      fitresult: 表示拟合的拟合对象。
%      gof: 带有拟合优度信息的结构体。
%
%  另请参阅 FIT, CFIT, SFIT.


%% 拟合: 't vs. x(t)'。
[xData, yData] = prepareCurveData( t, x );


% 设置 fittype 和选项。
ft = fittype( 'smoothingspline' );
opts = fitoptions( 'Method', 'SmoothingSpline' );
opts.SmoothingParam = 0.00027623; % 此处的值仅适用于Kamome的测试数据,其他数据请自行在曲线拟合器中调节获取


% 对数据进行模型拟合。
[fitresult, gof] = fit( xData, yData, ft, opts );


% 绘制数据拟合图。
figure( 'Name', 't vs. x(t)' );
h = plot( fitresult, xData, yData );
legend( h, 'x vs. t', 't vs. x(t)', 'Location', 'NorthEast', 'Interpreter', 'none' );
% 为坐标区加标签
xlabel( 't', 'Interpreter', 'none' );
ylabel( 'x', 'Interpreter', 'none' );
grid on
function [fitresult, gof] = createFitY(t, y)
%CREATEFIT(T,Y)
%  创建一个拟合。
%
%  要进行 't vs. y(t)' 拟合的数据:
%      X 输入: t
%      Y 输出: y
%  输出:
%      fitresult: 表示拟合的拟合对象。
%      gof: 带有拟合优度信息的结构体。
%
%  另请参阅 FIT, CFIT, SFIT.


%% 拟合: 't vs. y(t)'。
[xData, yData] = prepareCurveData( t, y );


% 设置 fittype 和选项。
ft = fittype( 'smoothingspline' );
opts = fitoptions( 'Method', 'SmoothingSpline' );
opts.SmoothingParam = 0.0012368;  % 此处的值仅适用于Kamome的测试数据,其他数据请自行在曲线拟合器中调节获取


% 对数据进行模型拟合。
[fitresult, gof] = fit( xData, yData, ft, opts );


% 绘制数据拟合图。
figure( 'Name', 't vs. y(t)' );
h = plot( fitresult, xData, yData );
legend( h, 'y vs. t', 't vs. y(t)', 'Location', 'NorthEast', 'Interpreter', 'none' );
% 为坐标区加标签
xlabel( 't', 'Interpreter', 'none' );
ylabel( 'y', 'Interpreter', 'none' );
grid on

参考资料:mathworks.com/products/curvefitting.html

如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值