方程组的求解本文不做介绍。

一、三次样条插值

1. 定义

        三次样条插值(Cublic Spline Interpolation),简称 Spline 插值,是通过一系列样本点的光滑曲线,数学上通过求解三弯矩方程组得出曲线函数组。

        (参考:三次样条插值

2. 解决什么问题?

        通过采集数据,通常有两种做法:拟合或差值。拟合不要求曲线通过所有的样本点,讲究神似,即整体趋势一致;插值讲究形似,即要求曲线穿过每个样本点。插值生成的高阶曲线很容易出现龙格库塔现象,所以一般采用分段插值。三次样条插值就是分段插值的一种方式。

二、原理详解

        假设在区间 [a, b] 上有 n+1 个样本点,即 [a, b] 区间被划分成 n 个区间 \left [ (x_{0}, x_{1}), (x_{1}, x_{2}), ..., (x_{n-1}, x_{n}) \right ],其中两个端点 x_{0}=a, x_{n}=b,则有如下:

1. 三次样条方程条件

(1)在每个分段区间上,插值函数都是一个三次方程;

(2)满足插值条件,即每个样本点都被某段插值函数穿过;

(3)曲线光滑,即插值函数二阶及二阶以下导函数连续。

        如果 S(x) 是 f(x) 的三次样条插值函数,则必须满足:

        (1)插值条件:S(x^{_{j}})=y_{j}, j=0, 1, ..., n

        (2)连续性条件:\lim_{x\rightarrow x_{j}}S(x)=S(x_{j})=y_{j}, j=1, 2, ..., n-1

        (3)一阶导数连续条件:\lim_{x\rightarrow x_{j}}S^{​{}'}(x)=S{}'(x_{j})=m_{j}, j=1, 2, ..., n-1

        (4)二阶导数连续条件:\lim_{x\rightarrow x_{j}}S^{​{}''}(x)=S{}''(x_{j}), j=1, 2, ..., n-1

        (参考:三次样条插值算法详解.ppt

2. 三次样条方程组

        每个子区间内有 4 个未知数,一共有 n 个区间,所以一共有 4n 个未知数需要求解,则至少需要 4n 个约束条件。

(1)一阶导数连续

        除了两个端点,所有 n-1 个内部点的一阶导数连续,即左右两个三次函数的一阶导数在当前样本点处的值相等,即满足 S{}'_{i}(x_{i+1})=S{}'_{i+1}(x_{i+1}),共有 n-1 个方程。

(2)二阶导数连续​​​​​​​

        除了两个端点,所有 n-1 个内部点的二阶导数连续,即左右两个三次函数的二阶导数在当前样本点处的值相等,即满足 S{}''_{i}(x_{i+1})=S{}''_{i+1}(x_{i+1}),共有 n-1 个方程。

(3)每个样本点处连续

        a. 除了两个端点,所有 n-1 个内部点都满足 S_{i}(x_{i+1})=y_{i+1}=S_{i+1}(x_{i+1}),共有 2(n-1) 个方程;

        b. 两个端点分别满足第一个和最后一个三次函数方程,共有 2 个方程。

(4)边界条件

        以上三个条件共有 4n-2 个限制条件了,还差 2 个条件即可求解方程参数,这两个方程我们通过边界条件得到。

        有三种边界条件:自然边界、固定边界、非节点处边界。

        自然边界:端点二阶导数为零,即 S{}''(x_{0})=0=S{}''(x_{n})

        (参考:三次样条(cubic spline)插值

三、和线性插值对比

(1)线性插值

        平面上两个点可以确定一条直线,这就是线性插值的原理。所以线性插值生成的曲线是折线,即每相邻两点之间均是直线。

        缺点:曲线不够光滑,会导致函数的一阶导函数不连续。

        Matlab 命令是 interp1。

        (参考:MATLAB插值函数interp1

        (参考:interp1

(2)三次样条插值

        三次样条插值是用三次函数曲线来代替线性插值的直线,即每相邻两点之间均是表达式为 ax^{3}+bx^{2}+cx+d 的三次函数曲线。

        Matlab 命令是 spline。

        优点:高次插值不收敛且不稳定;低次插值既收敛又稳定,但是低次插值光滑性差,如分段线性插值一阶导数不存在。总之,m 次样条函数最优。

        (参考:三次样条插值法

        (参考:spline

        (参考:三次样条插值算法详解.ppt

        (参考:Matlab数值分析实例:三次样条插值

        (参考:Python实现线性插值和三次样条插值

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