散度

最近要进行全国第七次人口普查啦,为了全社会的繁荣稳定,我们决定研究一下和水流很相似的人流的性质。假如有一个无限长的大厅,我们将它划分为很多方形区域。每个区域都有一些人,人可能会到处移动:如下图

现在我们想知道在某个区域的人,离开这个区域的程度,怎么算呢?比如区域E,原来有一些人,现在单位时间内有u个人从左右边界离开,有v个人从上下边界离开,现在区域E少了多少人?

答案很简单,就是u+v,我们可以叫它"某个东西离开这个区域的程度"或”分散程度“,或者简称叫做“散度”,英文Divergence。

V就是一个速度向量,包括x轴的速度u和y轴的速度的v。倒三角即为散度符号。假如进入这个区域的人数和离开这个区域的人数相等,那么这个区域的散度就为零。如果离开的速度大于进入的速度,那么散度就为正,比如源(Source)就是这样的。如果进入的速度大于离开的速度,那么散度就为负,比如汇(Sink)就是这样的。

比如对于上面的大厅,有大厅入口的区域A就是源,因为并没有别的区域的人进入区域A,而一直都是区域A的人离开区域A而进入别的区域。有大厅出口的区域I就是汇。对于一个雨中池塘来说,雨滴落到水面之处就是池塘的源。如果有个抽水管正将水抽离池塘,那么抽水管之处就是池塘的汇。

我们再来看看隔壁电磁场是怎么玩的。电场和流场和一样也有源和汇,不过电场的源是正电荷,汇是负电荷。

电场强度的散度和什么有关呢?当然就是正电荷和负电荷的分布情况啦!

上面E就是电场强度,p就是单位体积电荷密度。

而磁场有一点不一样。虽然我们可以在电场中找出正电荷和负电荷,但却找不到磁场单独的源和汇——磁单极子。我们现在只能观察到成对出现的磁场正负极,而没法将它们分开。既然没有单独的源和汇,那么磁场中的散度就到处都是0啦。

公式1和2就是麦克斯韦方程组中的两个方程。是不是看起来有点不对称?巧了,不仅是你和我,很多科学家也这么想,他们想找出磁单极子,来稍微完善一下大一统理论。而且很多理论研究借助磁单极子的思想将更加方便。但是,无奈现在就是找不到磁单极子。但是无论是证明了磁单极子的存在还是不存在,都将影响很多科学研究和理论。

或许你也可以试着找找看?磁单极子是否存在的答案,也许就隐藏在某本书,某篇论文或某个公式之中。

到那时候就可以批量生成可以产生磁场的皮卡丘或御坂了。【误】

欧拉形式连续性方程

我们再来看一个简单的问题。在之前提到的那些区域中,假设区域E一开始有8个人,现在这个时刻区域D有3个人离开了区域D,穿过了区域D与区域E的交界处,来到了区域E。那么下一个时刻区域E有多少人?

“太简单了”,你一边想一边算出了结果“8 + 3 = 11”。

就在你用0.00001秒心算出结果的时候,你不仅严格遵循了牛顿第一定律“物质不会凭空产生,也不会凭空消灭”,还顺便将其扩展到了流体力学,推导出了流体力学三大基础守恒方程之一——连续性方程。

我们再来分析一遍你思考的过程,对区域E来说:

区域E增长的人数 = (从区域DE交界处进来的人数 + 从区域BE交界处进来的人数 + 从区域FE交界处进来的人数 + 从区域HE交界处进来的人数)

这么长一串文字写起来太麻烦了,我们化简一下。首先:

从区域DE交界处进入区域E的人数 = -从区域DE交界离开区域E的人数

注意等式右边有个负号,也就是如果进来3个人,相当于离开了(-3)个人。并且DE和FE都是x轴方向,剩下两个都是y轴方向。那么对区域E来说:

区域E增长的人数 + (从x轴方向离开的人数 + 从y轴方向离开的人数)= 0

然后把时间也考虑上:

区域E在单位时间增长的人数 + (区域E的人数 乘以 从x轴方向离开的速度 + 区域E的人数 乘以 从y轴方向离开的速度)= 0

写成微分形式就是

p就是人口密度,t时间,u就是x方向上的速度,v是y方向上的速度,倒三角形就是散度符号,

拉格朗日形式连续性方程

在刚才我们提到的大厅中,假如有一个旅行团(流体微团),由一些旅客和导游(流体粒子)组成,他们会尽量聚集在一起,但是整个旅行团不同的时间会前往不同的地方。

