首页 > 其他分享 >matlab中的插值与拟合(代码)

matlab中的插值与拟合(代码)

时间:2024-09-03 14:22:17浏览次数:4  
标签:插值 多项式 matlab 拟合 Yq Xq 原始数据

目录

1.对均匀数据的插值与拟合

2.对散点数据的拟合(如ANSYS fluent导出的节点数据)


1.对均匀数据的插值与拟合

interp1:一维插值。这是最常用的插值函数之一,用于对一维数据进行插值。它可以执行线性插值、最近邻插值、样条插值等多种类型的插值。

% 已知数据点  
x = 1:5;  
y = [2, 4, 7, 12, 19];  
  
% 要插值的位置  
xi = 1:0.1:5;  
  
% 线性插值  
yi = interp1(x, y, xi, 'linear');  
  
% 绘图  
plot(x, y, 'o', xi, yi, '-');  
legend('原始数据', '线性插值');  
xlabel('X');  
ylabel('Y');  
title('interp1 线性插值示例');

interp2:二维插值。用于对二维网格上的数据进行插值。它支持多种插值方法,如线性插值、最近邻插值、三次插值等。

% 网格坐标  
[X, Y] = meshgrid(1:3, 1:5);  
  
% 网格点上的值  
V = [1, 2, 3; 4, 5, 6; 7, 8, 9; 10, 11, 12; 13, 14, 15];  
  
% 要插值的点  
XI = 1:0.5:3;  
YI = 1:0.5:5;  
  
% 二维线性插值  
[XI, YI] = meshgrid(XI, YI); % 确保XI和YI是网格  
VI = interp2(X, Y, V, XI, YI, 'linear');  
  
% 绘图(这里使用surf,但也可以用imagesc或其他)  
surf(XI, YI, VI);  
xlabel('X');  
ylabel('Y');  
zlabel('V');  
title('interp2 线性插值示例');

interp3:三维插值。与 interp2 类似,但用于三维数据

% 三维网格坐标(简化示例)  
[X, Y, Z] = meshgrid(1:2, 1:2, 1:2);  
  
% 网格点上的值  
V = [1, 2; 3, 4; 5, 6; 7, 8];  
V = reshape(V, [2, 2, 2]); % 转换为三维数组  
  
% 要插值的点(这里只做一个简单的插值演示)  
Xq = 1.5;  
Yq = 1.5;  
Zq = 1.5;  
  
% 对于单个点的三维插值,我们需要将点转换为数组  
Xq = Xq(:); Yq = Yq(:); Zq = Zq(:);  
  
% 三维线性插值(这里使用griddedInterpolant更合适,但为了展示interp3)  
Vq = interp3(X, Y, Z, V, Xq, Yq, Zq, 'linear');  
    
% 下面使用griddedInterpolant作为更好的三维插值示例  
F = griddedInterpolant(X, Y, Z, V, 'linear');  
Vq_grid = F(Xq, Yq, Zq); % 正确使用griddedInterpolant  
  
% 由于Vq_grid是单个值,直接显示结果  
disp(['插值结果: ', num2str(Vq_grid)]);

griddedInterpolant:创建一个插值对象,该对象可以对网格数据进行插值。这比直接使用 interp1interp2 或 interp3 提供了更多的灵活性和控制。

% 使用与interp3相同的网格和数据  
[X, Y, Z] = meshgrid(1:2, 1:2, 1:2);  
V = reshape([1, 2; 3, 4; 5, 6; 7, 8], [2, 2, 2]);  
  
% 创建插值对象  
F = griddedInterpolant(X, Y, Z, V, 'linear');  
  
% 要插值的点  
Xq = 1.2; Yq = 1.8; Zq = 1.5;  
  
% 插值  
Vq = F(Xq, Yq, Zq);  
  
% 显示结果  
disp(['插值结果: ', num2str(Vq)]);

spline:尽管主要用于曲线拟合,但也可以用于插值。spline 函数返回一个分段多项式函数,该函数通过给定数据点进行插值。

% 已知数据点  
x = 1:5;  
y = [2, 4, 7, 12, 19];  
  
% 要插值的位置  
xi = 1:0.1:5;  
  
% 创建分段多项式对象  
pp = spline(x, y);  
  
% 插值  
yi = ppval(pp, xi);  
  
% 绘图  
plot(x, y, 'o', xi, yi, '-');  
legend('原始数据', 'spline插值');  
xlabel('X');  
ylabel('Y');  
title('spline插值示例');

interpft:基于快速傅里叶变换(FFT)的插值,适用于周期性数据的插值

% 周期性数据(例如,正弦波的一部分)  
x = 0:pi/4:2*pi;  
y = sin(x);  
  
% 使用FFT进行插值,将点数加倍  
yq = interpft(y, 2*length(y));  
  
