目录
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
:创建一个插值对象,可以对网格数据进行插值。比直接使用 interp1
、interp2
或 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次多项式)');