有限元算法求解微分方程误差的收敛阶分析

有限元算法求解方程,最后得到的误差的收敛阶怎么判断是不是正确的?

最优误差估计

最优误差估计:如果在某种范数下,有限元的误差 u − u h u-u_h uuh 与相应的插值逼近误差 u − I h u u-I_hu uIhu 的收敛阶一致,则称对 u − u h u-u_h uuh 的估计是最优的(optimal);若 u − u h u-u_h uuh 的阶高于 u − I h u u-I_hu uIhu ,则称 u − u h u-u_h uuh 具有超收敛性质;若低于插值的阶,则应该改进方法,使之提高。

换句话来说,The conforming finite elements, the finite element interpolation error can be used to bound the finite element solution error。 这里还有其他理论分析。

也就是说,有限元算法求解的误差,可以说应该与插值逼近的误差做比较。

有限元其实本身就是用分片式多项式去逼近方程的解。

符号定义

方程: − ∇ ⋅ ( c ∇ u ) = f in  Ω u = g on  ∂ Ω - \nabla \cdot (c \nabla u) = f \quad \text{in } \Omega \\ u = g \quad \text{on } \partial \Omega (cu)=fin Ωu=gon Ω
求解 u u u.

有限元插值函数:
I h u = ∑ j = 1 N b u ( X j ) ϕ j ∈ U h I_hu=\sum_{j=1}^{N_b}u(X_j)\phi_j \in U_h Ihu=j=1Nbu(Xj)ϕjUh
X j ( j = 1 , . . . , N b ) X_j(j=1,...,N_b) Xj(j=1,...,Nb) 是有限元节点。 U h = s p a n { ϕ j } U_h = \mathrm{span} \{ \phi_j \} Uh=span{ϕj}是有限元空间, { ϕ j } j = 1 N b \{ \phi_j \}_{j=1}^{N_b} {ϕj}j=1Nb是全局基函数

