【数学与算法】【分段三次Hermite插值】和【分段三次样条插值】
光滑曲线在数学上的定义是什么??原文链接:光滑曲线在数学上的定义是什么?回答1:定义:切线随切点的移动而连续转动。若函数f(x)f(x)f(x)在区间(a,b)(a,b)(a,b)内具有一阶连续导数,则其图形为一条处处有切线的曲线。则为光滑曲线。简言之,若f′(x)f'(x)f′(x)连续,则曲线光滑。但反之,不成立。比如圆,圆在直角坐标系下,有两条竖直的切线,导数不存在(为∞大)。回答2:不敢保
光滑曲线在数学上的定义是什么??
原文链接:光滑曲线在数学上的定义是什么?
回答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丨 y=丨x丨在 x = 0 x=0 x=0处就很尖锐。 y = x 2 y=x^2 y=x2在 x = 0 x=0 x=0处是一段曲线,看上去用手摸了不会扎手。
- 2.存在切线,就是在一点附近,曲线无限接近于一条直线。曲线被磨平了,只有这样,才不扎手。要求切线随着点连续转动,就是表达曲线不会一下子过度太快,无限接近的两点形状无限接近。
至于判断,先直观想象图像,再证明。
求一次导,相当于把函数的变化过程放大一次。因此严格的光滑定义要求无限阶可导,也就是不管怎么拉大拉平,都是不扎手。
分段差值:
分段插值: 通常可能指的是直接分段低次线插, 通俗来说 这样出来的线条不是很平滑. 因为在节点上不一定可导.
直接hermite插值就和一楼说的差不多三次样条与分段 Hermite 插值的根本区别在于S(x)自身光滑(考虑了二阶倒数),不需要知道 f 的导数值(除了在2个端点可能需要);
而Hermite插值依赖于f 在所有插值点的导数值。(S(x)为插值基函数,f为你要插值的函数)
分段三次埃尔米特插值:
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+b∗x+c∗x2+d∗x3都有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
x0、x1、x2处的导数。即
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(x−xi)+ci(x−xi)2+di(x−xi)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=(ai−bixi+cixi2−dixi3)+(bi−2cixi+3dixi2)x+(ci−3dixi)x2+dix3
所以两种形式的写法都对,最终求出来的
a
i
、
b
i
、
c
i
、
d
i
a_i、b_i、c_i、d_i
ai、bi、ci、di虽然是不同的值,但是最终的表达式肯定是一样的。因为第二种写法的
a
i
、
b
i
、
c
i
、
d
i
a_i、b_i、c_i、d_i
ai、bi、ci、di并不是真正的系数,不过第二种写法在推导数学公式时很方便。
有点类似于我们小学时候学的 y = k x + b y=kx+b y=kx+b和 y − y i = k ( x − x i ) y-y_i=k(x-x_i) y−yi=k(x−xi)的样子,都是两种表示方法。
对于分段三次样条插值,就比分段三次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):x1处一阶导数值相等S0′′(x1)=S1′′(x1):x1处二阶导数相等
然后再利用三类边界条件
中的其中一种边界条件,即可以从两个端点
x
0
、
x
2
\color{blue}x_0、x_2
x0、x2处再得到两个方程。
三类边界条件:
用下面的解释更容易明白:
例如一系列节点
x
0
、
x
1
、
.
.
.
.
.
.
、
x
n
−
1
、
x
n
\color{blue}x_0、x_1、......、x_{n-1}、x_n
x0、x1、......、xn−1、xn,其中
x
0
、
x
n
\color{blue}x_0、x_n
x0、xn是两个端点(也叫边界点),三类边界条件如下:
- 自然边界:
两个端点即边界点的二阶导
都为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′′(xn−1)=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′(xn−1)=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′′′(xn−1)=Sn′′′(xn)。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)