[有限体积法] (4)
这次想讨论一下2D情况下显格式和隐格式的FVM处理,并说三种不同于TDMA的迭代方法!
1. 2D:
有了之前1D的知识储备,2D就好理解了。
照猫画虎,写出2D情况下的方程:
模型参考:
再一次假设当我们把控制体无穷小分开时,物理量符合线性分布,这样利用线性插值来近似,时间上采用显格式形式,有:
同样对于上面的式子,我们写成系数的形式:
观察上面的式子,依然可以利用1D的思想,中心控制体是受到周围四个控制体影响的,是他们的加权平均值。
于是,考虑以下的问题:有一个3米*2米的矩形。
我们将这个面分成5*5的结构化网格。
显式格式:
类似于1D情况,2D我们也在边界外侧引入虚拟点。套用(3)式,先对于内部节点进行赋值计算:
对于T11角节点:
很好理解,距离缩小一半,影响程度扩大一半。
对于T12边界节点:
对于这三类节点(内部节点,角节点,边界节点),全部按照各自思路来计算,这样一共得到25个公式。
各个节点的温度,如下图(当然了,网格越密结果越精确。):
隐格式:
想着重说一下隐格式的处理:
同样的,利用(4)式将表达式表示成系数形式:
将未知量和已知量分开表示,如(6)式:
这样的话,如果你代入数据整理,你会发现它的系数矩阵就是一个五对角稀疏矩阵。类比于1D情况,求解未知的系数矩阵的方法,TDMA是否在2D情况下派上用场呢?答案是否定的,三角追赶法只适用于三对角矩阵,所以五对角稀疏矩阵得另外找方法。
除了三角追赶法,《数值分析》中的还有Guass消去法,假设我们的模型网格非常多,千万数量级。它和三角追赶法的不同是:消元法随着方程个数的增加,计算量超线性增大,但是TDMA算法计算量和方程个数是线性增加的。所以,归根结底,消元法就是普通的手算解决一个方程组就行,工程计算消元法实在是计算量太大!
虽然精确解无望,那么近似解的迭代法如何?
对于(6)式进行修改:
这完全就可以用迭代的思想取求解,同一个时间下一共有25个Tp,最开始假设一组TE、TW、TN、TS,例如:算出一个T1,1之后紧接着带入到T1,2的公式中,之后类推同理...直到每个控制体的温度迭代前后的值达到误差范围之内为止!
在这一段过程中,迭代前后的未知量的变化量就是“残差”!如果说最后的迭代过程式收敛的,残差应该是越来越小最后趋于0的,如果熟悉Fluent等商用软件,对这个概念应该不陌生。但是对于2D情况来说,因为一共有很多控制体在依次迭代,每个控制体都有自己的残差,对于每一个来说,迭代前后的残差叫做:绝对残差。但是整体来看,就本例来说,25个控制体,25个方程,一共有25个绝对残差。如果将这25个残差写成向量形式,又该如何描述整体的残差呢?有两种表述方法:1.Rmax,n=max(Rabs,n),即找25个绝对残差中的最大值l;2.Rrms,n将每个绝对残差进行均方根计算,这叫做均方根残差。
可以发现,不管隐格式还是显格式,最后的结果必定是一样的!
2.几种迭代的讨论:
对于线性方程组,最常见的就是Jacobi和Guass-Seidel还有SOR法。这里利用之前《数值传热学》课中的一个小作业为例,先用有限差分的思想说一下这三种方法。之后再讨论一下利用Guass-Seidel在FVM时的应用。
四边的边界值已知,给中间6点一个初始值:假设给的全部为0.
对于拉普拉斯离散方程的求解,可以运用Jacobi迭代或者Gauss-Seidel迭代,还有SOR法。
2.1 Jacobi:
先用假设的值计算6点温度,利用公式:
将每一个点都计算一遍。这时,每个点的温度都得到了一次更新但还不是稳定时候的结果,仍然需要第二次更新,同样利用的(1)式。就这样,每一次迭代更新,都会得到一组新计算出来的值,直到迭代前后的数值之间的误差非常小,满足误差要求为止,所以迭代法就是近似解而非精确解。
这里我设置的误差为(10^-6),可以看到Jacobi迭代的结果:34次迭代完毕:
2.2 Guass-Seidel迭代
同样上述例子,同样内部点的初始值为0。
第一次迭代,我要计算1点的值,利用公式(1),算完之后,计算2点的值,仍然利用(1)只不过计算2点的公式中要将刚刚算出的1点值立马用起来带入到2点计算里;计算3点,要立马将1,2点刚刚算出的值带入用来计算3点;往后每个点都如此;
第一次迭代结束之后的每个点数值肯定不会是最终的解,那么就得第二次、第三次、.....迭代,直到迭代前后的数值之间的误差非常小,满足误差要求为止,所以迭代法就是近似解而非精确解。
(可以明显发现,Guass-Seidel的计算要明显快于Jacobi!)
2.3 SOR
关于松弛因子取决于具体的问题:当他介于0和1之间-称为亚松驰;介于1和2之间-称为超松驰法。
可以发现,SOR法比高斯-赛德尔迭代还要快,这里我的松弛因子设的是1.29。关于松弛因子的最佳值,也许目前有方法了,但我不知道?我的想法就是一直试,看哪个最佳。
回到FVM中:
想一下,在计算机辅助的情况下,计算的方向是:x轴从左向右,y轴从下往上。在计算每一个点的值的时候,可以参考Jacobi的思路,每一点的计算利用上一次迭代的结果;也可以利用Guass迭代的思路,算完T11,在算T21或者T12的时候,将本次迭代之前的计算结果(T11)值立马带入,因为经过新一次迭代后的值更接近于最终解,所以Guass迭代的思路要更快!
上一篇: 数值分析读书笔记(2)求解线性代数方程组的直接方法
下一篇: 大型线性方程组解法入门
推荐阅读
-
35 岁实现财务*,腾讯程序员手握2300万提前退休?-1000万房产、1000万腾讯股票、加上300万的现金,一共2300万的财产。有网友算了一笔账,假设1000万的房产用于自住,剩下1300万资产按照平均税后20-50万不等进行计算,大约花上26-60年左右的时间才能赚到这笔钱。也就是说,普通人可能奋斗一辈子,才能赚到这笔钱。在很多人还在为中年危机而惶惶不可终日的时候,有的人的35岁,就已经安全着陆,试问哪个打工人不羡慕?但问题是有这样财富积累必然有像样的实力做靠山。没有人可以不劳而获。 看到这里,肯定有人说,那么对于普通人来说,卷可能真就成了唯一的出路。但是卷也有轻松的卷,“偷懒”的卷法,对于程序员而言,刨除掉一时无法改掉的开会传统占用的大部分时间,如何把有限的时间和精力放在真正重要的架构设计、需求设计上,而不是重复的造*,编码、改bug、手动测试。因此在科技改变生活的今天,学会使用AI工具成为程序员们的必备技能。 以全栈式全自动的软件开发工具飞算SoFlu软件机器人为例,作为全球首款面向微服务架构设计和最佳实践的软件机器人,SoFlu软件机器人改变了原来手工编码的作业模式,通过可视化拖拽方式以及参数配置就能实现等同于编写复杂代码的业务逻辑,在设计业务逻辑时就完成了微服务应用开发,做到“业务即图,图即代码”,实现“软件开发,十倍提效”。 而作为飞算SoFlu软件机器人的一个重要组成部分,FuncGPT(慧函数)支持所有类型函数创建。通过自然语言描述Java函数需求,实时生成高质量、高可读性的Java函数代码。生成代码可直接复制到IDEA,或一键导入Java全自动开发工具函数库。 FuncGPT(慧函数)具有五大核心能力: ● 自然语言:通过自然语言即可生成函数,降低软件开发门槛。 ● 秒级函数开发:全自动秒级开发函数,秒级完成,效率千倍提升。 ● 一站式函数开发应用:函数生成即可直接应用,效率、安全有保障。 ● 质量可靠:生成的函数代码符合业界规范、具备良好的可读性,符合最优解。 ● 灵活生成:可以根据开发人员的具体需求生成并支持调整和修改。 以“将文件流转换为File对象”这个需求为例,以下是FuncGPT(慧函数)秒级生成的代码: / 类名:FileConverter // 函数名:convertStreamToFile // 函数功能:将文件流转换为File对象 // POM依赖包:无 import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public class FileConverter { /** * 将文件流转换为File对象 * @param inputStream 文件流 * @param filePath 文件路径 * @param fileName 文件名 * @return 转换后的File对象 * @throws IOException 如果发生I/O异常 */ public static File convertStreamToFile(InputStream inputStream, String filePath, String fileName) throws IOException { File file = new File(filePath + File.separator + fileName); // 创建File对象 try (FileOutputStream outputStream = new FileOutputStream(file)) { // 创建文件输出流 byte buffer = new byte[1024]; int bytesRead; while ((bytesRead = inputStream.read(buffer)) != -1) { // 从文件流读取数据并写入文件 outputStream.write(buffer, 0, bytesRead); } } return file; // 返回转换后的File对象 } } // 函数示例 // 将文件流转换为File对象示例 // 入参:inputStream,文件流 // 入参:filePath,文件路径 // 入参:fileName,文件名 // 出参:file,转换后的File对象 // 调用示例: // InputStream inputStream = new FileInputStream("example.txt"); // String filePath = "C:\\Users\\User\\Documents"; // String fileName = "example.txt"; // File file = FileConverter.convertStreamToFile(inputStream, filePath, fileName); // System.out.println(file.getAbsolutePath); // 输出结果:例如,将文件流转换为File对象后,文件的绝对路径为:C:\Users\User\Documents\example.txt // 则输出结果为:C:\Users\User\Documents\example.txt 通过分析,不难发现以上代码:
-
微积分漫步 XXXIII - 体积计算:圆盘法
-
Java 的四个输入法,你知道几个?-4.JOptionPane 相关函数
-
java 科学记数法 && 保留固定的小数位数 - 方法 4:
-
5.1.3 边界值法--二元基本边界值分析 边界值测试的另一个关键假设是,故障很少是由两个(或两个以上)缺陷同时出现造成的,这在可靠性理论中称为 "单一缺陷 "假设。基于 "单一缺陷 "假设的边界值测试称为基本边界值分析。 在边界值测试中,我们通常使用两值边界,然后辅助以正常值来设计输入变量的值。 对于只有 x 和 y 两个输入变量的软件,输入域在二维坐标系中呈阴影状。使用基本边界值分析法得到的测试用例就是黑点所在的位置,总共有九个测试用例。 如果有一个 n 变量的软件输入域,则选择其中一个变量略小于最小值、最小值、正常值、最大值和略大于最大值这五个值,其余全部取正常值。对这个 n 个变量的软件输入域进行边界值分析,可产生 4n+1 个测试用例。 三值基本边界值分析
-
[数学建模算法] (4) 整数程序设计的基本概念和常规算法:分支与边界法
-
新模科技现已加入2024年快递物流展邀您莅临现场--上海新模科技有限公司、上海新模科技有限公司是一家从事技术服务、技术开发、技术咨询等业务的公司,成立于2022年4月29日,公司位于上海,企业经营范围:一般项目:技术服务、技术开发、技术咨询、技术交流、技术转让、技术推广;包装服务;环境咨询服务;租赁服务;知识产权服务(除专利代理服务);品牌管理;广告制作;广告设计、代理;广告发布;互联网销售;包装材料及制品的销售;塑料制品的销售;货物进出口;技术进出口。 展览会
-
气泡排序(超级详细)--升序",从小到大;另一种是 "降序",从大到小。该主题可抽象为 "按升序对 n 个数字排序 "的一般形式。 排序是一种重要的基本算法。排序的方法有很多种,但在本题中我们将使用冒泡排序法。 冒泡法的基本思想 冒泡法的基本思想是,每次比较相邻的两个数字时,较小的那个会被移到前面。如果有 5 个数字9,8,5,2,0,第一次将前两个数字 8 和 9 互换。第二次将第二个和第三个数字(9 和 5)对调......这样一共对调 4 次,得到 8-5-2-0-9 的顺序,可以看到:最大的数字 9 一直在 "下沉",成为最下面的一个数字,而小的数字 "上升" 最小的数字 "上升"。最小的数字 0 已经向上 "浮 "了一个位置。经过第一次比较(共 4 次比较和交换),得到了最大的数字 9。 然后进行第二趟比较,对剩下的前 4 个数字(8、5、2、0)进行新一轮比较,这样第二个最大的数字就 "沉到了底部"。同样,按照上述方法进行第二轮比较。经过 3 次比较和交换,我们得到了第二大数 8。 按照这个规律,我们可以推断出,比较 5 个数字需要 4 次旅行,才能将 5 个数字从小到大排列起来。在第一次旅行中,两个数字之间进行了 4 次比较,在第二次旅行中,进行了 3 次比较......在第四次旅行中,只进行了一次比较。 思路总结 总结:如果有 n 个数字,那么要进行 n-1 次比较。在第一次行程中进行 n-1 次比较,在第 i 次行程中进行 n-i 次比较。
-
4.整数编程:切割平面法 python 代码
-
头歌 - 机器学习第 4 次实验 AGNES 层次聚类法