当前位置: 首页 > article >正文

从理论推导到代码实现:手把手教你用Python/Numpy写出守恒形式的NS方程求解器

从理论推导到代码实现手把手教你用Python/Numpy写出守恒形式的NS方程求解器计算流体力学CFD的魅力在于它将抽象的数学方程转化为可执行的代码让流体运动的奥秘在计算机中重现。对于已经掌握流体力学理论的中高级学习者来说亲手实现一个NS方程求解器是理解CFD底层逻辑的最佳途径。本文将带你从零开始用Python和Numpy构建一个能够正确处理激波的一维守恒形式求解器。1. 守恒形式与非守恒形式的本质区别在理论推导中守恒形式和非守恒形式的NS方程确实是等价的——它们描述相同的物理定律。但当我们进入数值计算领域这种等价性就被打破了。守恒形式之所以成为现代CFD的标配关键在于它严格保持了离散系统中的通量平衡。守恒形式的NS方程可以统一表示为# 守恒形式通用表达式 def conservative_form(U, F, J): return ∂U/∂t ∂F/∂x J而非守恒形式通常会展开为# 非守恒形式示例动量方程 def non_conservative(u, p, ρ): return ρ*(∂u/∂t u*∂u/∂x) -∂p/∂x关键差异体现在三个方面离散守恒性守恒形式确保通量进出计算单元时严格平衡激波捕捉能力守恒形式能自动满足Rankine-Hugoniot条件编程统一性所有方程共享相同的离散框架实际测试表明在激波管问题中非守恒形式可能导致激波速度误差高达15%而守恒形式能控制在1%以内2. 一维欧拉方程的离散化实现我们以一维激波管为模型实现守恒形式的欧拉方程。首先定义守恒变量和通量import numpy as np # 守恒变量U [ρ, ρu, E]^T def primitive_to_conservative(ρ, u, p, γ1.4): E p/(γ-1) 0.5*ρ*u**2 return np.array([ρ, ρ*u, E]) # 通量函数F [ρu, ρu²p, u(Ep)]^T def flux(U, γ1.4): ρ, m, E U u m/ρ p (γ-1)*(E - 0.5*m*u) return np.array([m, m*u p, u*(E p)])采用有限体积法离散使用Roe格式计算数值通量def roe_flux(UL, UR, γ1.4): # Roe平均计算 ρL, mL, EL UL ρR, mR, ER UR uL mL/ρL uR mR/ρR HL (EL (γ-1)*(EL - 0.5*mL*uL))/ρL HR (ER (γ-1)*(ER - 0.5*mR*uR))/ρR ρ_avg np.sqrt(ρL*ρR) u_avg (np.sqrt(ρL)*uL np.sqrt(ρR)*uR)/(np.sqrt(ρL)np.sqrt(ρR)) H_avg (np.sqrt(ρL)*HL np.sqrt(ρR)*HR)/(np.sqrt(ρL)np.sqrt(ρR)) a_avg np.sqrt((γ-1)*(H_avg - 0.5*u_avg**2)) # 特征分解 delta UR - UL λ np.array([u_avg-a_avg, u_avg, u_avga_avg]) α np.array([ 0.5*(δ[0]*(u_avg**2-u_avg*a_avg)/(2*a_avg**2) - δ[1]*u_avg/a_avg**2 δ[2]/a_avg**2), δ[0]*(1 - (u_avg**2-a_avg**2)/(2*a_avg**2)) δ[1]*u_avg/a_avg**2 - δ[2]/a_avg**2, 0.5*(δ[0]*(u_avg**2u_avg*a_avg)/(2*a_avg**2) - δ[1]*u_avg/a_avg**2 δ[2]/a_avg**2) ]) # 通量计算 FL flux(UL, γ) FR flux(UR, γ) return 0.5*(FL FR) - 0.5*np.sum(α*np.abs(λ))3. 时间推进与边界条件处理采用三阶Runge-Kutta方法进行时间离散def rk3_step(U, dt, dx, flux_func, γ1.4): # Stage 1 F compute_flux(U, flux_func) U1 U - dt/dx * flux_divergence(F) # Stage 2 F1 compute_flux(U1, flux_func) U2 0.75*U 0.25*(U1 - dt/dx*flux_divergence(F1)) # Stage 3 F2 compute_flux(U2, flux_func) U_new 1/3*U 2/3*(U2 - dt/dx*flux_divergence(F2)) return apply_boundary(U_new)边界条件处理对激波模拟至关重要。对于激波管问题我们采用固定边界def apply_boundary(U): # 左边界固定初始值 U[:, 0] primitive_to_conservative(ρL, uL, pL) # 右边界固定初始值 U[:, -1] primitive_to_conservative(ρR, uR, pR) # 内部网格零梯度 U[:, 1] U[:, 2] U[:, -2] U[:, -3] return U4. 完整求解器实现与结果验证将各模块组合成完整求解器class ShockTubeSolver: def __init__(self, nx100, γ1.4): self.nx nx self.γ γ self.x np.linspace(0, 1, nx) self.dx 1.0/(nx-1) def set_initial(self, ρL, uL, pL, ρR, uR, pR): U np.zeros((3, self.nx)) for i in range(self.nx): if self.x[i] 0.5: U[:,i] primitive_to_conservative(ρL, uL, pL, self.γ) else: U[:,i] primitive_to_conservative(ρR, uR, pR, self.γ) self.U U def solve(self, t_end, CFL0.8): t 0 while t t_end: # 计算时间步长 a np.sqrt(self.γ * self.compute_pressure() / self.U[0]) u np.abs(self.U[1]/self.U[0]) dt CFL * self.dx / np.max(u a) if t dt t_end: dt t_end - t self.U rk3_step(self.U, dt, self.dx, roe_flux, self.γ) t dt def compute_pressure(self): return (self.γ-1)*(self.U[2] - 0.5*self.U[1]**2/self.U[0])典型Sod激波管问题的测试案例# 初始化条件 solver ShockTubeSolver(nx500) solver.set_initial(ρL1.0, uL0.0, pL1.0, ρR0.125, uR0.0, pR0.1) # 运行求解 solver.solve(t_end0.2) # 结果可视化 import matplotlib.pyplot as plt plt.figure(figsize(12,8)) plt.subplot(311); plt.plot(solver.x, solver.U[0]) plt.ylabel(Density); plt.grid() plt.subplot(312); plt.plot(solver.x, solver.U[1]/solver.U[0]) plt.ylabel(Velocity); plt.grid() plt.subplot(313); plt.plot(solver.x, solver.compute_pressure()) plt.ylabel(Pressure); plt.grid() plt.show()在实现过程中我发现几个关键调试点通量计算精度Roe格式中的熵修正对弱激波至关重要CFL条件必须动态调整时间步长保持稳定性边界反射非物理反射会污染计算结果需要适当增加缓冲层

