# 导入math模块,用于数学计算
import math
# 导入numpy模块,用于科学计算,特别是多维数组操作
import numpy as np
# 导入matplotlib.pyplot模块,用于数据可视化
import matplotlib.pyplot as plt
插值法概念与性质
概念
插值法(Interpolation) 是一种在数学和计算机科学中广泛应用的数值分析方法。其基本思想是通过已知的一组离散的数据点(通常称为节点或样本点),构建一个函数(称为插值函数),使得这个函数能够恰好通过所有这些数据点。换句话说,插值法旨在找到一个函数 f ( x ) f(x) f(x),它在给定的节点 x i x_i xi处的值与已知的数据值 y i y_i yi相匹配,即满足条件 f ( x i ) = y i , i = 1 , 2 , . . . , n f(x_i) = y_i, i = 1, 2, ..., n f(xi)=yi,i=1,2,...,n。这种方法常用于估计或恢复在两个或多个已知数据点之间的数据值。
常见插值方法
- 线性插值:最简单的一种插值方法,适用于两个数据点之间。通过直线连接这两个点来估计区间内的任意值。
- 多项式插值:包括拉格朗日插值、牛顿插值等,其中最常用的是拉格朗日插值法,通过构造一个n次多项式来精确通过n+1个数据点。
- 样条插值:如自然 cubic spline(三次样条插值)、Hermite 插值等,这类方法在保证通过所有数据点的同时,还考虑了平滑度等特性,通常用于要求导数连续的场景。
- 其他高级插值方法:如径向基函数插值、样条插值的变种等,它们在特定领域有更优的表现。
性质
- 精确性:理想的插值函数应精确通过所有给定的数据点,这是插值的基本要求。
- 连续性:插值函数在其定义域内应当是连续的。对于多项式插值和样条插值,通常还能保证一定阶数的导数连续。
- 光滑性:良好的插值方法应使得插值函数在数据点间变化平滑,避免出现不必要的波动或尖点。
- 稳定性:对于数据的小变动,插值结果应具有稳定性,即输入数据的微小变化不应导致输出结果发生剧烈变化。
- 计算复杂度:不同的插值方法在计算上有着不同的复杂度,选择时需考虑实际应用场景对计算效率的需求。
- 过拟合风险:特别是在使用高阶多项式插值时,虽然能完美匹配数据点,但可能在节点间产生大幅震荡,这被称为过拟合现象,影响预测的准确性。
在大致了解了基础概念后我们将插值分为了下面大致几类来介绍:
- 标准多项式插值
- 拉格朗日插值法
- 牛顿插值法
- 埃尔米特插值法
- 分段线性插值
- 样条插值
标准多项式插值:
我们现在有n+1个样本点对,我们需要去寻找一个多项式 f ( x ) ∈ P n f(x) \in \mathcal{P}_n f(x)∈Pn,使得 f ( x i ) = y i f(x_i) = y_i f(xi)=yi,其中 ( x i , y i ) (x_i,y_i) (xi,yi)为样本点。
f ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n , ∀ x ∈ { x i } f(x) = a_0 + a_1x + a_2x^2 + \cdots + a_nx^n,\forall x \in \{x_i\} f(x)=a0+a1x+a2x2+⋯+anxn,∀x∈{
xi}
因此,我们将上式展开并写为矩阵形式,可以得到如下结果:
A = ( 1 x 0 x 0 2 ⋯ x 0 n 1 x 1 x 1 2 ⋯ x 1 n ⋮ 1 x n x n 2 ⋯ x n n ) , x = ( a 0 a 1 ⋮ a n ) , b = ( y 0 y 1 ⋮ y n ) A x = b A = \begin{pmatrix} 1 \quad x_0 \quad x_0^2 \quad \cdots \quad x_0^n \\ 1 \quad x_1 \quad x_1^2 \quad \cdots \quad x_1^n \\ \vdots \\ 1 \quad x_n \quad x_n^2 \quad \cdots \quad x_n^n \\ \end{pmatrix} , x = \begin{pmatrix} a_0 \\ a_1 \\ \vdots \\ a_n \\ \end{pmatrix} , b = \begin{pmatrix} y_0 \\ y_1 \\ \vdots \\ y_n \\ \end{pmatrix} \\ Ax = b A=⎝⎜⎜⎜⎛1x0x02⋯x0n1x1x12⋯x1n⋮1xnxn2⋯xnn⎠⎟⎟⎟⎞,x=⎝⎜⎜⎜⎛a0a1⋮an⎠⎟⎟⎟⎞,b=⎝⎜⎜⎜⎛y0y1⋮yn⎠⎟⎟⎟⎞Ax=b
∵ ∥ A ∥ = ∣ 1 x 0 x 0 2 ⋯ x 0 n 1 x 1 x 1 2 ⋯ x 1 n ⋮ 1 x n x n 2 ⋯ x n n ∣ \because \|A\| = \begin{vmatrix} 1 \quad x_0 \quad x_0^2 \quad \cdots \quad x_0^n \\ 1 \quad x_1 \quad x_1^2 \quad \cdots \quad x_1^n \\ \vdots \\ 1 \quad x_n \quad x_n^2 \quad \cdots \quad x_n^n \\ \end{vmatrix} ∵∥A∥=∣∣∣∣∣∣∣∣∣1x0x02⋯x0n1x1x12⋯x1n⋮1xnxn2⋯xnn∣∣∣∣∣∣