流场粒子追踪精度数值实验

news2024/11/28 19:31:11

在计算流线,拉格朗日拟序结构等流场后处理时,我们常常需要计算无质量的粒子在流场中迁移时的轨迹,无质量意味着粒子的速度为流场当地的速度。此时,求解粒子的位移这个问题是一个非常简单的常微分方程问题。
假设流场中存在 i 个粒子,那么对于每个粒子有 v i = x i 初始条件为: x i ( t 0 ) 假设流场中存在i个粒子,那么对于每个粒子有 \\v_i = x_i \\初始条件为:x_i(t_0) 假设流场中存在i个粒子,那么对于每个粒子有vi=xi初始条件为:xi(t0)
1、欧拉向前差分
欧拉向前差分是最简单的方法,其主要步骤为:
x i t + d t = x i + v i t ∗ d t v i t 为 t 时刻在 x i 处的流场速度 \\x_{i}^{t+dt} = x_{i}+v_{i}^{t}*dt \\ v_{i}^{t}为t时刻在x_i处的流场速度 xit+dt=xi+vitdtvitt时刻在xi处的流场速度
显然,该方法的精度取决于时间步长,时间步长越大,误差越大。
该方法需要注意几个事项:
(1)流场插值处理
我们实现知道的流场数据是时间和空间离散的,对于任意一个时刻,我们只知道空间离散点处的流场速度,加入粒子的位置恰好不在这些点上,我们就需要通过插值得到其速度。
matlab提供了这样的插值函数,interp2()。
假设我们现在已知流场的空间离散点矩阵x_f;y_f以及速度U,V;
我们想通过插值获得,ftle_x,ftle_y处粒子的速度ux,uy

ux = interp2(x_f,y_f,U,ftle_x,ftle_y,'linear');
uy = interp2(x_f,y_f,V,ftle_x,ftle_y,'linear');
%%上面的代码中ftle_x,ftle_y可以是矩阵形式,这样得到的速度ux,uy也是矩阵    

那么接下来粒子迁移就十分简单了

for t = f_time:dt:(T+f_time)
    %获取t时刻的速度数据
    U = reshape(vel(1:Nx*Ny,t),Ny,Nx);
    V = reshape(vel(Nx*Ny+1:end,t),Ny,Nx);
    %%计算粒子迁移t-->t+dt
    ux = interp2(x_f,y_f,U,ftle_x,ftle_y,'linear');
    uy = interp2(x_f,y_f,V,ftle_x,ftle_y,'linear');

    X = ftle_x + dt*tstep*ux;
    Y = ftle_y + dt*tstep*uy;
    ftle_x=X;
    ftle_y=Y;
end

