数值分析复习:样条插值

本篇文章适合个人复习翻阅,不建议新手入门使用

样条插值

1.Euler-Bernoulli梁

我们考虑水平长横梁发生微小形变的问题,主要研究 Euler-Bernoulli 梁,这一环节我们的总目标是证明 Euler-Bernoulli 梁的数学模型为弯矩等于挠度的二阶导

1.1 弹性力学的基本概念

定义: Euler-Bernoulli 梁
现有一个细长横梁,其均匀且各向同性,若横梁在弯曲过程中横截面始终垂直于中性轴(Neutral axis),则称这个横梁为 Euler-Bernoulli 梁
E-B梁示意图

定义:挠度
假设横梁水平并纵向弯曲,横梁弯曲时一点产生的位移称为该点的挠度,记为 y ( x ) y(x) y(x)

称横梁形变时内部产生的力为内力,可以将内力分解如下:

定义:内力的分解
在平面杆件的任意截面上一般有三个内力分量:轴力 F N F_N FN,剪力 F Q F_Q FQ,弯矩 M M M;其定义如下

  1. 截面上应力沿杆轴切线方向的合力,称为轴力 F N F_N FN,规定轴力以拉为正,以压为负
  2. 截面上应力沿杆轴法线方向的合力,称为剪力 F Q F_Q FQ,规定剪力以绕微端隔离体顺时针旋转为正,反之为负
  3. 截面上应力对截面形心的力矩称为弯矩 M M M,方向垂直于梁的中性轴,大小等于法应力在该截面上的合力乘以截面到中性轴的距离。在水平杆件中,规定当弯矩使杆件下部受拉时,弯矩为正,当弯矩使杆件上部受拉时,弯矩为负
    轴力,剪力,弯矩方向示意图

接下来定义应力,即单位面积的内力

定义:应力
根据物体连续性的假设,可认为作用在微小面 Δ S \Delta S ΔS 上的力是连续分布的,内力 Δ P \Delta P ΔP 是这个分布力的合力,则称
F ν = lim ⁡ Δ S → 0 Δ P Δ S F_{\nu}=\lim\limits_{\Delta S\to 0}\frac{\Delta P}{\Delta S} Fν=ΔS0limΔSΔP为应力, ν \nu ν 表示微分面的法向

定义:应力张量
记应力的各分量如下

  1. x 方向上的正向应力 σ x x \sigma_{xx} σxx
  2. x 为法向的平面中,y 方向的剪切应力 τ x y \tau_{xy} τxy
  3. x 为法向的平面中,z 方向的剪切应力 τ x z \tau_{xz} τxz
  4. y 为法向的平面中,x 方向的剪切应力 τ y x \tau_{yx} τyx
  5. y 方向上的正向应力 σ y y \sigma_{yy} σyy
  6. y 为法向的平面中,z 方向的剪切应力 τ y z \tau_{yz} τyz
  7. z 为法向的平面中,x 方向的剪切应力 τ z x \tau_{zx} τzx
  8. z 为法向的平面中,y 方向的剪切应力 τ z y \tau_{zy} τzy
  9. z 方向上的正向应力 σ z z \sigma_{zz} σzz

这些元素描述了在三个不同的坐标轴方向上的正向应力和剪切应力。称如下的矩阵为应力张量
( σ x x τ x y τ x z τ y x σ y y τ y z τ z x τ z y σ z z ) \begin{pmatrix} \sigma_{xx}&\tau_{xy}&\tau_{xz}\\ \tau_{yx}&\sigma_{yy}&\tau_{yz}\\ \tau_{zx}&\tau_{zy}&\sigma_{zz} \end{pmatrix} σxxτyxτzxτxyσyyτzyτxzτyzσzz

下面我们用应变描述横梁弯曲时小微元的空间变化量

定义:应变
根据物体连续性的假设,要求变形前连续的物体在变形后仍保持为连续体,物体 D D D 内一点 P P P 经变形后移到 D 1 D_1 D1 P 1 P_1 P1 的位移在三个坐标轴上的分量分别用 u , v , w u,v,w u,v,w 表示
正应变定义为棱边的伸长变化
ε x = ∂ u ∂ x , ε y = ∂ v ∂ y , ε z = ∂ w ∂ z \varepsilon_x=\frac{\partial u}{\partial x},\varepsilon_y=\frac{\partial v}{\partial y},\varepsilon_z=\frac{\partial w}{\partial z} εx=xu,εy=yv,εz=zw剪应变定义为棱边间夹角的变化
γ x y = ∂ v ∂ x + ∂ u ∂ y \gamma_{xy}=\frac{\partial v}{\partial x}+\frac{\partial u}{\partial y} γxy=xv+yu γ x z = ∂ u ∂ z + ∂ w ∂ x \gamma_{xz}=\frac{\partial u}{\partial z}+\frac{\partial w}{\partial x} γxz=zu+xw γ y z = ∂ v ∂ z + ∂ w ∂ y \gamma_{yz}=\frac{\partial v}{\partial z}+\frac{\partial w}{\partial y} γyz=zv+yw

