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

news/2024/9/16 19:05:49/ 标签: 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次多项式)');  


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 代码检查工具,它可以帮助我们发现代码中的潜在问题,强制执行代码规范,…

Aspose.PDF功能演示:在 C# 中将 JPG 图像合并为 PDF

Aspose.PDF 是一款高级PDF处理API,可以在跨平台应用程序中轻松生成,修改,转换,呈现,保护和打印文档。无需使用Adobe Acrobat。此外,API提供压缩选项,表创建和处理,图形和图像功能&am…

仿Muduo库实现高并发服务器——综合模块

讲解相关介绍: 本项目分为:总模块,子模块。 总模块:将介绍项目的框架,思想。 子模块:对项目中各个模块进行细致代码讲解,以及我做项目时遇到的困难。 关于各个模块中的知识点技术都会采用链接的…

uniapp交互反馈

页面交互反馈可以通过:uni.showToast(object)实现,常用属性有 ioc值说明 值说明success显示成功图标,此时 title 文本在小程序平台最多显示 7 个汉字长度,App仅支持单行显示。error显示错误图标,此时 title 文本在小程序平台最多显示 7 个汉字…

[代码已更新]2024数学建模国赛高教社杯C题:农作物的种植策略 思路代码文章助攻手把手保姆级

本系列专栏将包括两大块内容 第一块赛前真题和模型教学,包括至少8次真题实战教学,每期教学专栏的最底部会提供完整的资料百度网盘包括:真题、数据、可复现代码以及文章. 第二块包括赛中思路、代码的参考助攻, 会提供2024年高教社国赛C的全套参考内容(python 以及matlab 两种)(一…

ARM发布新一代高性能处理器N3

简介 就在2月21日,ARM发布了新一代面向服务器的高性能处理器N3和V3,N系列平衡性能和功耗,而V系列则注重更高的性能。此次发布的N3,单个die最高32核(并加入到CCS,Compute Subsystems,包含Core&a…

【Linux】Shell 与权限:Linux 系统的双重保障

欢迎来到 CILMY23 的博客 🏆本篇主题为:Shell 与权限:Linux 系统的双重保障 🏆个人主页:CILMY23-CSDN博客 🏆系列专栏:Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux | 算法专题 …

linux基础IO——动静态库——实现与应用学习、原理深入详解

前言:本节内容是基础IO部分的动静态库。 本节内容, 我们将站在实现者的角度上自己实现一下动静态库, 并且会站在使用者的角度上使用我们自己实现的库。过程中牵扯到许多新的知识, 最后我们会重谈一下我们的进程。 理解一下有了动静…

window 更改Jupyter Notebook默认工作路径

在 Windows 上更改 Jupyter Notebook 的默认工作路径可以通过以下步骤进行: 方法 1: 修改 Jupyter 配置文件 生成 Jupyter 配置文件(如果尚未生成): 打开 命令提示符(cmd)或 PowerShell。 输入以下命令并…

uniapp二维码生成

uniapp二维码生成 参考文档依赖引入代码html部分生成代码&#xff08;vue3 hook&#xff09;使用 参考文档 【博主&#xff1a;ChoneyLove】uniapp中生成二维码及解决微信小程序端问题总结 依赖引入 npm i uqrcodejs代码 html部分 <canvas type"2d" id"…

VBA 根据单元格改变的值改变对应单元格的值

VBA 根据单元格改变的值改变对应单元格的值 Private Sub Worksheet_Change(ByVal Target As Range)10 On Error GoTo er:20 Application.EnableEvents False30 If Intersect(Target, Range("I6")) Is Nothing False Then Range("I6").For…

9月5日复盘日记

9月5日复盘日记 前言今日感恩今日知识今日反思今日名言 前言 昨天空了一天没有进行复盘&#xff0c;但其实昨天效率也挺高&#xff0c;进行了实验的完善、审稿还有每日leetcode的刷题。但为什么昨天不进行记录呢&#xff0c;因为昨天心情比较一般&#xff0c;一整天总感觉有点浮…

macos 系统文件操作时提示 Operation not permitted 异常解决方法 , 通过恢复模式 开启 /关闭 SIP方法

在macos系统中操作系统文件时提示 Operation not permitted 这个异常, 原因是因为在macos 10.11以上版本中默认启用了 SIP( System Integrity Protection )机制对系统文件进行保护, 要解决这个问题我们需要关机, 然后进入mac的恢复模式 : 在按电源键开机的同时, 一直按住 co…