相关文章:

从理论推导到代码实现:手把手教你用Python/Numpy写出守恒形式的NS方程求解器

从理论推导到代码实现:手把手教你用Python/Numpy写出守恒形式的NS方程求解器计算流体力学(CFD)的魅力在于它将抽象的数学方程转化为可执行的代码,让流体运动的奥秘在计算机中重现。对于已经掌握流体力学理论的中高级学习者来说&am…...

Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能

Redis沙盒体验:在浏览器中零门槛掌握NoSQL核心技能 【免费下载链接】try.redis A demonstration of the Redis database. 项目地址: https://gitcode.com/gh_mirrors/tr/try.redis 当你第一次听说Redis时,是否被那些晦涩的技术术语吓退&#xff1…...

网易云音乐NCM转MP3终极指南:ncmdump工具完整使用教程

网易云音乐NCM转MP3终极指南:ncmdump工具完整使用教程 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 你是否曾经从网易云音乐下载了心爱的歌曲,却发现只能在特定播放器上收听?NCM格式的限制让音乐…...

App Inventor蓝牙调试避坑指南:从连接失败到数据乱码,一次讲清所有常见问题

App Inventor蓝牙调试避坑指南:从连接失败到数据乱码的实战解决方案在移动应用开发领域,蓝牙通信一直是实现设备间短距离数据交换的核心技术之一。对于使用App Inventor的开发者而言,蓝牙模块提供了无需复杂编码即可实现无线通信的便捷途径。…...

别再乱算相似度了!用Python实战二元变量聚类:从Jaccard系数到病人分组

医疗数据分析实战:用Python实现基于Jaccard系数的病人症状聚类在医疗数据分析领域,如何从海量病人症状数据中发现潜在规律一直是临床研究的难点。传统方法往往依赖医生经验或简单统计,而现代数据挖掘技术为我们提供了更科学的解决方案。本文将…...

UOS系统下WPS卸载不干净?手把手教你用命令行精准清理(附dpkg/apt组合拳)

UOS系统下WPS卸载不干净?手把手教你用命令行精准清理 在UOS系统日常使用中,WPS Office作为常用办公软件,有时因版本更新或功能调整需要彻底卸载。但不少用户发现,通过图形界面或简单命令卸载后,系统中仍残留配置文件、…...

