在数值分析和数值逼近中,除了最大误差(或无穷范数误差)外,另一种常用的误差度量方法是 L 2 L^2 L2误差。 L 2 L^2 L2 误差衡量的是函数在一个区间上的平均平方误差,是一种全局误差度量。
分片线性插值函数的 L 2 L^2 L2 误差分析
L 2 L^2 L2 误差定义
对于一个函数 f ( x ) f(x) f(x) 和其近似 L ( x ) L(x) L(x) (如分片线性插值函数), L 2 L^2 L2误差定义为函数 f ( x ) f(x) f(x)和 L ( x ) L(x) L(x)在整个区间上的平方误差的积分,即:
E L 2 = ( ∫ a b ( f ( x ) − L ( x ) ) 2 d x ) 1 / 2 E_{L^2} = \left( \int_a^b (f(x) - L(x))^2 \, dx \right)^{1/2} EL2=(∫ab(f(x)−L(x))2dx)1/2
其中, [ a , b ] [a, b] [a,b] 是函数定义的区间。
分片线性插值的误差函数
假设我们在区间 [ x i , x i + 1 ] [x_i, x_{i+1}] [xi,xi+1]上进行分片线性插值,误差函数 E ( x ) E(x) E(x) 可以用泰勒展开表示为:
E ( x ) = f ( x ) − L ( x ) ≈ f ′ ′ ( ξ ) 2 ( x − x i ) ( x − x i + 1 ) E(x) = f(x) - L(x) \approx \frac{f''(\xi)}{2} (x - x_i)(x - x_{i+1}) E(x)=f(x)−L(x)≈2f′′(ξ)(x−xi)(x−xi+1)
其中, ξ \xi ξ 是 x i x_i xi 和 x i + 1 x_{i+1} xi+1 之间的某个点。
L 2 L^2 L2误差分析步骤
我们将在每个子区间 [ x i , x i + 1 ] [x_i, x_{i+1}] [xi,xi+1] 上计算误差的平方,然后进行积分,并将这些积分结果累加起来得到整个区间的 L 2 L^2 L2 误差。
- 平方误差:
首先计算平方误差 E 2 ( x ) E^2(x) E2(x):
E 2 ( x ) ≈ ( f ′ ′ ( ξ ) 2 ( x − x i ) ( x − x i + 1 ) ) 2 = ( f ′ ′ ( ξ ) ) 2 4 ( x − x i ) 2 ( x − x i + 1 ) 2 E^2(x) \approx \left( \frac{f''(\xi)}{2} (x - x_i)(x - x_{i+1}) \right)^2 = \frac{(f''(\xi))^2}{4} (x - x_i)^2 (x - x_{i+1})^2 E2(x)≈(2f′′(ξ)(x−xi)(x−xi+1))2=4(f′′(ξ))2(x−xi)2(x−xi+1)2
- 积分:
在区间 [ x i , x i + 1 ] [x_i, x_{i+1}] [xi,xi+1]上对平方误差进行积分:
∫ x i x i + 1 E 2 ( x ) d x = ( f ′ ′ ( ξ ) ) 2 4 ∫ x i x i + 1 ( x − x i ) 2 ( x − x i + 1 ) 2 d x \int_{x_i}^{x_{i+1}} E^2(x) \, dx = \frac{(f''(\xi))^2}{4} \int_{x_i}^{x_{i+1}} (x - x_i)^2 (x - x_{i+1})^2 \, dx ∫xixi+1E2(x)dx=4(f′′(ξ))2∫xixi+1(x−xi)2(x−xi+1)2dx
- 简化积分:
将积分进行变化,将变量 x x x 换为 t t t,其中 t = x − x i h t = \frac{x - x_i}{h} t=hx−xi, h = x i + 1 − x i h = x_{i+1} - x_i h=xi+1−xi 是子区间的长度:
x
=
x
i
+
t
h
x = x_i + t h
x=xi+th
d
x
=
h
d
t
dx = h \, dt
dx=hdt
积分的限变为 0 到 1:
∫ x i x i + 1 ( x − x i ) 2 ( x − x i + 1 ) 2 d x = h 5 ∫ 0 1 t 2 ( 1 − t ) 2 d t \int_{x_i}^{x_{i+1}} (x - x_i)^2 (x - x_{i+1})^2 \, dx = h^5 \int_0^1 t^2 (1 - t)^2 \, dt ∫xixi+1(x−xi)2(x−xi+1)2dx=h5∫01t2(1−t)2dt
计算这个积分:
∫ 0 1 t 2 ( 1 − t ) 2 d t = 1 30 \int_0^1 t^2 (1 - t)^2 \, dt = \frac{1}{30} ∫01t2(1−t)2dt=301
因此,积分结果为:
∫ x i x i + 1 ( x − x i ) 2 ( x − x i + 1 ) 2 d x = h 5 30 \int_{x_i}^{x_{i+1}} (x - x_i)^2 (x - x_{i+1})^2 \, dx = \frac{h^5}{30} ∫xixi+1(x−xi)2(x−xi+1)2dx=30h5
- 平方误差积分:
∫ x i x i + 1 E 2 ( x ) d x = ( f ′ ′ ( ξ ) ) 2 4 ⋅ h 5 30 = ( f ′ ′ ( ξ ) ) 2 h 5 120 \int_{x_i}^{x_{i+1}} E^2(x) \, dx = \frac{(f''(\xi))^2}{4} \cdot \frac{h^5}{30} = \frac{(f''(\xi))^2 h^5}{120} ∫xixi+1E2(x)dx=4(f′′(ξ))2⋅30h5=120(f′′(ξ))2h5
- 全局 L 2 L^2 L2误差:
将每个子区间的误差积分累加得到整个区间的 L 2 L^2 L2 误差平方:
E L 2 2 = ∑ i ( f ′ ′ ( ξ i ) ) 2 h i 5 120 E_{L^2}^2 = \sum_{i} \frac{(f''(\xi_i))^2 h_i^5}{120} EL22=i∑120(f′′(ξi))2hi5
由于每个区间 h i h_i hi大小不等,我们可以假设所有子区间长度大致相同,即 h i ≈ h h_i \approx h hi≈h:
E L 2 2 ≈ h 5 120 ∑ i ( f ′ ′ ( ξ i ) ) 2 E_{L^2}^2 \approx \frac{h^5}{120} \sum_{i} (f''(\xi_i))^2 EL22≈120h5i∑(f′′(ξi))2
因为 f ′ ′ ( ξ ) f''(\xi) f′′(ξ)是在每个子区间上的某个值,我们可以用 ∥ f ′ ′ ∥ ∞ \|f''\|_\infty ∥f′′∥∞ 来近似表示最大值:
E L 2 2 ≈ h 5 120 ∥ f ′ ′ ∥ ∞ 2 ∑ i 1 E_{L^2}^2 \approx \frac{h^5}{120} \| f'' \|_\infty^2 \sum_{i} 1 EL22≈120h5∥f′′∥∞2i∑1
区间总长度 b − a b - a b−a 被分为 N N N 个子区间:
N ≈ b − a h N \approx \frac{b - a}{h} N≈hb−a
因此, L 2 L^2 L2 误差平方为:
E L 2 2 ≈ h 4 ( b − a ) 120 ∥ f ′ ′ ∥ ∞ 2 E_{L^2}^2 \approx \frac{h^4 (b - a)}{120} \| f'' \|_\infty^2 EL22≈120h4(b−a)∥f′′∥∞2
取平方根得到 L 2 L^2 L2 误差:
E L 2 ≈ ( h 4 ( b − a ) 120 ) 1 / 2 ∥ f ′ ′ ∥ ∞ E_{L^2} \approx \left( \frac{h^4 (b - a)}{120} \right)^{1/2} \| f'' \|_\infty EL2≈(120h4(b−a))1/2∥f′′∥∞
E L 2 ≈ C h 2 E_{L^2} \approx C h^2 EL2≈Ch2
其中 C = ( ( b − a ) 120 ) 1 / 2 ∥ f ′ ′ ∥ ∞ C = \left( \frac{(b - a)}{120} \right)^{1/2} \| f'' \|_\infty C=(120(b−a))1/2∥f′′∥∞ 是与函数的二阶导数和区间长度相关的常数。
总结
通过分析我们可以得出,对于分片线性插值, L 2 L^2 L2 误差的阶数是二阶 O ( h 2 ) O(h^2) O(h2)。这意味着当我们将插值点之间的间隔 h h h 减半时, L 2 L^2 L2 误差大约会减少四分之一。
图示与验证
为了验证这一结论,我们可以通过实际计算和绘图来展示分片线性插值的 L 2 L^2 L2 误差。
示例代码
import numpy as np
import matplotlib.pyplot as plt
# 定义函数和区间
def f(x):
return np.sin(x)
a, b = 0, np.pi
x_fine = np.linspace(a, b, 1000)
y_fine = f(x_fine)
# 计算L2误差
def compute_l2_error(n_points):
x = np.linspace(a, b, n_points)
y = f(x)
y_interp = np.interp(x_fine, x, y)
error = np.sqrt(np.trapz((y_fine - y_interp) ** 2, x_fine))
return error
# 不同点数的L2误差
n_points_list = [5, 10, 20, 40, 80, 160]
errors = [compute_l2_error(n) for n in n_points_list]
# 绘制误差与点数的关系
plt.loglog(n_points_list, errors, '-o', label='L2误差')
plt.loglog(n_points_list, [errors[0] * (n_points_list[0]/n)**2 for n in n_points_list], '--', label='理论 $O(h^2)$')
plt.xlabel('插值点数')
plt.ylabel('L2误差')
plt.title('分片线性插值的L2误差分析')
plt.legend()
plt.grid(True, which='both', linestyle='--')
plt.show()
该代码绘制了插值点数与 L 2 L^2 L2 误差之间的关系。通过比较实际误差和理论误差 O ( h 2 ) O(h^2) O(h2),可以看到两者符合得很好,验证了 L 2 L^2 L2 误差的阶数是 O ( h 2 ) O(h^2) O(h2)。