1.2 Euler-Bernoulli梁的应力与应变

我们取横梁中的一小部分,将其原位置和弯曲变形后的位置画图如下
局部模型

由图看出, w w w 是挠度,容易求出应变 ε x \varepsilon_x εx
u 1 = u − z d w d x u_1=u-z\frac{\mathrm{d}w}{\mathrm{d}x} u1=uzdxdw ε x = ∂ u 1 ∂ x = d u d x − z d 2 w d x 2 \varepsilon_x=\frac{\partial u_1}{\partial x}=\frac{\mathrm{d}u}{\mathrm{d}x}-z\frac{\mathrm{d}^2w}{\mathrm{d}x^2} εx=xu1=dxduzdx2d2w
由胡克定律,小微元上的应力与应变成正比,比值为杨氏模量 E,可得 x x x 方向上的应力为
σ x x = E ⋅ ε x = E d u d x − E z d 2 w d x 2 \sigma_{xx}=E\cdot \varepsilon_x=E\frac{\mathrm{d}u}{\mathrm{d}x}-Ez\frac{\mathrm{d}^2w}{\mathrm{d}x^2} σxx=Eεx=EdxduEzdx2d2w

1.3 Euler-Bernoulli梁的弯矩

设小微元 A A A z z z 表示 A A A 中的某点到中性轴的距离,根据弯矩的定义
M ( x ) = ∫ A σ x x ⋅ z d A = ∫ A E z d u d x − E z 2 d 2 w d x 2 d A = − E I d 2 w d x 2 \begin{split} M(x)&=\int_A\sigma_{xx}\cdot z\mathrm{d}A\\ &=\int_AEz\frac{\mathrm{d}u}{\mathrm{d}x}-Ez^2\frac{\mathrm{d}^2w}{\mathrm{d}x^2}\mathrm{d}A\\ &=-EI\frac{\mathrm{d}^2w}{\mathrm{d}x^2} \end{split} M(x)=AσxxzdA=AEzdxduEz2dx2d2wdA=EIdx2d2w显然 ∫ A z d A = 0 \int_Az\mathrm{d}A=0 AzdA=0,令 I = ∫ A z 2 d A I=\int_Az^2\mathrm{d}A I=Az2dA 称为面惯性矩

综上所述,我们得到结论 M ( x ) = − E I y ′ ′ ( x ) M(x)=-EIy''(x) M(x)=EIy′′(x)即在忽略常数的意义下,弯矩等于挠度的二阶导数

2. 样条函数

定义:弯曲应变能
梁在弯曲形变时会产生势能,称为弯曲应变能 W W W,设水平横梁定义在区间 [ a , b ] [a,b] [a,b]上,在忽略常数的意义下,其与弯矩的关系如下:
W = ∫ a b M 2 ( x ) d x W=\int_a^b M^2(x)\mathrm{d}x W=abM2(x)dx故在Euler-Bernoulli梁的假设下有
W = ∫ a b [ y ′ ′ ( x ) ] 2 d x W=\int_a^b [y''(x)]^2\mathrm{d}x W=ab[y′′(x)]2dx

接下来我们要刻画使得弯曲应变能最小的形变曲线,我们将其定义为三次样条

2.1 泛函极小解和三次样条函数

给定区间 [ a , b ] [a,b] [a,b] 的分划: a = x 0 < x 1 < ⋯ < x n = b a=x_0<x_1<\cdots<x_n=b a=x0<x1<<xn=b给定 y i , i = 0 , 1 , … , n , y 0 ′ , y n ′ y_i,i=0,1,\dots,n,y_0',y_n' yi,i=0,1,,n,y0,yn

Ω y = { f ( x ) : f ∈ C 2 [ a , b ] , f ( x i ) = y i , f ′ ( x 0 ) = y 0 ′ , f ′ ( x n ) = y n ′ } \Omega_y=\{f(x):f\in C^2[a,b],f(x_i)=y_i,f'(x_0)=y_0',f'(x_n)=y_n'\} Ωy={f(x):fC2[a,b],f(xi)=yi,f(x0)=y0,f(xn)=yn}

Ω 0 = { η ( x ) : η ∈ C 2 [ a , b ] , η ( x i ) = 0 , η ′ ( a ) = η ′ ( b ) = 0 } \Omega_0=\{\eta(x):\eta\in C^2[a,b],\eta(x_i)=0,\eta'(a)=\eta'(b)=0\} Ω0={η(x):ηC2[a,b],η(xi)=0,η(a)=η(b)=0}
J ( f ) = ∫ a b ( f ′ ′ ( x ) ) 2 d x J(f)=\int_a^b(f''(x))^2\mathrm{d}x J(f)=ab(f′′(x))2dx考虑如下的泛函极小问题:
S ( x ) ∈ Ω y S(x)\in \Omega_y S(x)Ωy 满足 J ( S ) = min ⁡ f ∈ Ω y J ( f ) J(S)=\min\limits_{f\in\Omega_y}J(f) J(S)=fΩyminJ(f)
S ( x ) ∈ Ω y S(x)\in\Omega_y S(x)Ωy 是泛函极小问题的解当且仅当
∀ η ( x ) ∈ Ω 0 , ∫ a b η ′ ′ ( x ) S ′ ′ ( x ) d x = 0 \forall \eta (x)\in\Omega_0,\int_a^b\eta''(x)S''(x)\mathrm{d}x=0 η(x)Ω0,abη′′(x)S′′(x)dx=0

