【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】

光滑曲线在数学上的定义是什么??

原文链接:光滑曲线在数学上的定义是什么?

回答1:
定义:切线随切点的移动而连续转动。

若函数 f ( x ) f(x) f(x)在区间 ( a , b ) (a,b) (a,b)内具有一阶连续导数,则其图形为一条处处有切线的曲线。则为光滑曲线。简言之,若 f ′ ( x ) f'(x) f(x)连续,则曲线光滑。

但反之,不成立。比如圆,圆在直角坐标系下,有两条竖直的切线,导数不存在(为∞大)。

回答2:
不敢保证对。但同纠结这个问题,想了许久,有点心得,拿来探讨。希望有缘破解心中迷雾:

  • 1.光滑,从直观上是不突兀,流线的。台阶本质上是折线,因此在转折处感觉尖锐,突兀,是为不光滑。例如 y = 丨 x 丨 y=丨x丨 yx x = 0 x=0 x0处就很尖锐。 y = x 2 y=x^2 yx2 x = 0 x=0 x0处是一段曲线,看上去用手摸了不会扎手。
  • 2.存在切线,就是在一点附近,曲线无限接近于一条直线。曲线被磨平了,只有这样,才不扎手。要求切线随着点连续转动,就是表达曲线不会一下子过度太快,无限接近的两点形状无限接近。

至于判断,先直观想象图像,再证明。

求一次导,相当于把函数的变化过程放大一次。因此严格的光滑定义要求无限阶可导,也就是不管怎么拉大拉平,都是不扎手。


分段差值:

分段插值: 通常可能指的是直接分段低次线插, 通俗来说 这样出来的线条不是很平滑. 因为在节点上不一定可导.
直接hermite插值就和一楼说的差不多三次样条与分段 Hermite 插值的根本区别在于S(x)自身光滑(考虑了二阶倒数),不需要知道 f 的导数值(除了在2个端点可能需要);
而Hermite插值依赖于f 在所有插值点的导数值。(S(x)为插值基函数,f为你要插值的函数)

在这里插入图片描述

分段三次埃尔米特插值:

可以参考:数值分析(4)-多项式插值: 埃尔米塔插值法
【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】_第1张图片

Hermite 插值就是要求插值函数不仅经过所给节点,而且要保证在该点的导数也相等。

以3个点为例,想要使用分段3次Hermite 插值求出这三个点的插值函数:
分析一下,每一段三次hermite插值多项式 f ( x ) = a + b ∗ x + c ∗ x 2 + d ∗ x 3 \color{blue}f(x)=a+b*x+c*x^2+d*x^3 f(x)=a+bx+cx2+dx3都有4个未知系数需要求解,三个点就是两段,那么就有2*4=8个未知数。8个未知数,就需要联立8元一次方程组,需要8个方程:
S 0 ( x 0 ) = y 0 S 0 ( x 1 ) = y 1 S 1 ( x 1 ) = y 1 S 1 ( x 2 ) = y 2 S 0 ′ ( x 1 ) = S 1 ′ ( x 1 ) : 一 阶 导 数 值 相 等 \color{blue} S_0(x_0)=y_0 \\ S_0(x_1)=y_1 \\ S_1(x_1)=y_1 \\ S_1(x_2)=y_2\\ S_0'(x_1)=S_1'(x_1) :一阶导数值相等 S0(x0)=y0S0(x1)=y1S1(x1)=y1S1(x2)=y2S0(x1)=S1(x1)
上面有5个方程,还差3个方程,这三个方程从定义中可知,需要知道每个点 x 0 、 x 1 、 x 2 \color{blue}x_0、x_1、x_2 x0x1x2处的导数。即 S 0 ′ ( x 0 ) 、 S 1 ′ ( x 1 ) 、 S 1 ′ ( x 2 ) \color{blue}S_0'(x_0)、S_1'(x_1)、S_1'(x_2) S0(x0)S1(x1)S1(x2)的导数值必须已知,但是实际工程中是不太可能知道每个点的导数值的。因为,你连原函数都不知道,怎么能知道导数值呢?

总结一下:Hermite插值在实际使用的时候没有多大意义,同时知道点和导数,还假装不知道原函数的情况,不多(PS:都知道导数了有什么计算的必要?)

所以,一般用牛顿,牛顿大法好!

分段三次样条插值:

推荐参考【三次样条(cubic spline)插值】
可以参考【数值分析(5)-分段低次插值和样条插值】

三次多项式有两种形式,很自然的,我们会想到第一种,如下:

