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

目录

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次多项式)');  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值