证明:(相当经典)

充分性:任取 f ∈ Ω y f\in\Omega_y fΩy ,令 η ( x ) = f ( x ) − S ( x ) \eta(x)=f(x)-S(x) η(x)=f(x)S(x)
∫ a b ( f ′ ′ ( x ) ) 2 d x = ∫ a b ( η ′ ′ ( x ) + S ′ ′ ( x ) ) 2 d x = ∫ a b ( η ′ ′ ( x ) ) 2 + ( S ′ ′ ( x ) ) 2 d x ≥ ∫ a b ( S ′ ′ ( x ) ) 2 d x \begin{split} &\int_a^b(f''(x))^2\mathrm{d}x\\ =&\int_a^b(\eta''(x)+S''(x))^2\mathrm{d}x\\ =&\int_a^b(\eta''(x))^2+(S''(x))^2\mathrm{d}x\\ \geq &\int_a^b(S''(x))^2\mathrm{d}x \end{split} ==ab(f′′(x))2dxab(η′′(x)+S′′(x))2dxab(η′′(x))2+(S′′(x))2dxab(S′′(x))2dx

必要性:任取 η ∈ Ω 0 \eta\in\Omega_0 ηΩ0,则有 J ( S + α η ) ≥ J ( S ) J(S+\alpha\eta)\geq J(S) J(S+αη)J(S)
g ( α ) = J ( S + α η ) g(\alpha)=J(S+\alpha\eta) g(α)=J(S+αη),则 α = 0 \alpha=0 α=0 g ( α ) g(\alpha) g(α) 的极小值点
由于 d d α ( ∫ a b ( S ′ ′ ( x ) + α η ′ ′ ( x ) ) 2 d x ) = ∫ a b ( 2 α ( η ′ ′ ( x ) ) 2 + 2 S ′ ′ ( x ) η ′ ′ ( x ) ) d x \begin{split} &\frac{\mathrm{d}}{\mathrm{d}\alpha}\left(\int_a^b(S''(x)+\alpha\eta''(x))^2\mathrm{d}x\right)\\ =&\int_a^b\left(2\alpha(\eta''(x))^2+2S''(x)\eta''(x)\right)\mathrm{d}x\\ \end{split} =dαd(ab(S′′(x)+αη′′(x))2dx)ab(2α(η′′(x))2+2S′′(x)η′′(x))dx α = 0 \alpha=0 α=0 ,即得 ∫ a b η ′ ′ ( x ) S ′ ′ ( x ) d x = 0 \int_a^b\eta''(x)S''(x)\mathrm{d}x=0 abη′′(x)S′′(x)dx=0

2.2 S ( x ) S(x) S(x) 的结构

