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

news/2025/1/16 20:01:16/

目录

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


http://www.ppmy.cn/news/1521422.html

相关文章

青少年蓝桥杯国赛要点

1.字典的常见方法 dict——{key:value,} Python3 字典 删除操作: 删除键:del dicto[key] 删除键对应的值:dicto.pop(key) (2022.05出现在选择题第三题) 清空字典:dicto.clear() 删除字典:del…

kafka单机安装

kafka单机安装 下载地址 官网:https://kafka.apache.org/最新版本下载页面:https://kafka.apache.org/downloads 说明 版本选择:3.0.0,kafka_2.12-3.0.0.tgz下载地址:https://archive.apache.org/dist/kafka/3.0.0…

算法练习题14——leetcode84柱形图中最大的矩形(单调栈)

题目描述: 解题思路: 要解决这个问题,我们需要找到每个柱子可以扩展的最大左右边界,然后计算以每个柱子为高度的最大矩形面积。 具体步骤如下: 计算每个柱子左侧最近的比当前柱子矮的位置: 使用一个单调…

使用自制COCO数据集进行PaddleDetection模型训练

本次模型训练基于百度飞浆的Baseline: 19届智能车百度创意组识别 - 飞桨AI Studio星河社区 (baidu.com) 一、收集数据及数据处理 用摄像头拍摄实物,这里先选用baseline中给好的数据集。创建VOC文件夹,文件夹里包含Annotations和JPEGImages两…

双信封程序

一、双信封程序 世界银行采购的一阶段和多阶段市场方式选项,在实施中还涉及单信封、双信封程序。单信封是在一个信封内同时递交技术和财务投标书/建议书,信封打开后同时评审。双信封是第一个信封包装资格和技术部分,第二个信封包装财务&#…

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型

分类预测|基于蜣螂优化极限梯度提升决策树的数据分类预测Matlab程序DBO-Xgboost 多特征输入单输出 含基础模型 文章目录 一、基本原理1. 数据准备2. XGBoost模型建立3. DBO优化XGBoost参数4. 模型训练5. 模型评估6. 结果分析与应用原理总结 二、实验结果三、核心代码四、代码获…

WGCLOUD的下发指令多长时间执行完成

15秒左右 WGCLOUD在v3.5.4版本,对下发指令做了优化,最快10s执行完成

《深入解析 ESLint 配置:从零到精通》

一、引言 在现代前端开发中,代码质量是至关重要的。良好的代码不仅易于维护和扩展,还能提高开发效率和减少错误。ESLint 是一个强大的 JavaScript 代码检查工具,它可以帮助我们发现代码中的潜在问题,强制执行代码规范,…