I h u = ∑ j = 1 N b u j ϕ j ∈ U h I_hu=\sum_{j=1}^{N_b}u_j\phi_j \in U_h Ihu=j=1NbujϕjUh
这里 u j = u ( X j ) u_j=u(X_j) uj=u(Xj),因为全局基函数的定义。
ϕ j ( X k ) = { 0 if  j ≠ k 1 if  j = k \phi_j(X_k) = \{ \begin{aligned} & 0 & \quad \text{if } j \neq k \\ & 1 & \quad \text{if } j = k \end{aligned} ϕj(Xk)={01if j=kif j=k

误差定义

u h ∈ U h u_h \in U_h uhUh 是有限元的解
L ∞  norm error: ∥ u − u h ∥ ∞ = sup ⁡ ( x , y ) ∈ Ω ∣ u ( x , y ) − u h ( x , y ) ∣ \text{L}^\infty \text{ norm error:} \quad \| u - u_h \|_\infty = \sup_{(x,y) \in \Omega} | u(x, y) - u_h(x, y) | L norm error:uuh=(x,y)Ωsupu(x,y)uh(x,y)

L 2  norm error: ∥ u − u h ∥ 0 = ∫ Ω ( u − u h ) 2   d x   d y \text{L}^2 \text{ norm error:} \quad \| u - u_h \|_0 = \sqrt{\int_\Omega (u - u_h)^2 \, dx \, dy} L2 norm error:uuh0=Ω(uuh)2dxdy

H 1  semi-norm error: ∣ u − u h ∣ 1 = ∫ Ω ( ∂ ( u − u h ) ∂ x ) 2 d x   d y + ∫ Ω ( ∂ ( u − u h ) ∂ y ) 2 d x   d y \text{H}^1 \text{ semi-norm error:} \quad |u - u_h|_1 = \sqrt{\int_\Omega \left( \frac{\partial (u - u_h)}{\partial x} \right)^2 dx \, dy + \int_\Omega \left( \frac{\partial (u - u_h)}{\partial y} \right)^2 dx \, dy} H1 semi-norm error:uuh1=Ω(x(uuh))2dxdy+Ω(y(uuh))2dxdy

给定 u ∈ H u \in H uH,和 U h U_h Uh

因为 The conforming finite elements, the finite element interpolation error can be used to bound the finite element solution error

我们可以知道
∣ ∣ u − u h ∣ ∣ ≤ C ∣ ∣ u − I h u ∣ ∣ ||u-u_h||\leq C||u-I_hu|| ∣∣uuh∣∣C∣∣uIhu∣∣

收敛阶

如果 ϕ j \phi_j ϕj 是线性函数:
有限元线性插值函数误差收敛阶 for L ∞ L^\infty L is O ( h 2 ) O(h^2) O(h2)
有限元线性插值函数误差收敛阶 for L 2 L^2 L2 is O ( h 2 ) O(h^2) O(h2)
有限元线性插值函数误差收敛阶for H 1 H^1 H1 is O ( h ) O(h) O(h)

如果 ϕ j \phi_j ϕj 是 二次函数
有限元二次插值函数误差收敛阶 for L ∞ L^\infty L is O ( h 3 ) O(h^3) O(h3)
有限元二次插值函数误差收敛阶 for L 2 L^2 L2 is O ( h 3 ) O(h^3) O(h3)
有限元二次插值函数误差收敛阶 for H 1 H^1 H1 is O ( h 2 ) O(h^2) O(h2)

详细的推导在这里,这应该是属于数值分析的内容,

分片式线性插值函数误差阶分析 最大误差(无穷范数)

分片式线性插值函数误差阶分析 L2范数误差

分片式线性插值函数误差阶分析 H1半范误差

分片式二次插值函数误差阶分析

例子

我们可以通过代码计算有限元的解,并得到收敛阶。

比如我用的是线性元求解方程。得到的误差是:
h1 h2 L_inf_error Convergence_L_inf L2_norm_error Convergence_L2 H1_semi_error Convergence_H1_semi 0.2500 0.1250 2.2172 × 1 0 − 2 0.0000 1.0435 × 1 0 − 2 0.0000 2.4302 × 1 0 − 1 0.0000 0.2500 0.0625 5.9584 × 1 0 − 3 1.8958 2.6500 × 1 0 − 3 1.9774 1.2205 × 1 0 − 1 0.9936 0.2500 0.0312 1.5442 × 1 0 − 3 1.9481 6.6521 × 1 0 − 4 1.9941 6.1096 × 1 0 − 2 0.9984 0.2500 0.0156 3.9305 × 1 0 − 4 1.9741 1.6648 × 1 0 − 4 1.9985 3.0557 × 1 0 − 2 0.9996 0.2500 0.0078 9.9148 × 1 0 − 5 1.9870 4.1631 × 1 0 − 5 1.9996 1.5279 × 1 0 − 2 0.9999 \begin{array}{|c|c|c|c|c|c|c|c|} \hline \text{h1} & \text{h2} & \text{L\_inf\_error} & \text{Convergence\_L\_inf} & \text{L2\_norm\_error} & \text{Convergence\_L2} & \text{H1\_semi\_error} & \text{Convergence\_H1\_semi} \\ \hline 0.2500 & 0.1250 & 2.2172 \times 10^{-2} & 0.0000 & 1.0435 \times 10^{-2} & 0.0000 & 2.4302 \times 10^{-1} & 0.0000 \\ \hline 0.2500 & 0.0625 & 5.9584 \times 10^{-3} & 1.8958 & 2.6500 \times 10^{-3} & 1.9774 & 1.2205 \times 10^{-1} & 0.9936 \\ \hline 0.2500 & 0.0312 & 1.5442 \times 10^{-3} & 1.9481 & 6.6521 \times 10^{-4} & 1.9941 & 6.1096 \times 10^{-2} & 0.9984 \\ \hline 0.2500 & 0.0156 & 3.9305 \times 10^{-4} & 1.9741 & 1.6648 \times 10^{-4} & 1.9985 & 3.0557 \times 10^{-2} & 0.9996 \\ \hline 0.2500 & 0.0078 & 9.9148 \times 10^{-5} & 1.9870 & 4.1631 \times 10^{-5} & 1.9996 & 1.5279 \times 10^{-2} & 0.9999 \\ \hline \end{array} h10.25000.25000.25000.25000.2500h20.12500.06250.03120.01560.0078L_inf_error2.2172×1025.9584×1031.5442×1033.9305×1049.9148×105Convergence_L_inf0.00001.89581.94811.97411.9870L2_norm_error1.0435×1022.6500×1036.6521×1041.6648×1044.1631×105Convergence_L20.00001.97741.99411.99851.9996H1_semi_error2.4302×1011.2205×1016.1096×1023.0557×1021.5279×102Convergence_H1_semi0.00000.99360.99840.99960.9999

我们可以看到 对于 L 2 / L ∞ L^2/L^∞ L2/L 误差来说,收敛阶是 O ( h 2 ) O(h^2) O(h2) ,二阶的。对于 H 1 H^1 H1半范误差是 O ( h ) O(h) O(h) ,一阶的。

这和有限元插值误差阶是一致的,因此我们可以说使用线性有限元算法求解该方程是最优收敛的。

也就是说用线性有限元求解该方程是对的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值