Joffoo's blog

The ethereal flight, oft rehearsed in the theater of one's dreams...

里兹法求解薄板振动方程

我的研究方向是对微机电压电水听器进行建模,查阅相关文献时往往会遇到这个偏微分方程:

先不管参数 $D,\rho_{h}$,让我们关注方程本身,把这个式子当作单纯的“计算对象”。我没能在 Wolfram 的帮助文档里找到“一键式”的数值求解方法,而解析解只能处理固定边圆板、简支边圆板和简支边方板等特殊情况,如果是蜂巢形的水听器单元呢?

面对偏微分方程难解的问题,里兹法的思路大概是:先通过能量分析,把方程问题变成优化问题,再用基函数逼近真实解。在基函数设置时,就可以考虑薄板形状和边界条件的问题,从而得到一个比较通用的程序,利用 Wolfram 语言的内置函数,还可以把这个程序写得更简单。

最小作用量,最小物理知识

于我而言,“最小作用量”这套方法是在最小化物理知识的基础上,解决所面临的建模问题。

首先,还是要计算出薄板的动能和势能表达式:

其中 $T$ 就是众所周知的 $m v^2/2$ 这个形式,$U$ 则需要参考基尔霍夫薄板理论的应力、应变表达式,并代入线弹性材料应变能的公式里。

补充两点:

  1. 积分区域经过尺度变换,所以可以将尺度系数 $a$(不妨理解为“半径”)提到积分之外。

  2. 为了简化过程,选取了 $U$ 的最简形式,这仅对固定边界条件成立,如果是更一般的情况,应该添加一项:

然后,用二者之差代表最小作用量:

“最小”并不意味着“最小”,只是取得极值,或者说对于自变函数 $w(x,y)$ 来说,变分 $\delta\Pi=0$。所以,虽然里兹采用的能量泛函为 $U-T$,但这一点区别无关紧要。

另外,最小作用量的被积函数部分,就是拉格朗日量(或拉格朗日密度)。将其代入欧拉-拉格朗日方程后,同样可以得到前面给出的偏微分方程。对我来说,这要比从微元体出发的推导容易太多。

1
2
Needs["VariationalMethods`"]
EulerEquations[1/2 \[Rho]h D[w[x, y, t], t]^2 - 1/2 dd (Laplacian[w[x, y, t], {x, y}])^2, w[x, y, t], {x, y, t}] // FullSimplify

用什么基函数来逼近真实解?

很多文章选取的基函数都很巧妙,既要满足边界条件,又要起到逼近真实解的作用。但我们打算得到比较通用的程序,就不能把基函数形式限制在一种特殊场景中。

所以,不妨将基函数写作两项相乘的形式1

边界方程

灰色部分为薄板区域,红色部分为薄板边界:

