分片线性插值函数的L^2误差分析

在数值分析和数值逼近中,除了最大误差(或无穷范数误差)外,另一种常用的误差度量方法是 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′′(ξ)(xxi)(xxi+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 误差。

  1. 平方误差:

首先计算平方误差 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′′(ξ)(xxi)(xxi+1))2=4(f′′(ξ))2(xxi)2(xxi+1)2

  1. 积分:

在区间 [ 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′′(ξ))2xixi+1(xxi)2(xxi+1)2dx

  1. 简化积分:

将积分进行变化,将变量 x x x 换为 t t t,其中 t = x − x i h t = \frac{x - x_i}{h} t=hxxi h = x i + 1 − x i h = x_{i+1} - x_i h=xi+1xi 是子区间的长度:

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(xxi)2(xxi+1)2dx=h501t2(1t)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(1t)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(xxi)2(xxi+1)2dx=30h5

  1. 平方误差积分:

∫ 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′′(ξ))230h5=120(f′′(ξ))2h5

  1. 全局 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=i120(f′′(ξi))2hi5

由于每个区间 h i h_i hi大小不等,我们可以假设所有子区间长度大致相同,即 h i ≈ h h_i \approx h hih

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 EL22120h5i(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 EL22120h5f′′2i1

区间总长度 b − a b - a ba 被分为 N N N 个子区间:

N ≈ b − a h N \approx \frac{b - a}{h} Nhba

因此, 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 EL22120h4(ba)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(ba))1/2f′′

E L 2 ≈ C h 2 E_{L^2} \approx C h^2 EL2Ch2

其中 C = ( ( b − a ) 120 ) 1 / 2 ∥ f ′ ′ ∥ ∞ C = \left( \frac{(b - a)}{120} \right)^{1/2} \| f'' \|_\infty C=(120(ba))1/2f′′ 是与函数的二阶导数和区间长度相关的常数。

总结

通过分析我们可以得出,对于分片线性插值, 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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值