S ( x ) S(x) S(x) 即为前文所述泛函极小问题的解,且令 S ( x ) ∈ C 4 ( x i , x i + 1 ) , i = 0 , 1 , … , n − 1 S(x)\in C^4(x_i,x_{i+1}),i=0,1,\dots,n-1 S(x)C4(xi,xi+1),i=0,1,,n1,在每个 x i x_i xi 处有直到四阶的左、右导数
在每个小区间上使用两次分部积分公式,得
∫ a b η ′ ′ ( x ) S ′ ′ ( x ) d x = ∑ i = 0 n − 1 ∫ x i x i + 1 η ′ ′ ( x ) S ′ ′ ( x ) d x = ∑ i = 0 n − 1 η ′ ( x ) S ′ ′ ( x ) ∣ x i + x i + 1 − − ∫ x i x i + 1 η ′ ( x ) S ′ ′ ′ ( x ) d x = ∑ i = 0 n − 1 η ′ ( x ) S ′ ′ ( x ) ∣ x i + x i + 1 − − η ( x ) S ′ ′ ′ ( x ) ∣ x i + x i + 1 − + ∫ x i x i + 1 η ( x ) S ′ ′ ′ ′ ( x ) d x \begin{split} &\int_a^b\eta''(x)S''(x)\mathrm{d}x\\ =&\sum\limits_{i=0}^{n-1}\int_{x_i}^{x_{i+1}}\eta''(x)S''(x)\mathrm{d}x\\ =&\sum\limits_{i=0}^{n-1}\eta'(x)S''(x)\bigg|_{x_{i}^+}^{x_{i+1}^-}-\int_{x_i}^{x_{i+1}}\eta'(x)S'''(x)\mathrm{d}x\\ =&\sum\limits_{i=0}^{n-1}\eta'(x)S''(x)\bigg|_{x_{i}^+}^{x_{i+1}^-}-\eta(x)S'''(x)\bigg|_{x_{i}^+}^{x_{i+1}^-}+\int_{x_i}^{x_{i+1}}\eta(x)S''''(x)\mathrm{d}x\\ \end{split} ===abη′′(x)S′′(x)dxi=0n1xixi+1η′′(x)S′′(x)dxi=0n1η(x)S′′(x) xi+xi+1xixi+1η(x)S′′′(x)dxi=0n1η(x)S′′(x) xi+xi+1η(x)S′′′(x) xi+xi+1+xixi+1η(x)S′′′′(x)dx S ( x ) ∈ C 4 ( x i , x i + 1 ) S(x)\in C^4(x_i,x_{i+1}) S(x)C4(xi,xi+1),将上式合并同类项

∫ a b η ′ ′ ( x ) S ′ ′ ( x ) d x = [ η ′ ( b ) S ′ ′ ( b ) − η ′ ( a ) S ′ ′ ( a ) + ∑ i = 1 n − 1 S ′ ′ ( x i ) ( η ′ ( x i + ) − η ′ ( x i − ) ) ] − [ η ( b ) S ′ ′ ′ ( b ) − η ( a ) S ′ ′ ′ ( a ) + ∑ i = 1 n − 1 S ′ ′ ′ ( x i ) ( η ( x i + ) − η ( x i − ) ) ] + ∑ i = 0 n − 1 ∫ x i x i + 1 η ( x ) S ′ ′ ′ ′ ( x ) d x = ∑ i = 0 n − 1 ∫ x i x i + 1 η ( x ) S ′ ′ ′ ′ ( x ) d x = 0 \begin{split} &\int_a^b\eta''(x)S''(x)\mathrm{d}x\\ =&[\eta'(b)S''(b)-\eta'(a)S''(a)+\sum\limits_{i=1}^{n-1}S''(x_i)(\eta'(x_i^+)-\eta'(x_i^-))]\\ &-[\eta(b)S'''(b)-\eta(a)S'''(a)+\sum\limits_{i=1}^{n-1}S'''(x_i)(\eta(x_i^+)-\eta(x_i^-))]\\ &+\sum\limits_{i=0}^{n-1}\int_{x_i}^{x_{i+1}}\eta(x)S''''(x)\mathrm{d}x\\ =&\sum\limits_{i=0}^{n-1}\int_{x_i}^{x_{i+1}}\eta(x)S''''(x)\mathrm{d}x\\ =&0\\ \end{split} ===abη′′(x)S′′(x)dx[η(b)S′′(b)η(a)S′′(a)+i=1n1S′′(xi)(η(xi+)η(xi))][η(b)S′′′(b)η(a)S′′′(a)+i=1n1S′′′(xi)(η(xi+)η(xi))]+i=0n1xixi+1η(x)S′′′′(x)dxi=0n1xixi+1η(x)S′′′′(x)dx0 η ( x ) \eta(x) η(x) 的任意性,可得 S ′ ′ ′ ′ ( x ) S''''(x) S′′′′(x) 在每个小区间为 0

结论
S ( x ) S(x) S(x) 是具有下列性质的函数

  • 在每个小区间上是三次多项式
  • 在整个区间上二阶连续可导
  • 全体 S ( x ) S(x) S(x) 形成有限维空间 D i m = 4 n − 3 ( n − 1 ) = n + 3 Dim = 4n-3(n-1)=n+3 Dim=4n3(n1)=n+3

2.3 三次样条插值

定义:样条函数

  • n + 1 n+1 n+1 个插值节点 x 0 , x 1 , … , x n x_0,x_1,\dots,x_n x0,x1,,xn 处与给定的函数值相同
  • 在每个小区间 [ x i , x i + 1 ] [x_i,x_{i+1}] [xi,xi+1] 上是不超过 k k k 次的多项式
  • 在整个区间上 k − 1 k-1 k1 阶连续可导

称满足这些条件的 S k ( x ) S_k(x) Sk(x) k k k 次样条函数,其中常用的是三次样条函数,也叫做三次样条插值

定义:边界条件
可以发现,我们给出的全体 S ( x ) S(x) S(x) 形成的空间是 n + 3 n+3 n+3 维的,但根据样条函数的定义,却发现只有 n + 1 n+1 n+1 个插值条件,所以还需要两个边界处的约束条件以确定样条函数,称这两个条件为边界条件

常见的边界条件

  1. 固支边界条件(第一型边界条件):给出边界处的一阶导数
  2. 自然边界条件(第二型边界条件):给出边界处的二阶导数,且二阶导数为 0
  3. 周期型边界条件(第三型边界条件):分别令左右边界的函数值,一阶导数值,二阶导数值相等,并给出这三个值
  4. Not-A-Knot 边界条件:
    S 3 ′ ′ ′ ( x 1 + ) = S 3 ′ ′ ′ ( x 1 − ) , S 3 ′ ′ ′ ( x n − 1 + ) = S 3 ′ ′ ′ ( x n − 1 − ) S_3'''(x_1^+)=S_3'''(x_1^-),S_3'''(x_{n-1}^+)=S_3'''(x_{n-1}^-) S3′′′(x1+)=S3′′′(x1),S3′′′(xn1+)=S3′′′(xn1)
  5. 横梁固支端:挠度和截面转角为0
    S ( x 0 ) = 0 , S ′ ( x 0 ) = 0 S(x_0)=0,S'(x_0)=0 S(x0)=0,S(x0)=0
    固支端
  6. 横梁简支端:挠度和弯矩为0
    S ( x 0 ) = 0 , S ′ ′ ( x 0 ) = 0 S(x_0)=0,S''(x_0)=0 S(x0)=0,S′′(x0)=0
    简支端
  7. 横梁自由端:弯矩和剪力为0
    S ′ ′ ( x 0 ) = 0 , S ′ ′ ′ ( x 0 ) = 0 S''(x_0)=0,S'''(x_0)=0 S′′(x0)=0,S′′′(x0)=0