y = a i + b i x + c i x 2 + d i x 3 (1) y=a_i+b_ix+c_ix^2+d_ix^3 \tag{1} y=ai+bix+cix2+dix3(1)
我们还有第二种写法,下面的曲线表达式经过 ( x i , y i ) (x_i,y_i) (xi,yi)
y = a i + b i ( x − x i ) + c i ( x − x i ) 2 + d i ( x − x i ) 3 (2) y=a_i+b_i(x-x_i)+c_i(x-x_i)^2+d_i(x-x_i)^3 \tag{2} y=ai+bi(xxi)+ci(xxi)2+di(xxi)3(2)
把上面(2)这个展开后,变成了:
y = ( a i − b i x i + c i x i 2 − d i x i 3 ) + ( b i − 2 c i x i + 3 d i x i 2 ) x + ( c i − 3 d i x i ) x 2 + d i x 3 y=\color{blue}(a_i-b_ix_i+c_ix_i^2-d_ix_i^3)+\color{red}(b_i-2c_ix_i+3d_ix_i^2)x+\color{green}(c_i-3d_ix_i)x^2+\color{brown}d_ix^3 y=(aibixi+cixi2dixi3)+(bi2cixi+3dixi2)x+(ci3dixi)x2+dix3
所以两种形式的写法都对,最终求出来的 a i 、 b i 、 c i 、 d i a_i、b_i、c_i、d_i aibicidi虽然是不同的值,但是最终的表达式肯定是一样的。因为第二种写法的 a i 、 b i 、 c i 、 d i a_i、b_i、c_i、d_i aibicidi并不是真正的系数,不过第二种写法在推导数学公式时很方便。

有点类似于我们小学时候学的 y = k x + b y=kx+b y=kx+b y − y i = k ( x − x i ) y-y_i=k(x-x_i) yyi=k(xxi)的样子,都是两种表示方法。

对于分段三次样条插值,就比分段三次hermite多项式插值多了一个条件,即各点的二阶导数相等。还是以三个点为例:
S 0 ( x 0 ) = y 0 S 0 ( x 1 ) = y 1 S 1 ( x 1 ) = y 1 S 1 ( x 2 ) = y 2 S 0 ′ ( x 1 ) = S 1 ′ ( x 1 ) : x 1 处 一 阶 导 数 值 相 等 S 0 ′ ′ ( x 1 ) = S 1 ′ ′ ( x 1 ) : x 1 处 二 阶 导 数 相 等 \color{blue} S_0(x_0)=y_0\\ S_0(x_1)=y_1\\ S_1(x_1)=y_1\\ S_1(x_2)=y_2\\ S_0'(x_1)=S_1'(x_1) :x_1处一阶导数值相等\\ S_0''(x_1)=S_1''(x_1):x_1处二阶导数相等 S0(x0)=y0S0(x1)=y1S1(x1)=y1S1(x2)=y2S0(x1)=S1(x1)x1S0(x1)=S1(x1)x1
然后再利用三类边界条件中的其中一种边界条件,即可以从两个端点 x 0 、 x 2 \color{blue}x_0、x_2 x0x2处再得到两个方程。

三类边界条件:

【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】_第2张图片
用下面的解释更容易明白:
例如一系列节点 x 0 、 x 1 、 . . . . . . 、 x n − 1 、 x n \color{blue}x_0、x_1、......、x_{n-1}、x_n x0x1......xn1xn,其中 x 0 、 x n \color{blue}x_0、x_n x0xn是两个端点(也叫边界点),三类边界条件如下:

  • 自然边界:
    两个端点即边界点的二阶导都为0;
    S 0 ′ ′ ( x 0 ) = 0 \color{blue}S_0''(x_0)=0 S0(x0)=0
    S n ′ ′ ( x n − 1 ) = 0 \color{blue}S_n''(x_{n-1})=0 Sn(xn1)=0
  • 夹持边界:
    由边界点一阶导数给定,例如分别给两个边界点的一阶导数设定为 A \color{blue}A A B \color{blue}B B
    S 0 ′ ( x 0 ) = A \color{blue}S_0'(x_0)=A S0(x0)=A
    S n ′ ( x n − 1 ) = B \color{blue}S_n'(x_{n-1})=B Sn(xn1)=B
  • 非扭结边界:
    使两个边界端点的三阶导与这两端点的邻近点的三阶导相等。那么令
    S 0 ′ ′ ′ ( x 0 ) = S 0 ′ ′ ′ ( x 1 ) \color{blue}S_0'''(x_0)=S_0'''(x_1) S0(x0)=S0(x1)
    S n ′ ′ ′ ( x n − 1 ) = S n ′ ′ ′ ( x n ) \color{blue}S_n'''(x_{n-1})=S_n'''(x_n) Sn(xn1)=Sn(xn)

你可能感兴趣的:(数学和算法,插值)