iPaaS 应用场景深度解析:从系统孤岛到数据自由流动的六大实战路径

写在前面 一个企业的数字化程度越高,系统就越多。系统越多,集成问题就越严重。 这不是假设,而是我们在服务客户过程中反复验证的结论——企业数字化转型的瓶颈,往往不在于"造新系统",而在于"连老系统&q…...

智能手机相机光谱特性测量与多光谱成像技术

1. 智能手机相机光谱特性测量基础智能手机相机的光谱灵敏度函数(Spectral Sensitivity Function, SSF)和透射率函数是计算摄影领域的核心参数,它们决定了设备对光信号的响应特性。准确获取这些参数对色彩还原、光谱重建和白平衡校准等任务至关重要。1.1 光谱灵敏度函…...

基于Arduino与应变片传感器的高精度厨房电子秤DIY全攻略

1. 项目概述:用Arduino打造一台高精度厨房电子秤作为一个喜欢在厨房里折腾的硬件爱好者,我经常遇到需要精确称量食材的场合。市面上的电子秤要么精度不够,要么价格不菲,要么功能单一。于是,我萌生了自己动手做一台的想…...

AArch64内存管理:MAIR_EL3寄存器详解与应用

1. AArch64内存管理基础与MAIR_EL3寄存器定位 在Armv8-A/v9-A架构中,内存管理单元(MMU)通过多级页表实现虚拟地址到物理地址的转换。当处理器执行内存访问时,MMU会遍历页表条目(Translation Table Entry),其中包含两个关键信息:目…...

利用DiSEqC协议与AVR单片机驱动卫星天线电机改造户外设备

1. 项目概述:用卫星天线电机驱动一切如果你手头有一些需要承受风吹日晒、还得精确转动的设备,比如一个户外的大型定向天线,或者一个需要定期调整角度的太阳能板支架,甚至是一个坚固的监控云台,你可能会为驱动机构发愁。…...

用数字逻辑门复刻柏林钟:从二进制编码到硬件实现

1. 项目概述:用数字电路复刻“柏林钟”作为一个在柏林长大的孩子,我从小就对库达姆大街上的那座“柏林钟”着迷。它不像传统时钟那样用指针或数字告诉你时间,而是通过几排不同颜色的发光方块,以一种近乎艺术的方式呈现时间。这种独…...

别再死记硬背SMO公式了!用Python手写一个SVM分类器,带你一步步拆解SMO核心逻辑

用Python手写SVM分类器:代码驱动理解SMO算法核心在机器学习领域,支持向量机(SVM)以其优秀的分类性能和坚实的数学基础著称。然而,许多学习者在理解其核心算法——序列最小优化(SMO)时,往往被复杂的数学推导所困扰。本文将采用一种…...

CANN-昇腾NPU-RAG推理-检索增强生成怎么部署

