开篇之前,首先感谢K对巴山学长的赞赏,欢迎他加入了科研学术交流群。他是通过咱在CSDN上分享的《matlab封闭曲线拟合 (针对一些列离散点)》文章循迹找到的巴山学长。
根据他的反馈,咱之前分享的函数interpclosed并不太适合他的数据处理,希望咱能用顾天奇等人的方法试试它的数据,咱使用他数据用了顾天奇等人的方法试了试,效果并不是特别的好,这也可能更参数的调节有关。想必大家也是知道的,使用移动最小二乘法求解涉及到矩阵求逆,参数选择的不合适很容易导致结果与预期大相径庭。下图是采用matlab的曲线拟合器操作之后得出的结果:
从上图可看出,数据点并不是像《matlab封闭曲线拟合 (针对一些列离散点)》中那样平滑有秩,相对比较杂散。对于这种,二维的闭合曲线,咱是比较倾向于使用参数方程来解决,不妨以数据个数作为中间参数t,则有:
x = x(t);
y = y(t).
只要得出t与x、t与y的关系,就很容易重建出拟合曲线。
操作方法很简单,读入待处理数据,并计算数据长度len,构建中间变量t=1:len。打开MATLAB曲线拟合器,点击选择数据,x变量处导入t,y变量处导入x。对于y采用同样的处理方式:
选择一种自己喜欢的拟合方法,咱这里选用咱常用平滑样条:
设置合适参数,这里由于数据比较散杂,因此决定系数并不是越高越好,而是要样得出的样条曲线尽可能平滑更好。
点击导出,生成代码,并将函数名称命名为createFitX,对于y则命名为createFitY。
以上就是关于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
如需转载,请在公众号中回复“转载”获取授权,如未经授权擅自搬运抄袭的,本公众号将保留一切追责权利!