3. 三次样条函数的构造方法

3.1 三转角

思想:
基于节点构造 S 3 ( x ) S_3(x) S3(x) 的分段三次Hermite插值,求二阶导使其二阶连续可导

命题:三转角构造三次样条的公式
设节点处的一阶导数值 m i m_i mi,构造三次hermite插值
S 3 ( x ) = ∑ i = 0 n [ y i h i ( x ) + m i h ^ i ( x ) ] S_3(x)=\sum\limits_{i=0}^n[y_ih_i(x)+m_i\hat{h}_i(x)] S3(x)=i=0n[yihi(x)+mih^i(x)]其中 h , h ^ h,\hat{h} h,h^ 为Hermite插值的基函数,则由三转角构造方法, m i m_i mi 满足
( 1 − λ i ) m i − 1 + 2 m i + λ i m i + 1 = μ i (1-\lambda_i)m_{i-1}+2m_i+\lambda_im_{i+1}=\mu_i (1λi)mi1+2mi+λimi+1=μi其中
i = 1 , 2 , … , n − 1 i= 1,2,\dots,n-1 i=1,2,,n1

λ i = Δ x i − 1 Δ x i − 1 + Δ x i \lambda_i=\frac{\Delta x_{i-1}}{\Delta x_{i-1}+\Delta x_i} λi=Δxi1+ΔxiΔxi1

μ i = 3 ( ( 1 − λ i ) f [ x i − 1 , x i ] + λ i f [ x i , x i + 1 ] ) \mu_i=3((1-\lambda_i)f[x_{i-1},x_i]+\lambda_if[x_i,x_{i+1}]) μi=3((1λi)f[xi1,xi]+λif[xi,xi+1])

证明思路
写出每个小区间上的 S 3 ( x ) S_3(x) S3(x) 的形式,求出节点处(不含区间端点)的左右二阶导数值,令其相等并整理即得

命题:三转角结合边界条件的方程

  • 三转角固支边界条件: m 0 = f ′ ( x 0 ) , m n = f ′ ( x n ) m_0=f'(x_0),m_n=f'(x_n) m0=f(x0),mn=f(xn)
  • 三转角自然边界条件:
    2 m 0 + m 1 = 3 f [ x 0 , x 1 ] = μ 0 2m_0+m_1=3f[x_0,x_1]=\mu_0 2m0+m1=3f[x0,x1]=μ0 m n − 1 + 2 m n = 3 f [ x n − 1 , x n ] = μ n m_{n-1}+2m_n=3f[x_{n-1},x_n]=\mu_n mn1+2mn=3f[xn1,xn]=μn

3.2 三弯矩

思想:
基于节点构造 S ′ ′ ( x ) S''(x) S′′(x) 为连续的分段线性函数,积分两次后代入插值条件 S 3 ( x i ) = y i S_3(x_i)=y_i S3(xi)=yi,对得到的 S 3 ( x ) S_3(x) S3(x) 进行求导,使其一阶导数也连续

命题:三弯矩构造三次样条的公式
S 3 ′ ′ ( x i ) = M i S_3''(x_i)=M_i S3′′(xi)=Mi,基于节点构造分段线性插值
S 3 ′ ′ ( x ) = M i − 1 x i − x Δ x i − 1 + M i x − x i − 1 Δ x i − 1 S_3''(x)=M_{i-1}\frac{x_i-x}{\Delta x_{i-1}}+M_i\frac{x-x_{i-1}}{\Delta x_{i-1}} S3′′(x)=Mi1Δxi1xix+MiΔxi1xxi1由三弯矩构造方法, M i M_i Mi 满足
λ i M i − 1 + 2 M i + ( 1 − λ i ) M i + 1 = d i \lambda_iM_{i-1}+2M_i+(1-\lambda_i)M_{i+1}=d_i λiMi1+2Mi+(1λi)Mi+1=di

其中
i = 1 , 2 , … , n i=1,2,\dots,n i=1,2,,n

d i = 6 f [ x i − 1 , x i , x i + 1 ] d_i=6f[x_{i-1},x_i,x_{i+1}] di=6f[xi1,xi,xi+1]

证明思路
写出每个小区间上的 S 3 ( x ) S_3(x) S3(x) 的形式,代入插值条件求解,再求出节点处(不含区间端点)的左右一阶导数值,令其相等并整理即得