另外,好像对于这个问题不能用梯型方法?梯型方法的步骤如下:
y n + 1 = y n + h 2 ( f ( x n , y n ) + f ( x n + 1 , y n + 1 ) y_{n+1}=y_n+\frac{h}{2}\bigl(f\bigl(x_n,y_n\bigr)+f\bigl(x_{n+1},y_{n+1}) yn+1=yn+2h(f(xn,yn)+f(xn+1,yn+1)
主要问题在于我没法知道下一步粒子在哪,即这里的x(n+1),y(n+1),因为我就是在求这个东西?
暂时没想明白怎么用梯型方法。
2、龙格-库塔法
这个就比较玄学了,这个我也没弄清原理,只是知道matlab里有这个函数可以用,并且还不错。
由于龙格-库塔法需要两个时间步中间的时刻,我们不仅需要空间插值,还需要时间插值。
插值的方法也很简单,matlab提供了相应的函数
(1)首先我们需要获得粒子的时间,空间离散结果

for k = 1:size(vel,2)
    XX(:,:,k) = X0;
    YY(:,:,k) = Y0;%%这里是给定了每个时刻的离散空间位置,我们采用欧拉法求解流场,所以离散点是固定的
    u(:,:,k) = reshape(vel(1:ny*nx,k),[ny nx]);
    v(:,:,k) = reshape(vel(ny*nx+1:end,k),[ny nx]);
    TT(:,:,k) = t(k)*ones(ny,nx);%%这里存储着每个粒子的时间信息,因为全场内每个粒子的时间是相同的,所以用了ones()函数
end

(2)对其进行转置(该步骤不是必要的)

%% 该部分的操作相当于对一个三维矩阵的前两维进行转置
P = [2 1 3];    
Xprime = permute(XX,P);
Yprime = permute(YY,P);
Tprime = permute(TT,P);
Uprime = permute(u,P);
Vprime = permute(v,P);

(3)时空间插值

u_interp = griddedInterpolant(Xprime,Yprime,Tprime,Uprime,'linear');
v_interp = griddedInterpolant(Xprime,Yprime,Tprime,Vprime,'linear'); 

(4)ode45()函数求解

 [t, X_out] = ode45(@velocity_interp_func,intspan(tspan(k),T),[X0(i,j),Y0(i,j)]);
 %% 这里ode45函数需要输入三个参数
 @velocity_interp_func这是句柄,包含着方程的信息
 intspan(tspan(k),T) 这个是从某个时刻计算到某个时刻
 这里具体含义是从tspan(k)时刻推进到tspan(k)+T时刻
 [X0(i,j),Y0(i,j)]是初始场

根据这个函数就可以计算处初始位置在[X0(i,j),Y0(i,j)],初始时刻为tspan(k),经过T时间的运动后,最终的位置X_out。X_out包含了每个时刻对应的粒子位置,t即是这些时刻的时间信息。
但是我们只需要最后一个时刻的信息,因此

X_adv(i,j) = X_out(end,1);
Y_adv(i,j) = X_out(end,2);  

需要注意的是,只是计算单独一个粒子的轨迹,要想计算全场的粒子,需要对其进行遍历,然鹅经过实操发现,这个过程还是很耗时的。
这个方法的具体运行原理我还没有搞明白,因为最简单的梯型法现在还没想清楚,所以仅放在这里。

注意:上面两种方法都是利用离散数据得到粒子迁移的,这里我们通过解析解获得时间间隔为0.1下的0:16s时刻共161个流场数据,流场网格划分为均匀划分,nx =201;ny = 101;
流场设置为double_gyre流场
我们计算的问题是:
流场初始0时刻布置201*101个粒子,计算10s时刻时这些粒子的位置。
3、对照组
为了方便对比上面两种方法的精度,我设置了一组对照组,由于流场设置为double_gyre流场,这个流场是存在解析解的,因此我们可以获得任意时刻,任意位置处的精确速度信息。
通过设置时间步长非常小,并且采用欧拉向前推进,可以将这个方法得到的结果精度提升到很高。
我计算了两种精度的结果1、dt=0.01s,2、dt=0.001s

然后将上面两种方法得到的结果与该方法进行对比,从而得到两种方法的误差范围。
4、实验结果

figure(1)
dx = sigma_x - X_ana;
dy = sigma_y - Y_ana;
e_ds = sqrt(dx.^2+dy.^2);
pcolor(e_ds)
shading interp

figure(2)
dx = X_adv - X_ana;
dy = Y_adv - Y_ana;
o_ds = sqrt(dx.^2+dy.^2);
pcolor(o_ds)
shading interp

欧拉法与dt=0.01解析解对比,后者的时间精度是前者的十倍
结果如下:
在这里插入图片描述

ode45方法结果与dt=0.01解析方法对比
结果如下:
在这里插入图片描述
可以看出,欧拉方法的误差要大于ode45方法,但是其实差距不是很大。

我们对误差进行全场平均:
欧拉:0.71
ode45:0.67

误差最大值:
欧拉:2.18
ode45:1.97
这里其实误差还是蛮大的,因为流场范围才是2*1.
还有一个比较神奇的点是,这个误差云图很像ftle图,这是因为ftle图反应了粒子拉伸扭曲的程度,而恰好在这些位置处,误差非常敏感,比较有意思。

最后我们对比了dt=0.01和dt =0.001时解析方法之间的对比结果
其误差云图如下:
在这里插入图片描述
可以看出,dt=0.01时时间精度就已经很高了,与dt=0.001的结果很接近。

补充:总觉得上面的对比还是不够明显,于是又进行了几组测试
dt=0.02;dt=0.05
测试结果,这里仅对比误差平均值:
dt=0.05
欧拉:0.082
ode45:0.091
欧拉方法更接近dt=0.05
dt=0.02
欧拉:0.13
ode45:0.038
ode45方法更接近dt=0.02

可以看出ode45方法其实精度超过了dt=0.05时的解析方法。
对比到此结束,仍然需要指出。虽然平均误差看起来比较大,实际上这些是主要由所谓的FTLE场的脊位置处的粒子贡献的。大多数位置处的粒子误差水平还是比较小的。
下图左为欧拉,右为ode45,蓝色区域的误差还是比较小的。
在这里插入图片描述
欧拉方法的误差矩阵:
在这里插入图片描述

ode45方法的误差矩阵:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/664366.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

020:vue刷新跳转当前页面

第020个 查看专栏目录: VUE — element UI VUE刷新当前页面在很多场合都会使用到,比如在搜索页搜索内容并展示在搜索页?在当前页删除,添加内容的等,查看更新后的结果等。 方法一 用vue-router 重新路由的时候到当前页面的时候是…

vue移动端瀑布流布局

需求: 瀑布流, 图片大小统一不变, 描述长度根据内容确定, 不超过三行. 分两列,那边矮,下个元素就放那边 如图所示: 1. 给item设置top,和left 由于我的项目做了 amfe-flexible适配所以使用rem 完整 template <template><div class"HomePage"><van-l…

【好书精读】网络是怎样连接的 之 全世界 DNS 服务器的大接力

&#xff08;该图由AI制作 学习AI绘图 联系我&#xff09; 目录 域名的层次结构 寻找相应的 DNS 服务器并获取 IP 地址 通过缓存加快 DNS 服务器的响应 DNS 服务器的基本工作就是接收来自客户端的查询消息&#xff0c;然后根据消息的内容返回响应 客户端的查询消息&#xf…

信息量、熵、联合熵、条件熵、相对熵、交叉熵、JS散度、Wasserstein距离

信息量 I ( x i ) l o g 1 P ( x i ) − l o g P ( x i ) I(x_i)log \frac {1}{P(x_i)}-logP(x_i) I(xi​)logP(xi​)1​−logP(xi​) 信息量&#xff08;self-information&#xff09;&#xff0c;又译为信息本体&#xff0c;由克劳德 香农&#xff08;Claude Shannon&…

使用投票回归器VotingRegressor对糖尿病数据集进行回归预测

目录 1. 作者介绍2. 投票回归器VotingRegressor简介2.1 VotingRegressor介绍2.2 VotingRegressor算法遵循以下关键原则&#xff1a; 3. 使用投票回归器VotingRegressor对糖尿病数据集进行回归预测实验过程3.1 代码流程介绍3.2 完整代码3.3 实验结果 1. 作者介绍 余成伟&#x…

【深度学习】YOLOv8训练过程,YOLOv8实战教程,目标检测任务SOTA,关键点回归

文章目录 可用资源资源安装模型训练&#xff08;检测&#xff09;模型pridict模型导出 可用资源 https://github.com/ultralytics/ultralytics 官方教程&#xff1a;https://docs.ultralytics.com/modes/train/ 资源安装 更建议下载代码后使用 下面指令安装&#xff0c;这样…

Hug pylons, not trees 拥抱电网,而非树木 | 经济学人20230408版双语精翻

《经济学人》4月8日周报封面即社论区&#xff08;Leaders&#xff09;精选文章&#xff1a;《拥抱电网&#xff0c;而非树木》&#xff08;Hug pylons, not trees&#xff09;。 Hug pylons, not trees 拥抱电网&#xff0c;而非树木 The case for an environmentalism that bu…

100天精通Golang(基础入门篇)——第9天:Go语言程序的循环语句

&#x1f337; 博主 libin9iOak带您 Go to Golang Language.✨ &#x1f984; 个人主页——libin9iOak的博客&#x1f390; &#x1f433; 《面试题大全》 文章图文并茂&#x1f995;生动形象&#x1f996;简单易学&#xff01;欢迎大家来踩踩~&#x1f33a; &#x1f30a; 《I…

UWB定位的两种解法

UWB(Ultra-Wideband)技术是一种短脉冲无线电技术(短脉冲意味着信号的带宽很大&#xff0c;因此称为超宽带)&#xff0c;其应用非常广泛&#xff0c;其中之一就是室内定位&#xff0c;通过计算信号传播的时间差&#xff0c;可以得到标签和基站之间的距离,如果有足够多的基站&…

Unity核心1——图片导入与图片设置

一、图片导入概述 ​ Unity 支持的图片格式有很多 BMP&#xff1a;是 Windows 操作系统的标准图像文件格式&#xff0c;特点是几乎不进行压缩&#xff0c;占磁盘空间大 TIF&#xff1a;基本不损失图片信息的图片格式&#xff0c;缺点是体积大 JPG&#xff1a;一般指 JPEG 格…

【Elasticsearch】 之 Translog/FST/FOR/RBM算法

目录 Translog FST/FOR/RBM算法解析 FST FOR&#xff08;Frame of Reference&#xff09;: RBM&#xff08;Roaring Bitmaps&#xff09;-(for filter cache) Translog es是近实时的存储搜索引。近实时&#xff0c;并不能保证被立刻看到。数据被看到的时候数据已经作为一…

工业级以太网RJ45温湿度监控系统解决方案之关键POE供电温湿度传感器

目 录 一、关键词…………………………………………………………………………3 二、 产品概述………………………………………………………………………3 三、 应用范围………………………………………………………………………3 四、 产品特点………………………………

Linux0.11内核源码解析-file_dev.c

目录 功能描述 int file_read(struct m_inode * inode, struct file * filp, char * buf, int count) int file_write(struct m_inode * inode, struct file * filp, char * buf, int count) 功能描述 该文件主要是由两个函数file_read()和file_write()组成&#xff0c;提供…

Nginx网站服务——服务基础

文章目录 一.Nginx服务基础1.关于Nginx的特点2.简述Nginx和Apache的差异3.Nginx 相对于 Apache 的优点4.Apache 相对于 Nginx 的优点5.阻塞与非阻塞6.同步与异步7.nginx的应用场景 二.编译安装nginx服务1.在线安装nginx1.1 yum部署Nginx1.2 扩展源安装完后直接安装Nginx 2.ngin…

MySQL数据库---存储引擎(MyISAM与InnoDB)

目录 前言一、存储引擎概念介绍二、MyISAM三、InnoDB四、配置合适的存储引擎总结 前言 数据库存储引擎是数据库底层软件组织&#xff0c;数据库管理系统&#xff08;DBMS&#xff09;使用数据引擎进行创建、查询、更新和删除数据。不同的存储引擎提供不同的存储机制、索引技巧…

Vue中如何进行图像识别与人脸对比

Vue中如何进行图像识别与人脸对比 随着人工智能的发展&#xff0c;图像识别和人脸识别技术已经被广泛应用于各种应用程序中。Vue作为一种流行的前端框架&#xff0c;提供了许多实用工具和库&#xff0c;可以帮助我们在应用程序中进行图像识别和人脸识别。在本文中&#xff0c;…

docker换源(docker镜像源)pull超时(pull镜像超时)/etc/docker/daemon.json

文章目录 pull了n次都超时&#xff0c;也是醉了更换镜像源步骤1. 打开终端并以管理员身份登录到Docker主机。2. 编辑Docker配置文件daemon.json。该文件用于配置Docker守护进程的参数。3. 在daemon.json文件中添加以下内容&#xff0c;将<镜像源地址>替换为您选择的镜像源…

基于matlab仿真具有不同传感器模式的锥形阵列(附源码)

一、前言 此示例说明如何在不同的阵列配置上应用锥形和模型细化。它还演示了如何创建具有不同元素模式的数组。 二、ULA 逐渐变细 本节介绍如何在均匀线性阵列 &#xff08;ULA&#xff09; 的元素上应用泰勒窗口以降低旁瓣电平。 比较锥形阵列和非锥形阵列的响应。请注意锥形U…

外部局域网直接访问WSL2

1. 开启hyper-v 1、首先&#xff0c;进入控制面板—程序—启用或关闭windows功能&#xff0c;勾选hyper-v&#xff0c;确认后重启电脑。2、打开 Windows PowerShell&#xff0c;输入 systeminfo 命令 能够看到出现了很多处理器的信息&#xff0c;最末尾有个 Hyper-V 要求&…

Redis 2023面试5题(一)

一、Redis是单线程还是多线程 在面试中&#xff0c;当被问到Redis是单线程还是多线程这个问题时&#xff0c;可以按照以下思路进行回答&#xff1a; 首先&#xff0c;Redis的核心业务部分是单线程的&#xff0c;即命令处理部分是单线程的。然而&#xff0c;Redis也支持多路复…