% 绘图  
t = 0:2*pi/length(yq):2*pi-2*pi/length(yq); % 新的时间向量  
plot(x, y, 'o', t, yq, '-');  
legend('原始数据', 'interpft插值');  
xlabel('Time');  
ylabel('Amplitude');  
title('interpft插值示例');
  • polyfit:用于多项式拟合,返回多项式的系数。
  • polyval:使用polyfit返回的系数来计算多项式的值
% 已知数据点  
x = [1, 2, 3, 4, 5];  
y = [2, 4, 7, 12, 19];  
  
% 多项式拟合,这里拟合一个二次多项式  
p = polyfit(x, y, 2);  
  
% 使用拟合的多项式系数计算拟合值  
xfit = linspace(min(x), max(x), 100); % 创建更密集的x值以进行绘图  
yfit = polyval(p, xfit);  
  
% 绘图  
plot(x, y, 'o', xfit, yfit, '-');  
legend('原始数据', '二次多项式拟合');  
xlabel('X');  
ylabel('Y');  
title('polyfit 和 polyval 示例');
  • fit:MATLAB Curve Fitting Toolbox 中的函数,用于更复杂的拟合,支持多种类型的拟合函数和自定义函数。
  • fittype:用于指定fit函数应使用的拟合类型(如多项式、指数、有理数等)。
% 已知数据点  
x = [1, 2, 3, 4, 5];  
y = [2.718, 7.389, 20.085, 54.598, 148.413]; % 接近e的x次方  
  
% 指定拟合类型为指数  
ft = fittype('a*exp(b*x)', 'independent', 'x', 'dependent', 'y');  
  
% 进行拟合  
opts = fitoptions('Method', 'NonlinearLeastSquares');  
[fitresult, gof] = fit(x', y', ft, opts);  
  
% 绘图  
plot(fitresult, x, y);  
legend('拟合曲线', '原始数据');  
xlabel('X');  
ylabel('Y');  
title('fit 和 fittype 示例 - 指数拟合');
  • lsqcurvefit:优化工具箱中的函数,用于非线性最小二乘拟合。
% 已知数据点  
x = [1, 2, 3, 4, 5];  
y = [2.7, 7.4, 20.1, 54.6, 148.4]; % 带有噪声的e的x次方数据  
  
% 自定义拟合函数  
model = @(b,x) b(1)*exp(b(2)*x);  
  
% 初始参数估计  
beta0 = [1; 1];  
  
% 拟合  
beta = lsqcurvefit(model, beta0, x, y);  
  
% 使用拟合参数计算拟合值  
yfit = model(beta, x);  
  
% 绘图  
plot(x, y, 'o', x, yfit, '-');  
legend('原始数据', '自定义函数拟合');  
xlabel('X');  
ylabel('Y');  
title('lsqcurvefit 示例');

2.对散点数据的拟合(如ANSYS fluent导出的节点数据)

对二维离散点数据用scatteredInterpolant可以进行拟合(不需要工具箱)

% 假设我们有一些非均匀的二维数据点  
x = [1, 2, 3, 4, 5, 1, 3, 5, 2, 4]; % x坐标  
y = [1, 1, 1, 1, 1, 2, 2, 2, 3, 3]; % y坐标  
z = rand(1, 10); % 对应的z值,这里随机生成  
  
% 使用scatteredInterpolant进行样条插值  
F = scatteredInterpolant(x, y, z, 'linear'); % 'linear' 可以替换为 'nearest', 'cubic' 等  
  
% 创建一个网格以评估插值结果  
[Xq, Yq] = meshgrid(linspace(min(x), max(x), 100), linspace(min(y), max(y), 100));  
Zq = F(Xq, Yq); % 在网格点上计算插值  
  
% 绘制原始数据点和插值结果  
figure;  
scatter3(x, y, z, 'filled'); % 绘制原始数据点  
hold on;  
surf(Xq, Yq, Zq, 'EdgeColor', 'none'); % 绘制插值曲面  
xlabel('X');  
ylabel('Y');  
zlabel('Z');  
title('二维非均匀样条拟合');  
view(3); % 以3D视角查看

fit函数(需要Curve Fitting Toolbox)结合适当的拟合类型,如多项式、高斯、平滑样条等。

% 假设我们有一组离散点数据  
x = linspace(0, 10, 20) + 0.5*randn(1, 20); % X坐标,加入一些随机噪声  
y = sin(x) + 0.1*randn(size(x)); % Y坐标,也是基于sin函数并加入随机噪声  
  
% 使用fit函数进行多项式拟合  
% 这里我们选择一个3次多项式作为拟合类型,但您可以根据需要调整次数  
ft = fittype('poly3'); % 定义一个3次多项式的拟合类型  
[fitresult, gof] = fit(x', y', ft); % 注意:fit函数期望列向量作为输入,因此使用x'和y'  
  
