有限元算法求解方程,最后得到的误差的收敛阶怎么判断是不是正确的?
最优误差估计
最优误差估计:如果在某种范数下,有限元的误差 u − u h u-u_h u−uh 与相应的插值逼近误差 u − I h u u-I_hu u−Ihu 的收敛阶一致,则称对 u − u h u-u_h u−uh 的估计是最优的(optimal);若 u − u h u-u_h u−uh 的阶高于 u − I h u u-I_hu u−Ihu ,则称 u − u h u-u_h u−uh 具有超收敛性质;若低于插值的阶,则应该改进方法,使之提高。
换句话来说,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
−∇⋅(c∇u)=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=1∑Nbu(Xj)ϕj∈Uh
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=1∑Nbujϕj∈Uh
这里
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
uh∈Uh 是有限元的解
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:∥u−uh∥∞=(x,y)∈Ωsup∣u(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:∥u−uh∥0=∫Ω(u−uh)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:∣u−uh∣1=∫Ω(∂x∂(u−uh))2dxdy+∫Ω(∂y∂(u−uh))2dxdy
给定 u ∈ H u \in H u∈H,和 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||
∣∣u−uh∣∣≤C∣∣u−Ihu∣∣
收敛阶
如果
ϕ
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)
详细的推导在这里,这应该是属于数值分析的内容,
例子
我们可以通过代码计算有限元的解,并得到收敛阶。
比如我用的是线性元求解方程。得到的误差是:
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×10−25.9584×10−31.5442×10−33.9305×10−49.9148×10−5Convergence_L_inf0.00001.89581.94811.97411.9870L2_norm_error1.0435×10−22.6500×10−36.6521×10−41.6648×10−44.1631×10−5Convergence_L20.00001.97741.99411.99851.9996H1_semi_error2.4302×10−11.2205×10−16.1096×10−23.0557×10−21.5279×10−2Convergence_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) ,一阶的。
这和有限元插值误差阶是一致的,因此我们可以说使用线性有限元算法求解该方程是最优收敛的。
也就是说用线性有限元求解该方程是对的。