这个旅行团成员会占据一定区域。这个区域的面积都会随着时间和空间变化。因此这个区域的人口密度也会变化,这就是物质导数。

旅行团的人数遵循牛顿第一定律,不会无缘无故减少。所以旅行团占据区域的人口密度变化的原因就是成员在空间上分散了,如下图,原来四名成员占据四个方格,现在占据六格,导致人口密度变低。

或者说,人口密度之所以变低,是因为他们有一个互相离开的速度,写成数学公式就是如下,也就是拉格朗日形式的连续性方程:

两种形式的联系

可以看到我们在推导欧拉形式的连续性方程时,我们关注的是某个区域,这个区域位置和大小都不会变化,流体微团可以自由进出。而推导拉格朗日形式的连续性的连续性方程时,关注的是某个封闭系统,其位置和大小都会变化,但是流体微团不能自由进出。这两种方法各有优劣。虽然现在我们使用欧拉方法,但前者使用也很多。比如涡方法(vortex method)和光滑粒子流体动力学(smoothed particle hydrodynamics)使用的是拉格朗日方法,

这两种形式的连续性方程是如何联系到一起的呢?根据《高等数学》中导数概念有:

因此3式中的散度符号可以换成

代入3式得,再和4式比较:

不可压缩流体中的不可压缩是指,流体微团的密度不会改变。如下图:

因此得到如下结果:

第二项写成微分形式就是下面这样,我们以后还会经常见到这个公式的:

好了,我们旅游团的成员现在只会跟随旅游团一起移动,而不会独自到处乱跑啦,这能让导游的工作量大大减轻。把流体看成不可压缩的,也能让计算大大简化。

波动方程

前面扯了一堆连续性方程,其实和波动方程关系并不大,完全只是为了减少下一篇的篇幅~

回顾第二章的一维对流方程,用这个方程去模拟波的话,这个波只能向一个方向传播。

'如果我们想要它往反方向传播,就把u改成负数:

但上式仍然只能让波往一个方向传播。如果想让它同时向正反两个方向传播怎么办?很简单,将5式和6式乘起来,就得到了一维的波动方程,它能让波同时向两个方向传播。思考一下为什么是相乘而不是相加。

这样一来,二维波动方程也很容易得出:

一维的波的”所有方向“只包括两个方向,而二维的”所有方向“组合起来成了一个圆。三维当然就是一个球啦。

注意等式右边还有一个f,这个代表的是源,与初始条件不同的是,源每时每秒都在发挥作用。离散化的公式直接截图吧:

解得

于是得到2D波动方程的着色器主要代码如下:

float2 

完整代码请看

clatterrr/FluidSimChineseTutorialsWithUnity​github.com

效果如下。不过这阴间配色看起来不像是有雨滴落在池塘里,而是有人试图在岩浆里游泳。

嗯,整天玩全屏着色器玩腻了,我们试试三维的吧,画三角形时间到!虽然说是三维的,但实际上还是用二维波动方程,不过是把颜色的变化改成了三角形高度的变化。wave3d.cs中主要代码如下:

for 

完整代码请看:

https://github.com/clatterrr/FluidSimChineseTutorialsWithUnity/blob/c3737e19822c13aa03ed7e6a177a8fe46cd834f2/Assets/03WaveEquation/wave3d.cs​github.com

最终效果如下:

虽然能用了,但是效果非常之丑。所以,多试一下不同的源,也就是FSource,以及不同的传播速度,换上不同的材质,用波动方程把场景打造成一个真正的意境唯美的三维落雨池塘,就是本篇的挑战啦。

此时我们离NS方程已经很接近了。不过在此之前,我们还需要一点开胃小菜,也就是下一篇《用欧拉方程模拟无粘性染料流动》,敬请期待!