RAG(Retrieval-Augmented Generation)是 LLM 知识库的组合:先检索相关文档,再让 LLM 基于文档回答。昇腾NPU 上部署 RAG 需要两个组件:Embedding 模型(做向量检索)和 LLM(做生成&am…...

从Gamma函数到泊松分布:一个概率论中的含参量积分实用案例解析

Gamma函数与泊松分布:概率论中的数学之美 在数据科学和机器学习的实践中,概率分布构成了建模的基石。当我们深入探究这些分布背后的数学原理时,Gamma函数以其优雅的性质和广泛的应用脱颖而出。它不仅连接了离散与连续概率世界,更在…...

DIY复刻经典:Texar Audio Prism动态处理器克隆套件全攻略

1. 项目概述:Texar Audio Prism 克隆套件如果你在专业音频圈子里混过一段时间,尤其是对上世纪八九十年代那些经典的、带点“魔法”色彩的外置动态处理器感兴趣,那么“Texar Audio Prism”这个名字你大概率不会陌生。它不是最常见的1176或者LA…...

BetterJoy完整配置指南:5分钟让Switch手柄在PC上完美运行

BetterJoy完整配置指南:5分钟让Switch手柄在PC上完美运行 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.c…...

HFSS仿真结果怎么看?一文读懂S参数与电场图,让你的T型波导分析不再迷茫

HFSS仿真结果深度解析:从S参数到电场图的工程实践指南面对HFSS仿真生成的复杂数据图表,许多工程师常陷入"看得见数据却读不懂含义"的困境。本文将带您穿透数据表象,掌握T型波导性能分析的核心方法论。1. S参数:波导性能…...

基于LM22678的树莓派硬盘专用电源设计:解决供电不稳与电流冲击

1. 项目概述:为什么我们需要一个“专用”电源?如果你正在用树莓派搭配一块机械硬盘搭建一个家庭服务器或者个人云存储,可能已经遇到了一个不大不小的麻烦:供电不稳。树莓派官方推荐的5V/3A电源,单独带树莓派4B跑满负载…...

除了排错,你可能不知道OPC Expert v8.1还能做这些:数据归档、计算与冗余实战

解锁OPC Expert v8.1的隐藏潜力:数据归档、实时计算与冗余架构实战指南在工业自动化领域,OPC Expert常被视为故障排查的"急救箱",但它的能力远不止于此。当大多数工程师还在用它解决DCOM配置问题时,少数先行者已经用它重…...

从Office功能区的“局外人“到“掌控者“:Office RibbonX Editor深度指南

从Office功能区的"局外人"到"掌控者":Office RibbonX Editor深度指南 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/g…...

告别虚频困扰:用VASP+DynaPhoPy搞定高温材料声子谱的保姆级教程

高温材料声子谱计算实战:从虚频困境到非谐解决方案 引言:虚频问题的根源与突破路径 在计算材料学领域,声子谱分析是理解材料动力学稳定性和热力学性质的核心手段。然而许多研究者都遭遇过这样的困境:对实验合成的材料进行简谐近似…...

Office RibbonX Editor:让Office界面定制变得像搭积木一样简单

Office RibbonX Editor:让Office界面定制变得像搭积木一样简单 【免费下载链接】office-ribbonx-editor An overhauled fork of the original Custom UI Editor for Microsoft Office, built with WPF 项目地址: https://gitcode.com/gh_mirrors/of/office-ribbon…...

手把手教你为WCH CH582移植CherryUSB主机栈(基于RT-Thread,含中断优化)

基于RT-Thread的WCH CH582 USB主机协议栈深度移植指南在嵌入式开发领域,USB主机功能的实现往往意味着设备能够直接连接各类USB外设,从简单的键盘鼠标到复杂的存储设备。对于使用WCH CH582这类RISC-V内核MCU的开发者而言,原厂SDK提供的USB主机…...

D3KeyHelper:暗黑3玩家的智能按键助手,告别重复操作疲劳

D3KeyHelper:暗黑3玩家的智能按键助手,告别重复操作疲劳 【免费下载链接】D3keyHelper D3KeyHelper是一个有图形界面,可自定义配置的暗黑3鼠标宏工具。 项目地址: https://gitcode.com/gh_mirrors/d3/D3keyHelper 你是否曾在《暗黑破坏…...

番茄小说下载器终极指南:三步构建你的离线阅读自由王国

番茄小说下载器终极指南:三步构建你的离线阅读自由王国 【免费下载链接】Tomato-Novel-Downloader 番茄小说下载器不精简版 项目地址: https://gitcode.com/gh_mirrors/to/Tomato-Novel-Downloader 你是否曾在地铁里读到精彩章节时突然断网?是否在…...

AI时代程序员职业发展与个人创业可行性研究报告

一、行业宏观变革(2026核心趋势数据佐证) 1.1 开发范式已彻底重构(行业不可逆拐点) 2026年正式进入AI Agent智能体开发时代,传统CRUD编码价值持续崩塌。 核心权威数据: Gartner预测:2026年75%企…...

从社交关系到分子结构:图解GCN(图卷积网络)到底在‘看’什么?

从社交关系到分子结构:图解GCN(图卷积网络)到底在‘看’什么?想象一下,你刚搬到一个新社区,想快速了解周围的邻居。最直接的方式是什么?不是挨家挨户敲门,而是通过社区活动认识几位关…...

告别道路预测老套路:用ParkPredict+模型思路,解决停车场里的‘鬼探头’难题

破解泊车场景预测困局:ParkPredict模型的技术革新与实践停车场里的每一次转向、倒车和避让,都是对自动驾驶系统预测能力的极限挑战。与开放道路的规则明确不同,这里没有清晰的车道线指引,没有统一的行驶方向,只有随时可…...

新手村任务:成为一个架构师需要哪些装备?

新手村任务:成为一个架构师需要哪些装备? 一、前言 如果你刚入行不久,想成为一名架构师,那这篇文章就是为你写的。 我们把成为架构师比作一个RPG游戏,你是主角,需要收集各种装备、刷经验、升级技能。 新手村的第一个任务就是:了解你需要哪些装备。 二、架构师技能树…...