1
Graphics[{LightGray, #, Red, RegionBoundary@#  }] & /@ {Disk[], Rectangle[{-1, -1}, {1, 1}], RegularPolygon[6]} // GraphicsRow

对于圆形薄板来说,其边界方程为:

对于方形薄板来说,其边界方程为:

注意式子里的上标代表该边界的边界条件,$0$ 对应于自由边界条件,$1$ 对应于简支边界条件,$2$ 对应于固定边界条件

如果是正六边形板,这个边界方程就很难直接写出。可以先写一个函数,能输入各顶点坐标,输出边界方程:

1
2
3
4
5
6
7
8
9
10
11
(* 计算两点之间的线方程 *)
lineEquation[{p1_, p2_}, {x_, y_}] :=
(x - p2[[1]]) (p1[[2]] - p2[[2]]) - (y - p2[[2]]) (p1[[1]] - p2[[1]])

(* 将点列表转换为成对的点 *)
pointsPair[points_List] :=
Partition[Riffle[#, RotateLeft[#]], 2] & @ points

(* 计算多边形的边界 *)
polygonBorder[points_List, {x_, y_}] :=
Times @@ (lineEquation[#, {x, y}] & /@ pointsPair @ points)

正六边形的六个顶点即为:

1
CirclePoints[6]

可计算得到边界方程:

1
polygonBorder[%, {x, y}]

逼近函数

使用勒让德多项式逼近函数:

多项式两两相乘,得到用于函数逼近的二元基函数:

固定边界圆板为算例,其基函数形式为:

1
basicFunctions = Table[LegendreP[i - 1, x] LegendreP[j - 1, y], {i, 4}, {j, 4}] (x^2 + y^2 - 1)^2 // Flatten

终于变成矩阵问题

为方便计算,先把近似解写成基函数加权求和的形式:

代入动能 $T$、势能 $U$ 的表达式中,积分部分即为系数矩阵的“二次型”:$\boldsymbol{c}^\mathrm{T}\boldsymbol{Mc}$ 和 $\boldsymbol{c}^\mathrm{T}\boldsymbol{Kc}$,其中 $\boldsymbol{M},\boldsymbol{K}$ 分别称为质量矩阵刚度矩阵,矩阵元素的表达式为2

继续前面的例子:Wolfram 语言允许我们在区域上进行积分,可计算出刚度矩阵和质量矩阵:

1
2
kmatrix = Table[Integrate[Laplacian[basicFunctions[[i]], {x, y}] Laplacian[basicFunctions[[j]], {x, y}], Element[{x, y}, Disk[]]], {i, 1, 16}, {j, 1, 16}];
mmatrix = Table[Integrate[basicFunctions[[i]] basicFunctions[[j]], Element[{x, y}, Disk[]]], {i, 1, 16}, {j, 1, 16}];

甚至可以发现,对于圆板来说,两个矩阵的所有元素竟然都有精确解:

1
kmatrix // MatrixForm

1
mmatrix // MatrixForm

用矩阵热图进行可视化,不难发现这两个矩阵都是对称矩阵,利用这一特性可以减少运算量。

1
MatrixPlot[#[[1]], PlotLabel -> #[[2]]] & /@ {{kmatrix, "刚度矩阵"}, {mmatrix, "质量矩阵"}} // GraphicsRow

通过选取合适的系数,取得作用量的极值,即作用量对向量 $\boldsymbol{c}$ 求导为零:

化简得到:

1
{vals, coefs} = Eigensystem[{N@kmatrix, N@mmatrix}, -4];

把优化问题转化为质量矩阵和刚度矩阵的广义特征值求解问题,将特征向量 $\boldsymbol{c}$ 与基函数向量 $\boldsymbol{\psi}$ 点乘,即得近似解表达式。可将前四个模态的密度图绘制如下:

其中的密度图为模态振型,上面的数字为特征值 $\lambda$,与以下微分特征方程中的特征值 $k$ 与半径 $a$ 的乘积近似相等:

程序简化并总结为函数

参考上述分析过程,有以下几点优化空间:

第一,质量矩阵、刚度矩阵均为对称矩阵,可削减计算量:

1
2
3
Table[N@Integrate[Laplacian[basicFunctions[[i]], {x, y}] Laplacian[basicFunctions[[j]], {x, y}], Element[{x, y}, Disk[]]], {i, 1, 16}, {j, 1, 16}]; // RepeatedTiming

(*{1.52804, Null}*)
1
2
3
Table[N@Integrate[Laplacian[basicFunctions[[i]], {x, y}] Laplacian[basicFunctions[[j]], {x, y}], Element[{x, y}, Disk[]]], {i, 1, 16}, {j, 1, i}]; // RepeatedTiming

(*{0.813599, Null}*)

第二,计算积分时可并行计算,以减少程序耗时:

1
2
3
$ProcessorCount

(*4*)
1
2
3
ParallelTable[N@Integrate[Laplacian[basicFunctions[[i]], {x, y}] Laplacian[basicFunctions[[j]], {x, y}], Element[{x, y}, Disk[]]], {i, 1, 16}, {j, 1, i}]; // RepeatedTiming

(*{0.355318, Null}*)

第三,为编写更具一般性的程序,应使用数值积分。对于矩阵中存在的大量零元素,需要设定合适的准确度目标:

1
2
3
ParallelTable[NIntegrate[Laplacian[basicFunctions[[i]], {x, y}] Laplacian[basicFunctions[[j]], {x, y}], Element[{x, y}, Disk[]], AccuracyGoal -> 5], {i, 1, 16}, {j, 1, i}]; // RepeatedTiming

(*{1.47974, Null}*)

于是,将优化后的函数整合为一个程序包:

1
2
3
4
5
Clear[polygonBorder, lineEquation, pointsPair]

Get[FileNameJoin[{NotebookDirectory[], "RitzMethod.wl"}]]

?RitzSolver

对于上面的固定边界圆板,可以这样调用函数:

对于简支边界方板,需要多设置两个参数,一个是边界方程的指数,另一个是泊松比:

实际上,参考此算例的解析解表达式,可知泊松比并不影响结果:

1
SSSquare[{m_, n_}, {x_, y_}] := {Pi Sqrt[(m/2)^2 + (n/2)^2], Sin[Pi m (x + 1)/2] Sin[Pi n (y + 1)/2]}

绘图,并与里兹解作比较:

1
DensityPlot[#[[2]], {x, -1, 1}, {y, -1, 1}, PlotLabel -> N@#[[1]]] & /@Flatten[#, 1] &@Table[SSSquare[{i, j}, {x, y}], {i, 2}, {j, 2}] // GraphicsRow

最后是固定边界正六边形板,也就是我在文章最开始讲的“蜂巢形的水听器单元”:

第一个解看上去有些奇怪,可以绘制出立体图形,只是凹陷而已:

本文处理的方程是齐次的,所以不管解的幅值是多少,都能满足该方程,但为了方便后续处理,一般会对幅值作归一化:

为了降低理解难度,文中略去了许多细节。比如一般边界条件的刚度矩阵元素表达式,你可以在程序文件中找到。至于更详细的推导过程,可以参考下面列出的两篇文献,或者自行搜索“基尔霍夫薄板理论”的相关内容。

24/12/04

1. Zhao, J. (2023). Variable stiffness discrete Ritz method for free vibration analysis of plates in arbitrary geometries. Journal of Sound and Vibration, 553, 117662.
2. Leissa, A. W. (2005). The historical bases of the Rayleigh and Ritz methods. Journal of Sound and Vibration, 287(4–5), 961–978.

文章目录

  1. 最小作用量,最小物理知识
  2. 用什么基函数来逼近真实解?
    1. 边界方程
    2. 逼近函数
  3. 终于变成矩阵问题
  4. 程序简化并总结为函数

Proudly powered by Hexo and Theme by Hacker
© 2025 Fengyukongzhou