y空间兑换代码_【游戏流体力学基础及Unity代码(三)】用波动方程模拟三维落雨池塘,连续性方程...相关推荐

  1. qt 模拟鼠标滑轮_【游戏流体力学基础及Unity代码(四)】用欧拉方程模拟无粘性染料之公式推导...

    先放一张动态图吊一下胃口~下面就是最终的效果 不可压缩的欧拉方程只比NS方程少一个粘性项.所以下面的内容是完全适合NS方程的.各位请准备好! 散度定理 模拟流体的时候会遇到许多数学公式.为了深刻理解这 ...

  2. 帧差法matlab代码_【游戏流体力学基础及Unity代码(一)】热传导方程

    在游戏中模拟流体并不是什么新鲜事,但是我几乎就没看到什么好的入门文章.有些文章用尖峰波或者FFT模拟,但那毕竟是统计学方法,和流体力学还是不搭边.其余的文章倒是用了纳韦斯托克方程,但那也仅仅是把纳韦斯 ...

  3. flux unity 流体_【游戏流体力学基础及Unity代码(八)】激波捕捉法和RiemannSolver...

    本篇介绍各种解决burgers方程的数值方法,相应的代码可在clatterrr/CFDcodepython找到. 上一章介绍了最简单的非线性方程,即一维无粘性burgers方程,但我们将它稍微改写一下 ...

  4. java代码规范插件_「Java基础知识」代码规范插件怎么用

    原标题:「Java基础知识」代码规范插件怎么用 在开发中,好的编程风格可以提升团队合作能力,提升开发的效率,但是每个人都有自己的编程习惯,如何能够将大家的编程风格统一,这个在团队中也很重要; 在Jav ...

  5. 小波分解与小波包分解代码_分解的功能参数和代码可维护性

    小波分解与小波包分解代码 Code keeps changing, there's no doubt about that. We always do our best to set some roc ...

  6. bat比较有意思的代码_腾讯开源的 Unity全系列 代码逻辑热修复方案--InjectFix

    InjectFix 腾讯开源的 Unity 代码逻辑热修复方案 Unity代码逻辑热修复 可用于Unity业务的bug修复,支持Unity全系列,全平台. 几个亮点 直接在Unity工程上修改C#即可 ...

  7. 如何编写无法维护的代码_编写可维护的前端代码

    点击这里获得更好的阅读体验​github.com 以下是本人在团队内部分享的整理和补充,水平有限,如有错误,请不吝赐教. 大家好,我叫王力国,目前是 RPA 前端团队负责人,过去一年我们从零构建了 R ...

  8. mysql在哪里写代码_[译] 如何写好 Go 代码

    原文:https://scene-si.org/2018/07/24/writing-great-go-code/ 我写了多年的 Go 微服务,并在写完两本关于 (API Foundations in ...

  9. latex附录中放python代码_在Latex中插入Python代码

    这里指的插入是指最终能在生成的pdf中显示高亮的Python代码. 在Latex中插入Python代码,需要一个第三发的宏包pythonhighlight: https://github.com/ol ...

最新文章

  1. 数据流图和数据字典 (笔记 )
  2. Use After Free Tutorial
  3. go interface转int_24. 图解 Go语言中的反射三定律
  4. Python运算符和编码
  5. android 开源计算器,开源Windows 10计算器应用迎来Web/Android/iOS移植版
  6. python中popen转变时区_python中的subprocess.Popen()使用
  7. vlan绑定_图文并茂深入了解VLAN工作原理,不能错过干货
  8. Redis高可用:主从复制及哨兵模式
  9. 这是一份面向Android开发者的复习指南,成功入职字节跳动
  10. CSS之window的视图属性
  11. linux文本处理脚本题,Linux文本处理工具sed练习题
  12. python 界面开发框架_八款常用的 Python GUI 开发框架推荐
  13. go语言编程项目_一个项目需要多少种编程语言?
  14. vue 打开html流_三种方案解决Vue项目打包后dist中的index.html用浏览器无法直接打开的问题...
  15. 麦肯锡卓越工作方法 读书体会
  16. ADS系列 - 混频器设计 - 混频器原理介绍及仿真1
  17. 编写VTK文件,导入paraview显示
  18. 远程windows蓝屏解决办法
  19. 闲谈IPv6-我们在技术思维上需要作出改变(1)
  20. aardio - 仿安装界面进行窗口高度调节的方法

热门文章

  1. Linux环境——MySQL安装及配置(5.7版本)
  2. 树莓派连接WiFi连不上
  3. python与tensorflow实现人脸表情识别(基于CNN)
  4. git配置管理生成多个ssh的key
  5. [python]pip freeze和pipreqs的区别和使用方法
  6. 通常人们说i5处理器的计算机其中二五是指,计算机cpu?学会看CPU只要五分钟
  7. 防火墙阻止应用程序linux,win10系统下如何解除被防火墙阻止运行的应用程序
  8. 【Web前端】html+css+javascript
  9. java实训答辩ppt_基于JavaSwing的工作考勤管理系统设计与实现毕业论文+开题报告+实习报告+实习日历+答辩PPT+项目源码...
  10. 中国石斑鱼养殖产量不断上升,捕捞产量逐渐下降「图」