求解器是工业仿真软件里的核心,更强调了对数学的依赖。本文简要介绍一下求解器开发的数学基础。
关于求解器(Solver)
因为字面意思太通用,不同行业对“求解器”的理解可能不同。
对于工业仿真软件,“求解器”(Solver)主要指使用数值计算方法求解工程问题的计算程序,也是行业内的通用叫法,
工业仿真软件一般分为三个大模块:
前处理器,求解器,后处理器。
1.前处理器主要处理几何,设置业务数据以及求解器需要的网格和属性数据;
2.求解器则读取前处理的数据进行仿真计算,并导出结果;
3.后处理器则对求解器的计算结果进行加工,显示相应计算结果。
为了解耦软件,也为了便于测试和发布,求解器通常设计成作为独立的可执行程序,用文件的形式和前处理器和后处理器交互。这种结构从三四十年前软件设计之初一直沿用到现在。
根据笔者的研发经历,将研发相关知识分为四类,也包括求解器:
第一类是理论基础。比如各种数值理论,控制方程,数学公式等等,这类知识其实不需要过于深究,原因在于就类知识类似于万有引力理论,它反映了万事万物的一些规律特征,其实很难理解,记住就好。这一块知识是科学家,数学家的工作。
第二类是推导计算。在第一类知识的基础上,通过公式推导,理论验证,将其变成可编程实现的算法和代码。这块理论相对成熟,研发都有迹可循;但需要一定的技术积累,有相当的技术门槛,在某些前沿领域还是有不确定的因素,查阅论文,期刊是常有的事,对应于软件研发中的原型开发技术,CAE软件研发的一些思考(5)--系统的开发求解器一文中有过介绍。这一块需要对业务有相当的知识积累,也是对数学和业务依赖最多的部分。
第三类是工程应用。工程应用是在第二类知识的基础上的拓展,这类知识就要求在研发中着重需要解决实际工程问题。实际工程问题的特点是模型规模大复杂,各种参数偏离标准模型假设,特征高度非线性,有各种不合理设计,存在性价比的问题,系统工程特征突出。这类知识通常都是现成的技术方案,但是内容多,知识繁杂,交错各种非技术因素,要找到一个适合业务的技术方案也不是简单的事情。
第四类是软件开发。这个包括了基本的语言开发,需求分析,架构设计,流程管理,技术选型,系统集成等一系列和软件工程相关的知识。通常做求解器开发的朋友接触较少。但这块对于一款软件产品却又至关重要。
回到主题,求解器开发首先是理解
偏微分方程
偏微分方程是多物理场仿真技术的起点和理论基础。偏微分方程在不同行业又叫控制方程或本构方程,笔者一般叫“控制方程”。
从经典的热传导方程,波动方程,赫姆霍兹方程,再到拉普拉斯,泊松方程,以及纳维斯托克方程,麦克斯韦方程,以及薛定谔方程。几乎每一个方程都是一种物理场或者某一类行业里的控制方程。这些经典的偏微分方程可能相互有联系,比如拉普拉斯和泊松方程差别在于一个源项,赫姆霍兹方程是麦克斯韦方程的一种特殊形式,在这些基础方程上,通过简化,扩展又会衍生成出各种特殊的方程。
正如前面介绍的知识类型,偏微分方程理论属于第一类理论基础,对于研发来说,可能并不需要我们研究的太深,但是理解偏微分方程的特点却能很好的帮助求解器开发:目前大部分偏微分方程都为二阶,即最高偏导两次,在构造形函数时,二阶多项式性价比往往最好;在多物理场耦合仿真中,往往首先需要明确不同物理场构成的偏微分方程组,偏微分方程组的强耦合求解仍然是世界难题,实际工程中一般使用弱耦合求解。COMSOL软件是目前对偏微分方程求解支持比较好的工具,可以支持用户自定义的偏微分方程和方程组,抛开工业应用和精度不谈,是名副其实的多物理场仿真软件。
边界条件是求解偏微分方程的一个重要内容,也是求解器开发实现的重点,偏微分方程的边界条件在 一篇文章入门多物理场有限元(全篇)一文中有所介绍。
偏微分方程求解的主流的数值方法包括有限元,有限差分,有限体积,离散元,边界元,矩量法等方法,以及无网格法,显式方法,时域有限差分,谱方法等等。这些之前有过介绍。
三维几何
求解器中一般会涉及到三维网格的各种计算,需要一定的几何基础知识。比如矢量运算,基本二维三维网格特征计算,空间查找,遍历,树结构加速等。
数值分析计算
求解器中会涉及到微积分,插值,拟合,常微分方程,迭代方法,误差分析,高精度计算等等。其中微积分是高数的基础内容,也是偏微分方程推导的基本工具,研发可能不需要推导公式,但一定要能看懂微分积分公式,是基础性内容。
线性代数
线性代数介绍了线性空间的基本概念,向量操作,矩阵的基本特征和运算等。这门课程在大学里绝对是排名第一的“挂科杀手”,但却是求解器开发基础中的基础。
矩阵论
求解器的大部分操作都基于矩阵,而且是大规模矩阵,所以对矩阵基础知识和计算要非常熟悉。比如一般有限元方法都是稀疏矩阵,稀疏矩阵有其特有的压缩存储方式和数据结构,而满秩矩阵也有特殊的加速求解方法,大规模分布式计算对矩阵的分块和通信有较高要求。一些特殊线性方程组求解方法比如多重网格,Krylov子空间,GMRES,JFNK等涉及到多种方法组合使用,基本都可以作为一个大的研究方向,真正解决实际问题需要相当的实践经验。
线性代数和矩阵其实在内容上有所重叠,从实际研发角度看,线性代数是基础,矩阵论着重于对矩阵的操作运算,比如矩阵求逆,分解,迭代计算,也包括各种类型线性方程组的求解。通常研发中不会写底层的求解库,而是去调用第三方库,但是每种库都有其特点,理解矩阵的特征对于选择合适的求解库也非常重要。
经典的《矩阵计算》一书基本涵盖了矩阵方方面面,其中对大规模线性方程组各种解法介绍也比较全面,求解器开发必备参考书。
最近几年火热的人工智能,计算机视觉,深度学习等,其底层算法实现也都是以线性代数和矩阵论为基础。
以上列举了一些求解器开发的数学基础内容,实际研发中还需要对各种通用基础算法比较了解,比如常规的排序算法,优化算法,线性规划等,有些求解器可能是半数值半解析,需要进行数学公式推导等等。
总之,求解器开发对数学知识要求相对较高,还要了解行业内业务和常用模型。要开发出高水平的求解器,掌握必要的软件架构设计,高性能计算,软硬件知识也必不可少。