命题:三弯矩结合边界条件的方程

  • 三弯矩固支边界条件:
    2 M 0 + M 1 = d 0 = 6 f [ x 0 , x 0 , x 1 ] 2M_0+M_1=d_0=6f[x_0,x_0,x_1] 2M0+M1=d0=6f[x0,x0,x1] M n − 1 + 2 M n = d n = 6 f [ x n − 1 , x n , x n ] M_{n-1}+2M_n=d_n=6f[x_{n-1},x_n,x_n] Mn1+2Mn=dn=6f[xn1,xn,xn]

3.3 待定系数法

思想
基于三次样条是多项式的事实,用待定系数法设分段函数在每个小区间上是不同的三次多项式,使其分别满足函数值连续,一阶导数值连续,二阶导数值连续

命题:待定系数法构造三次样条的公式
基于 n n n 个节点 ( x i , y i ) , i = 1 , 2 , … , n (x_i,y_i),i=1,2,\dots,n (xi,yi),i=1,2,,n 构造如下的三次多项式组 S i ( x ) , x ∈ [ x i , x i + 1 ] , i = 1 , 2 , … , n − 1 S_i(x),x\in[x_i,x_{i+1}],i=1,2,\dots,n-1 Si(x),x[xi,xi+1],i=1,2,,n1
{ S 1 ( x ) = y 1 + b 1 ( x − x 1 ) + c 1 ( x − x 1 ) 2 + d 1 ( x − x 1 ) 3 S 2 ( x ) = y 2 + b 2 ( x − x 2 ) + c 2 ( x − x 2 ) 2 + d 2 ( x − x 2 ) 3 ⋮ S n − 1 ( x ) = y n − 1 + b n − 1 ( x − x n − 1 ) + c n − 1 ( x − x n − 1 ) 2 + d n − 1 ( x − x n − 1 ) 3 \begin{cases} S_1(x)=y_1+b_1(x-x_1)+c_1(x-x_1)^2+d_1(x-x_1)^3\\ S_2(x)=y_2+b_2(x-x_2)+c_2(x-x_2)^2+d_2(x-x_2)^3\\ \vdots\\ S_{n-1}(x)=y_{n-1}+b_{n-1}(x-x_{n-1})+c_{n-1}(x-x_{n-1})^2+d_{n-1}(x-x_{n-1})^3\\ \end{cases} S1(x)=y1+b1(xx1)+c1(xx1)2+d1(xx1)3S2(x)=y2+b2(xx2)+c2(xx2)2+d2(xx2)3Sn1(x)=yn1+bn1(xxn1)+cn1(xxn1)2+dn1(xxn1)3使其满足
{ ( 1 ) : S i ( x i ) = y i , S i ( x i + 1 ) = y i + 1 , i = 1 , … , n − 1 ( 2 ) : S i ′ ( x i + 1 ) = S i + 1 ′ ( x i + 1 ) , i = 1 , 2 , … , n − 2 ( 3 ) : S i ′ ′ ( x i + 1 ) = S i + 1 ′ ′ ( x i + 1 ) , i = 1 , 2 , … , n − 2 \begin{cases} (1):S_i(x_i)=y_i,S_i(x_{i+1})=y_{i+1},&i=1,\dots,n-1\\ (2):S_{i}'(x_{i+1})=S_{i+1}'(x_{i+1}),&i=1,2,\dots,n-2\\ (3):S_{i}''(x_{i+1})=S_{i+1}''(x_{i+1}),&i=1,2,\dots,n-2\\ \end{cases} (1):Si(xi)=yi,Si(xi+1)=yi+1,(2):Si(xi+1)=Si+1(xi+1),(3):Si′′(xi+1)=Si+1′′(xi+1),i=1,,n1i=1,2,,n2i=1,2,,n2则待定系数 c i c_i ci 满足如下方程
δ i c i + 2 ( δ i + δ i + 1 ) c i + 1 + δ i + 1 c i + 2 = 3 ( Δ i + 1 δ i + 1 − Δ i δ i ) \delta_{i}c_{i}+2(\delta_{i}+\delta_{i+1})c_{i+1}+\delta_{i+1}c_{i+2}=3(\frac{\Delta_{i+1}}{\delta_{i+1}}-\frac{\Delta_{i}}{\delta_{i}}) δici+2(δi+δi+1)ci+1+δi+1ci+2=3(δi+1Δi+1δiΔi)其中
i = 1 , 2 , … , n − 3 i=1,2,\dots,n-3 i=1,2,,n3
δ i = x i + 1 − x i , Δ i = y i + 1 − y i \delta_i=x_{i+1}-x_i,\Delta_i=y_{i+1}-y_i δi=xi+1xi,Δi=yi+1yi
从而可解 b i , d i ( i = 1 , … , n − 2 ) b_i,d_i (i=1,\dots,n-2) bi,di(i=1,,n2)
b i = Δ i δ i − δ i 3 ( 2 C i + C i + 1 ) b_i=\frac{\Delta_i}{\delta_i}-\frac{\delta_i}{3}(2C_i+C_{i+1}) bi=δiΔi3δi(2Ci+Ci+1) d i = C i + 1 − C i 3 δ i d_i=\frac{C_{i+1}-C_i}{3\delta_i} di=3δiCi+1Ci

证明思路
从多项式满足的性质(3)可解出 d i d_i di,从性质(1)的后半句(前半句已经成立)解出 b i b_i bi,将 b i , d i b_i,d_i bi,di 代入性质(2)解得 c i c_i ci

可以发现以上待定系数仅有 b n − 1 , d n − 1 b_{n-1},d_{n-1} bn1,dn1 还未解出,它们只需额外依赖 c n c_n cn 的值,故我们设 c n = S n − 1 ′ ′ ( x n ) 2 c_n=\frac{S_{n-1}''(x_n)}{2} cn=2Sn1′′(xn)

综上所述,有以下命题
命题
在前文的待定系数方程组中,待定系数 a i , b i , c i , i = 1 , 2 , … , n − 1 a_i,b_i,c_i,i=1,2,\dots,n-1 ai,bi,ci,i=1,2,,n1 由以下方程给出
δ i c i + 2 ( δ i + δ i + 1 ) c i + 1 + δ i + 1 c i + 2 = 3 ( Δ i + 1 δ i + 1 − Δ i δ i ) \delta_{i}c_{i}+2(\delta_{i}+\delta_{i+1})c_{i+1}+\delta_{i+1}c_{i+2}=3(\frac{\Delta_{i+1}}{\delta_{i+1}}-\frac{\Delta_{i}}{\delta_{i}}) δici+2(δi+δi+1)ci+1+δi+1ci+2=3(δi+1Δi+1δiΔi)

i = 1 , 2 , … , n − 2 i=1,2,\dots,n-2 i=1,2,,n2 成立
b i = Δ i δ i − δ i 3 ( 2 C i + C i + 1 ) b_i=\frac{\Delta_i}{\delta_i}-\frac{\delta_i}{3}(2C_i+C_{i+1}) bi=δiΔi3δi(2Ci+Ci+1)


d i = C i + 1 − C i 3 δ i d_i=\frac{C_{i+1}-C_i}{3\delta_i} di=3δiCi+1Ci

i = 1 , 2 , … , n − 1 i=1,2,\dots,n-1 i=1,2,,n1 成立

命题:待定系数法结合边界条件的方程

  1. 待定系数法固支边界条件: b 1 = y 1 ′ , b n = y n ′ b_1=y_1',b_n=y_n' b1=y1,bn=yn
  2. 待定系数法自然边界条件: c 1 = 0 , c n = 0 c_1=0,c_n=0 c1=0,cn=0
    它给出了关于 c 1 , … , c n c_1,\dots,c_n c1,,cn 的三对角线性方程组
    ( 1 0 δ 1 2 ( δ 1 + δ 2 ) δ 2 ⋱ ⋱ ⋱ δ n − 2 2 ( δ n − 2 + δ n − 1 ) δ n − 1 0 1 ) ( c 1 c 2 ⋮ c n − 1 c n ) = ( 0 3 ( Δ 2 δ 2 − Δ 1 δ 1 ) ⋮ 3 ( Δ n − 1 δ n − 1 − Δ n − 2 δ n − 2 ) 0 ) \begin{pmatrix} 1&0&&&&\\ \delta_1&2(\delta_1+\delta_2)&\delta_2&&&\\ &\ddots&\ddots&\ddots&\\ &&\delta_{n-2}&2(\delta_{n-2}+\delta_{n-1})&\delta_{n-1}\\ &&&0&1\\ \end{pmatrix} \begin{pmatrix} c_1\\c_2\\\vdots\\c_{n-1}\\c_n \end{pmatrix}= \begin{pmatrix} 0\\3(\frac{\Delta_2}{\delta_2}-\frac{\Delta_1}{\delta_1})\\\vdots\\3(\frac{\Delta_{n-1}}{\delta_{n-1}}-\frac{\Delta_{n-2}}{\delta_{n-2}})\\0 \end{pmatrix} 1δ102(δ1+δ2)δ2δn22(δn2+δn1)0δn11 c1c2cn1cn = 03(δ2Δ2δ1Δ1)3(δn1Δn1δn2Δn2)0
  3. Not A Knot边界条件: d 1 = d 2 , d n − 1 = d n d_1=d_2,d_{n-1}=d_n d1=d2,dn1=dn

4. 三次样条的截断误差

命题:三次样条的截断误差
设被插函数 f ( x ) ∈ C 4 [ a , b ] f(x)\in C^4[a,b] f(x)C4[a,b] S 3 ( x ) S_3(x) S3(x) 为相应的一或二型插值样条,则有
∣ ∣ S 3 ( k ) − f ( k ) ∣ ∣ ∞ ≤ C k ∣ ∣ f ( 4 ) ∣ ∣ ∞ h 4 − k , k = 0 , 1 , 2 , … ||S_3^{(k)}-f^{(k)}||_{\infty}\leq C_k||f^{(4)}||_{\infty}h^{4-k},k=0,1,2,\dots ∣∣S3(k)f(k)Ck∣∣f(4)h4k,k=0,1,2,其中 h = max ⁡ i Δ x i , C 0 = 24 384 ( 5 384 ) , C 1 = 1 2 ( 1 24 ) , C 2 = 1 2 ( 3 8 ) h=\max\limits_{i}\Delta x_i,C_0=\frac{24}{384}(\frac{5}{384}),C_1=\frac{1}{2}(\frac{1}{24}),C_2=\frac{1}{2}(\frac{3}{8}) h=imaxΔxi,C0=38424(3845),C1=21(241),C2=21(83)

证明略

5.代码示例

示例1:待定系数法计算自然三次样条

首先展示使用matlab进行待定系数法求解自然三次样条,创建一个m文件,输入以下代码以定义函数。注意:这里的节点下标是从 1 到 n 的

%待定系数法计算三次样条
%算法思路,通过解三对角方程组解出c_i,进而解出b_i和d_i
%输入:数据点的x,y向量
%输出:系数矩阵b1,c1,d1;b2,c2,d2;...
function coeff=splinecoeff(x,y)
n=length(x);
A=zeros(n,n);%初始化矩阵A,r
r=zeros(n,1);
for i=1:n-1      %定义Delta_i(记为dy(i))和delta_i(记为dx(i))
    dx(i)=x(i+1)-x(i);dy(i)=y(i+1)-y(i);
end
for i=2:n-1
    A(i,i-1:i+1)=[dx(i-1) 2*(dx(i-1)+dx(i)) dx(i)];
    r(i)=3*(dy(i)/dx(i)-dy(i-1)/dx(i-1));
end
%根据需要编写边界条件
A(1,1)=1;      %自然样条,默认r_1=r_n=0(初始化r时赋的值)
A(n,n)=1;

coeff=zeros(n,3);  %初始化解矩阵
coeff(:,2)=A\r;    %求解Ac=r,得系数c
for i=1:n-1        %求解b和d
    coeff(i,3)=(coeff(i+1,2)-coeff(i,2))/(3*dx(i));
    coeff(i,1)=dy(i)/dx(i)-dx(i)*(2*coeff(i,2)+coeff(i+1,2))/3;
end
coeff=coeff(1:n-1,1:3);

接下来我们便可调用这个函数了,在相同文件夹内创建一个新的 m 文件,输入以下代码

clc,clear all
x=[0,1,2];
y=[3,-2,1];
splinecoeff(x,y)

输出结果如下

接下来我们尝试使用plot方法画出图像,继续调用刚刚写好的 splinecoeff 函数,可以得到样条函数的系数,在每个小区间上指定 k k k 个等距点,代入样条函数求出函数值,依次用线段连接各点,即可得到样条函数的近似图像。

先写好画样条函数图像的代码,以便后续调用

%画三次样条图像(待定系数法)
%输入:x,y数据点向量,每个小区间内指定等距点个数k
%输出:所有点的横坐标向量x1,纵坐标向量y1,以及连接这些点的图像
function [x1,y1]=splineplot(x,y,k)
n=length(x);
coeff=splinecoeff(x,y);   %计算三次样条插值的系数
x1=[];y1=[];              %初始化用于存储插值结果的空数组 x1 和 y1
for i=1:n-1
    xs=linspace(x(i),x(i+1),k);%使用 linspace 函数生成 k 个均匀分布的插值点 xs
    dx=xs-x(i);
    ys=coeff(i,3)*dx;      %使用嵌套乘法(秦九韶算法)求多项式的值
    ys=(ys+coeff(i,2)).*dx
    ys=(ys+coeff(i,1)).*dx+y(i);
    x1=[x1;xs(1:k-1)'];y1=[y1;ys(1:k-1)'];%将每次循环新生成的结果追加到原来的结果上
end
x1=[x1;x(end)];y1=[y1;y(end)];  %将最后一个节点补充上
plot(x,y,'o',x1,y1)

创建一个新的 m 文件进行画图,首先是 k = 3 k=3 k=3 的情形

clc,clear all
x=[0,1,2,3,4,5];
y=[3,1,4,1,2,0];
splineplot(x,y,3)

图像显示如下

然后是 k = 15 k=15 k=15 的情形

clc,clear all
x=[0,1,2,3,4,5];
y=[3,1,4,1,2,0];
splineplot(x,y,15)

图像显示如下

示例2:matlab内置三次样条插值函数spline

具体可参见 Matlab文档:函数-插值-spline
spline函数默认自然边界条件,代码示例如下

clc,clear all
X = [0 1 3 4 6 7];
Y = sin(X);
x = linspace(0,7,200);
plot(x,ppval(spline(X,Y),x))

结果如下

若要将边界条件改为固支型(即规定一阶导数),只需在Y左右两侧添加对应导数值,示例如下

clc,clear all
X = [0 1 3 4];
Y = [0 0 2 2];
x = linspace(0,4,200);
plot(x,ppval(spline(X,[0 Y 0]),x))  %指定左右端点一阶导数均为0

结果如下

参考书籍:《数值分析》李庆扬 王能超 易大义 编

  • 54
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值