一、预备知识
边界元法(BEM)
边界元法是一种数值技术,用于求解包括Helmholtz方程在内的偏微分方程。在理论上,边界元法通过将偏微分方程转化为边界积分方程来工作,并仅需在问题域的边界上进行离散化和数值计算,从而将无限域问题转化为有限域问题。
与有限元法相比,边界元法具有半解析,降低一阶维数和处理无限域问题的优势,适合处理以Helmholtz方程为控制方程的无限域声学问题。
Helmhoitz方程
Helmhoitz方程是一个二阶线性偏微分方程,通常用于描述在均匀介质中波动的传播,其一般形式可以表示为:
其中,u是待求解的场量(例如声压),k是波数,k=w/c,其中w是角频率,c为介质中的波速。
在特定条件下,Helmhoitz方程有多种解法,包括分离变量法、格林函数法和有限元方法等。
Green函数(后续更新)
Green第二恒等式(后续更新)
数值解和解析解
数值解:数值解是通过数值方法近似得到的解,通常涉及迭代计算和离散化技术,它使用数值逼近和计算算法来估计解的值,例如有限差分法、有限元法、边界元法等。数值解的精度受到计算资源、数值方法的选择和离散化精度的限制。
解析解:解析解是用数学表达式精确描述的解,通常涉及符号计算,解析解提供了对问题的完整和精确理解,包括解的行为、特性和极限情况,并不是所有数学问题都有解析解,有些问题可能因为复杂性或非线性而无法找到解析解。
差别:(1)解析解是精确的,而数值解是近似的。(2)解析解通常更具有普遍性,可以适用于所有参数值;数值解则依赖于特定的参数值和离散化。(3)解析解可能难以找到或难以表示,而数值解可以通过计算机程序快速计算。
有边界的情况下的Helmholtz方程
Helmholtz方程在有边界的情况下,可以通过设置适当的边界条件并使用解析或数值的方法来求解。
在有边界的情况下,求解Helmholtz方程通常涉及边界条件。边界条件可以是:
- Dirichlet边界条件(第一类边界条件,指定了微分方程在边界处的解):
- Neumann边界条件(第二类边界条件,指定了微分方程在边界外法线方向的导数):
- Robin边界条件(混合边界条件:物理系统边界上物理量与垂直边界导数的线性组合):
有边界情况的求解办法:
1.解析法(最准确的一种方法)
- 对于简单的几何形状以及边界条件,可以通过分离变量、傅里叶级数等解析方法来求解。
- 如果问题是周期性的,也可以使用傅里叶变换或拉普拉斯变换求解。
2.数值方法
- 有限差分法
- 有限元法
- 边界元法
3.格林函数法
- 对于一些特定的边界问题,可以引入格林函数来求解,格林函数用于描述方程在特定源位置的响应。
二、求解步骤
2.1选择基本解(Green函数)
BEM的核心在于使用基本解(Green函数),他是Helmholtz方程的一个特解。对于二维情况,Helmholtz方程的基本解为:
对于三维情况,基本解为:
其中,x是场点,x0是源点,H是第一类Hankel函数。
三维情况基本解对应C++代码为:
inline std::complex<double> HelmholtzFundamentalSolution(
Eigen::Vector3d pt, std::complex<double> kappa,
Eigen::Vector3d center = Eigen::Vector3d(0, 0, 0)) {
return std::exp(-std::complex<double>(0, 1) * kappa * (pt - center).norm()) /
(pt - center).norm();
}
//Eigen::Vector3d 是Eigen库中的一个类,用于表示三维向量。Eigen::Vector3d pt:第一个参数 pt 是一个三维向量,表示空间中的一个点。
//std::complex<double> kappa:第二个参数 kappa 是一个复数波数,用于描述波动现象的特性。
//Eigen::Vector3d center = Eigen::Vector3d(0, 0, 0):第三个参数 center 是一个三维向量,表示波数作用的中心点,默认值为原点 (0, 0, 0)。
//std::complex<double>(0, 1):创建一个虚部为1,实部为0的复数,表示虚数单位 i。
//kappa * (pt - center).norm():计算波数 kappa 与点 pt 和中心点 center 之间距离的乘积。
//(pt - center).norm() 计算向量 pt - center 的范数(即长度)。
// / (pt - center).norm():将指数函数的结果除以距离的范数,以得到Helmholtz方程的基本解。
2.2构造边界积分方程
通过Green第二恒等式,原始的Helmholtz方程可以转化为边界积分方程。对于Helmholtz方程,这一过程通常会产生以下形式的积分方程:
其中,是边界,
是场函数u的法向导数,c(x0)是系数,通常与边界点的位置有关。
2.3离散化边界
BEM的一个显著特点就是它只对边界进行离散化。将边界分成若干个单元,每个单元上通过数值积分计算相应的贡献。
2.4求解离散方程组
离散化后,原积分方程转化为一个线性方程组,求解该方程组即可得到边界上场的值或导数。随后,通过边界上的解,可以在域内任何感兴趣的点处计算场的值。