% 绘制原始数据和拟合曲线  
figure; % 创建一个新图形窗口  
plot(fitresult, x, y); % 绘制拟合曲线和原始数据点  
legend('拟合曲线', '原始数据');  
xlabel('X');  
ylabel('Y');  
title('离散点拟合为光滑曲线(3次多项式)');  

标签:插值,多项式,matlab,拟合,Yq,Xq,原始数据
From: https://blog.csdn.net/byllalala/article/details/141744047

相关文章

  • MATLAB代码|中心差分卡尔曼滤波(CDKF)的滤波例程,无需下载,直接复制到MATLAB上面就能运行
    文章目录CDKF介绍代码运行结果各模块解析初始化系统模型设置CDKF循环绘图另有关于EKF和CDKF的对比程序:EKF+CDKF两个滤波的MATLAB程序,估计三轴位置,带中文注释——https://blog.csdn.net/callmeup/article/details/136610153。CDKF介绍中心差分卡尔......
  • 基于SIR模型的疫情发展趋势预测算法matlab仿真
    1.程序功能描述基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型,对疫情发展进行过程进行拟合。2.测试软件版本以及运行结果展示MATLAB2022a版本运行3.核心程序Opt.LargeScale......
  • 基于SIR模型的疫情发展趋势预测算法matlab仿真
    1.程序功能描述基于SIR模型的疫情发展趋势预测算法.对病例增长进行SIR模型拟合分析,并采用模型参数拟合结果对疫情防控力度进行比较。整体思路为采用SIR微分方程模型,对疫情发展进行过程进行拟合。2.测试软件版本以及运行结果展示MATLAB2022a版本运行 3.核心程序Opt=o......
  • 基于LK光流提取算法的图像序列晃动程度计算matlab仿真
    1.算法运行效果图预览(完整程序运行后无水印) 2.算法运行软件版本matlab2022a 3.部分核心程序(完整版代码包含详细中文注释和操作步骤视频) %晃动指标axes(handles.axes1);imshow(uint8(I0{kk}));axes(handles.axes2);quiver(x,y,hor,ve......
  • 海马算法(SHO)优化支持向量机原理及Matlab代码
    目录0引言1数学模型2优化方式3Maltab代码3.1伪代码3.2SHO主函数代码3.3SHO-SVM4视频讲解0引言海马算法(SeaHorseOptimizer,SHO)是ShijieZhao于2023年基于自然界中海马的运动、捕食和繁殖行为提出的群体智能算法。SHO算法两个阶段,SHO分别模拟了海马的不同运......
  • 非洲秃鹫算法(AVOV)优化BP神经网络原理及Matlab代码
    目录0引言1 数学模型2优化方式3Matlab代码3.1伪代码3.2AVOA主函数代码3.3AVOA-BP4视频讲解0引言非洲秃鹫算法(Africanvulturesoptimizationalgorithm,AVOA)是BenyaminAbdollahzadeh等人于2021年提出的群智能算法,该算法通过模拟非洲秃鹫典型的领导者-追随......
  • 非洲秃鹫算法(AVOA)优化支持向量机原理及Matlab代码
    目录0引言1 数学模型2优化方式3Matlab代码3.1伪代码3.2AVOA主函数代码3.3AVOA-SVM4视频讲解0引言非洲秃鹫算法(Africanvulturesoptimizationalgorithm,AVOA)是BenyaminAbdollahzadeh等人于2021年提出的群智能算法,该算法通过模拟非洲秃鹫典型的领导者-追随......
  • 使用MATLAB进行定积分计算
    在MATLAB中可以使用数值积分方法来计算定积分,定积分是求函数在给定区间上的面积,可以用于求解曲线下的面积、求解物理中的积分问题等。以下是使用MATLAB进行定积分计算的步骤和相应的源代码:步骤1:定义函数首先需要定义要进行积分的函数。假设我们要计算函数f(x)=x^2在区......
  • 低通和带通信号的简单理解与Matlab实现
    低通和带通信号是数字信号处理中常见的概念,用于处理和分析信号的频率特性,本文将以通俗易懂的方式解释低通和带通信号的概念,并提供在Matlab中实现这些信号的源代码示例。1、低通信号(Low-passSignal)低通信号是指频率较低的信号,它的特点是在一定频率以下具有较高的幅度,而在该频......
  • 喂饭教程“15行代码”教你用matlab画玫瑰花表白成功!
    本代码十分适合编程小白,大家直接复制黏贴就可以向大家喜欢的人表个白吧!代码:n=800;p=pi;[R,T]=ndgrid(linspace(0,1,n),linspace(-2,20*p,n));x=1-(.5)*((5/4)*(1-mod(3.6*T,2*p)/p).^2-.25).^2;U=2*exp(-T/(8*p));L=sin(U);J=cos(U);y=1.99*(R.^2).*(1.2*R-1).^2.*L;......