【数模学习笔记】插值算法和拟合算法

声明:以下笔记中的图片以及内容
均整理自“数学建模学习交流”清风老师的课程资料,仅用作学习交流使用

文章目录

  • 插值算法
    • 定义
    • 三个类型插值举例
      • 插值多项式
      • 分段插值
      • 三角插值
    • 一般插值多项式
      • 原理
      • 拉格朗日插值法
        • 龙格现象
        • 分段线性插值
      • 牛顿插值法
    • Hermite埃尔米特插值
      • 原理
      • 分段三次埃尔米特插值
        • 构造
        • 应用
    • 三次样条插值
      • 定义
      • 应用
    • 三次Hermite插值和三次样条插值的对比
    • n维数据的插值
  • 拟合算法
    • 最小二乘法
    • 拟合评价
      • Matlab自带拟合工具箱cftool

插值算法

实际上本栏重点只有三次Hermite插值和三次样条插值的两行调用代码,其他的全是废(原)话(理)

定义

设函数 y = f ( x ) y = f(x) y=f(x)在区间 [ a , b ] [a,b] [a,b]上有定义,且已知在点
a ≤ x 0 < x 1 < ⋯ < x n ≤ b a \leq x_0 < x_1 < \cdots < x_n \leq b ax0<x1<<xnb
上的值分别为: y 0 , y 1 , ⋯ , y n y_0,y_1,\cdots,y_n y0,y1,,yn
若存在一简单函数 P ( x ) P(x) Px,使
P ( x i ) = y i ( i = 0 , 1 , 2 ⋯ , n ) P(x_i) = y_i\ (i = 0,1,2\cdots,n)\ P(xi)=yi (i=0,1,2,n) 
则称 P ( x ) P(x) P(x) f ( x ) f(x) f(x)的插值函数,点 x 0 , x 1 , ⋯ , x n x_0,x_1,\cdots,x_n x0,x1,,xn称为插值节点,包含插值节点的区间 [ a , b ] [a,b] [a,b]称为插值区间,求插值函数 P ( x ) P(x) P(x)的方法称为插值法。

三个类型插值举例

插值多项式

  • 示例:已知函数 y = f ( x ) y = f(x) y=f(x)在点 x 0 = 0 x_0 = 0 x0=0 x 1 = 1 x_1 = 1 x1=1 x 2 = 2 x_2 = 2 x2=2上的值分别为 f ( 0 ) = 1 f(0)=1 f(0)=1 f ( 1 ) = 2 f(1)=2 f(1)=2 f ( 2 ) = 5 f(2)=5 f(2)=5。我们可以构造一个二次插值多项式 P ( x ) P(x) P(x)来逼近 f ( x ) f(x) f(x)
    • P ( x ) = a 0 + a 1 x + a 2 x 2 P(x)=a_0 + a_1x + a_2x^2 P(x)=a0+a1x+a2x2,将已知点代入可得方程组:
      • { a 0 + a 1 × 0 + a 2 × 0 2 = 1 a 0 + a 1 × 1 + a 2 × 1 2 = 2 a 0 + a 1 × 2 + a 2 × 2 2 = 5 \begin{cases}a_0 + a_1\times0 + a_2\times0^2 = 1\\a_0 + a_1\times1 + a_2\times1^2 = 2\\a_0 + a_1\times2 + a_2\times2^2 = 5\end{cases} a0+a1×0+a2×02=1a0+a1×1+a2×12=2a0+a1×2+a2×22=5
    • 解这个方程组可得 a 0 = 1 a_0 = 1 a0=1 a 1 = 0 a_1 = 0 a1=0 a 2 = 1 a_2 = 1 a2=1,所以插值多项式 P ( x ) = 1 + x 2 P(x)=1 + x^2 P(x)=1+x2。在区间 [ 0 , 2 ] [0,2] [0,2]上,这个多项式可以用来近似原函数 f ( x ) f(x) f(x)

分段插值

  • 示例:假设我们要对函数 f ( x ) = 1 1 + 25 x 2 f(x)=\frac{1}{1 + 25x^2} f(x)=1+25x21在区间 [ − 1 , 1 ] [-1,1] [1,1]上进行插值。如果我们只用一个高次多项式进行插值,可能会出现龙格现象(即在区间端点附近出现剧烈振荡)。这时可以采用分段插值,比如将区间 [ − 1 , 1 ] [-1,1] [1,1]等分成若干个子区间,如 [ − 1 , − 0.5 ] , [ − 0.5 , 0 ] , [ 0 , 0.5 ] , [ 0.5 , 1 ] [-1,-0.5],[-0.5,0],[0,0.5],[0.5,1] [1,0.5],[0.5,0],[0,0.5],[0.5,1]。在每个子区间上分别进行低次多项式插值(如线性插值或二次插值)。
    • 在区间 [ − 1 , − 0.5 ] [-1,-0.5] [1,0.5]上,已知端点值 f ( − 1 ) f(-1) f(1) f ( − 0.5 ) f(-0.5) f(0.5),通过线性插值得到该区间上的插值函数 P 1 ( x ) P_1(x) P1(x),使得 P 1 ( − 1 ) = f ( − 1 ) P_1(-1)=f(-1) P1(1)=f(1) P 1 ( − 0.5 ) = f ( − 0.5 ) P_1(-0.5)=f(-0.5) P1(0.5)=f(0.5),并且在该区间内 P 1 ( x ) P_1(x) P1(x)近似 f ( x ) f(x) f(x)
    • 同理,在其他子区间上也进行类似的操作,得到相应的插值函数 P 2 ( x ) P_2(x) P2(x) P 3 ( x ) P_3(x) P3(x) P 4 ( x ) P_4(x) P4(x)。这样就构成了整个区间 [ − 1 , 1 ] [-1,1] [1,1]上的分段插值函数。

三角插值

  • 示例:对于一个周期为 2 π 2\pi 2π的函数 f ( x ) f(x) f(x),我们在区间 [ 0 , 2 π ] [0,2\pi] [0,2π]上取 n n n个等距节点 x k = 2 k π n x_k = \frac{2k\pi}{n} xk=n2 k = 0 , 1 , ⋯ , n − 1 k = 0,1,\cdots,n - 1 k=0,1,,n1,已知这些节点上的函数值 f ( x k ) f(x_k) f(xk)
    • 三角插值多项式可以表示为 S n ( x ) = a 0 2 + ∑ k = 1 n ( a k cos ⁡ k x + b k sin ⁡ k x ) S_n(x)=\frac{a_0}{2}+\sum_{k = 1}^{n}(a_k\cos kx + b_k\sin kx) Sn(x)=2a0+k=1n(akcoskx+bksinkx),其中系数 a k a_k ak b k b_k bk通过以下公式计算:
      • a k = 1 π ∫ 0 2 π f ( x ) cos ⁡ k x d x a_k=\frac{1}{\pi}\int_{0}^{2\pi}f(x)\cos kx dx ak=π102πf(x)coskxdx k = 0 , 1 , ⋯ , n k = 0,1,\cdots,n k=0,1,,n
      • b k = 1 π ∫ 0 2 π f ( x ) sin ⁡ k x d x b_k=\frac{1}{\pi}\int_{0}^{2\pi}f(x)\sin kx dx bk=π102πf(x)sinkxdx k = 1 , 2 , ⋯ , n k = 1,2,\cdots,n k=1,2,,n
    • 例如,假设 f ( x ) f(x) f(x)是一个简单的周期函数,在 [ 0 , 2 π ] [0,2\pi] [0,2π] f ( x ) = { x , 0 ≤ x < π 2 π − x , π ≤ x < 2 π f(x)=\begin{cases}x, & 0\leq x < \pi\\2\pi - x, & \pi\leq x < 2\pi\end{cases} f(x)={x,2πx,0x<ππx<2π,通过计算上述积分可以得到相应的三角插值多项式 S n ( x ) S_n(x) Sn(x),用它来近似原函数 f ( x ) f(x) f(x)在整个周期上的行为。

这些插值方法在不同的场景下各有优势,分段插值可以避免高次多项式的振荡问题,插值多项式计算相对简单,三角插值适用于周期函数等情况,它们都为函数的近似和数据的处理提供了有效的手段。

一般插值多项式

原理

  • 定理:
    • 设有 n + 1 n + 1 n+1个互不相同的节点 ( x i , y i ) (x_i,y_i) (xi,yi) ( i = 0 , 1 , 2 , ⋯ , n ) (i = 0,1,2,\cdots,n) (i=0,1,2,,n)
    • 则存在唯一的多项式:
      L n ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n L_n(x)=a_0 + a_1x + a_2x^2 + \cdots + a_nx^n Ln(x)=a0+a1x+a2x2++anxn
    • 使得 L n ( x j ) = y j , ( j = 0 , 1 , 2 , ⋯ , n ) L_n(x_j)=y_j \ \ ,(j = 0,1,2,\cdots,n) Ln(xj)=yj  ,(j=0,1,2,,n) 成立
      (即就是仅存在唯一多项式使其过给定的 n + 1 n+1 n+1个点
  • 证明:(利用范德蒙行列式)
    • 构造方程组
      { a 0 + a 1 x 0 + a 2 x 0 2 + ⋯ + a n x 0 n = y 0 a 0 + a 1 x 1 + a 2 x 1 2 + ⋯ + a n x 1 n = y 1 ⋯ ⋯ ⋯ a 0 + a 1 x n + a 2 x n 2 + ⋯ + a n x n n = y n \begin{cases} a_0 + a_1x_0 + a_2x_0^2 + \cdots + a_nx_0^n = y_0 \\ a_0 + a_1x_1 + a_2x_1^2 + \cdots + a_nx_1^n = y_1 \\ \cdots\cdots\cdots \\ a_0 + a_1x_n + a_2x_n^2 + \cdots + a_nx_n^n = y_n \end{cases} a0+a1x0+a2x02++anx0n=y0a0+a1x1+a2x12++anx1n=y1⋯⋯⋯a0+a1xn+a2xn2++anxnn=yn
    • 令:
      A = [ 1 x 0 ⋯ x 0 n 1 x 1 ⋯ x 1 n ⋮ ⋮ ⋯ ⋮ 1 x n ⋯ x n n ] A=\begin{bmatrix} 1 & x_0 & \cdots & x_0^n \\ 1 & x_1 & \cdots & x_1^n \\ \vdots & \vdots & \cdots & \vdots \\ 1 & x_n & \cdots & x_n^n \end{bmatrix} A= 111x0x1xnx0nx1nxnn
      X = [ a 0 a 1 ⋯ a n ] T X=\begin{bmatrix} \ a_0 \ a_1 \ \cdots \ a_n \end{bmatrix}^T X=[ a0 a1  an]T
      Y = [ y 0 y 1 ⋯ y n ] T Y=\begin{bmatrix} \ y_0 \ y_1 \ \cdots \ y_n \end{bmatrix}^T Y=[ y0 y1  yn]T
    • 方程组的矩阵形式: A X = Y AX = Y AX=Y
    • 由于 ∣ A ∣ = ∏ i = 1 n ∏ j = 0 i − 1 ( x i − x j ) ≠ 0 |A|=\prod_{i=1}^{n}\prod_{j=0}^{i - 1}(x_i - x_j) \neq 0 A=i=1nj=0i1(xixj)=0,所以方程组有唯一解,从而 L n ( x ) = a 0 + a 1 x + a 2 x 2 + ⋯ + a n x n L_n(x)=a_0 + a_1x + a_2x^2 + \cdots + a_nx^n Ln(x)=a0+a1x+a2x2++anxn唯一存在.
  • 注:
    • 只要 n + 1 n + 1 n+1个节点互异,满足上述插值条件的多项式是唯一存在的。
    • 如果不限制多项式的次数,插值多项式并不唯一。

拉格朗日插值法

在数值分析中,在若干个不同的地方得到相应的观测值,拉格朗日插值法可以找到一个多项式,其恰好在各个观测的点取到观测到的值。

  • 两个点: ( x 0 , y 0 ) , ( x 1 , y 1 ) (x_0,y_0),(x_1,y_1) (x0,y0),(x1,y1)
    f ( x ) = x − x 1 x 0 − x 1 y 0 + x − x 0 x 1 − x 0 y 1 f(x)=\frac{x - x_1}{x_0 - x_1}y_0+\frac{x - x_0}{x_1 - x_0}y_1 f(x)=x0x1xx1y0+x1x0xx0y1

  • 三个点: ( x 0 , y 0 ) , ( x 1 , y 1 ) , ( x 2 , y 2 ) (x_0,y_0),(x_1,y_1),(x_2,y_2) (x0,y0),(x1,y1),(x2,y2)
    f ( x ) = ( x − x 1 ) ( x − x 2 ) ( x 0 − x 1 ) ( x 0 − x 2 ) y 0 + ( x − x 0 ) ( x − x 2 ) ( x 1 − x 0 ) ( x 1 − x 2 ) y 1 + ( x − x 0 ) ( x − x 1 ) ( x 2 − x 0 ) ( x 2 − x 1 ) y 2 f(x)=\frac{(x - x_1)(x - x_2)}{(x_0 - x_1)(x_0 - x_2)}y_0+\frac{(x - x_0)(x - x_2)}{(x_1 - x_0)(x_1 - x_2)}y_1+\frac{(x - x_0)(x - x_1)}{(x_2 - x_0)(x_2 - x_1)}y_2 f(x)=(x0x1)(x0x2)(xx1)(xx2)y0+(x1x0)(x1x2)(xx0)(xx2)y1+(x2x0)(x2x1)(xx0)(xx1)y2

  • 拉格朗日插值多项式一般形式
    ω n + 1 ( x ) = ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n ) \omega_{n + 1}(x) = (x - x_0)(x - x_1)\cdots(x - x_n) ωn+1(x)=(xx0)(xx1)(xxn)
    ω n + 1 ′ ( x k ) = ( x k − x 0 ) ⋯ ( x k − x k − 1 ) ( x k − x k + 1 ) ⋯ ( x k − x n ) . \omega_{n + 1}'(x_k) = (x_k - x_0)\cdots(x_k - x_{k - 1})(x_k - x_{k + 1})\cdots(x_k - x_n). ωn+1(xk)=(xkx0)(xkxk1)(xkxk+1)(xkxn).
    l i ( x ) = ( x − x 0 ) ⋯ ( x − x i − 1 ) ( x − x i + 1 ) ⋯ ( x − x n ) ( x i − x 0 ) ⋯ ( x i − x i − 1 ) ( x i − x i + 1 ) ⋯ ( x i − x n ) l_i(x)=\frac{(x - x_0)\cdots(x - x_{i - 1})(x - x_{i + 1})\cdots(x - x_n)}{(x_i - x_0)\cdots(x_i - x_{i - 1})(x_i - x_{i + 1})\cdots(x_i - x_n)} li(x)=(xix0)(xixi1)(xixi+1)(xixn)(xx0)(xxi1)(xxi+1)(xxn)
    = ( x − x 0 ) ⋯ ( x − x i − 1 ) ( x − x i ) ( x − x i + 1 ) ⋯ ( x − x n ) ( x − x i ) ( x i − x 0 ) ⋯ ( x i − x i − 1 ) ( x i − x i + 1 ) ⋯ ( x i − x n ) =\frac{(x - x_0)\cdots(x - x_{i - 1})(x - x_i)(x - x_{i + 1})\cdots(x - x_n)}{(x - x_i)(x_i - x_0)\cdots(x_i - x_{i - 1})(x_i - x_{i + 1})\cdots(x_i - x_n)} =(xxi)(xix0)(xixi1)(xixi+1)(xixn)(xx0)(xxi1)(xxi)(xxi+1)(xxn)
    = ω n + 1 ( x ) ( x − x i ) ω n + 1 ′ ( x i ) =\frac{\omega_{n + 1}(x)}{(x - x_i)\omega_{n + 1}'(x_i)} =(xxi)ωn+1(xi)ωn+1(x)
    则拉格朗日插值多项式为 L n ( x ) = ∑ i = 0 n y i l i ( x ) L_n(x)=\sum_{i = 0}^{n}y_il_i(x) Ln(x)=i=0nyili(x)
    L n ( x ) = ∑ k = 0 n y k ω n + 1 ( x ) ( x − x k ) ω n + 1 ′ ( x k ) . L_n(x)=\sum_{k = 0}^{n}y_k\frac{\omega_{n + 1}(x)}{(x - x_k)\omega_{n + 1}'(x_k)}. Ln(x)=k=0nyk(xxk)ωn+1(xk)ωn+1(x).

但实际上,拉格朗日插值法实际情况下并不常用,因为有一个很大的问题——龙格现象

龙格现象

龙格现象是指在使用多项式插值逼近函数时,当插值节点等距分布且插值多项式的次数较高时,在插值区间的两端会出现剧烈振荡的现象,导致插值结果在区间端点附近与原函数偏差较大,不能很好地逼近原函数。
所以在不清楚曲线具体运动趋势的情况下,不要轻易使用高次插值。
在这里插入图片描述

分段线性插值

为了避免龙格现象带来的影响,故我们使用分段低次插值。
这里以分段二次插值为例:
选取跟节点 x x x最近的三个节点 x i − 1 , x i , x i + 1 x_{i - 1},x_i,x_{i + 1} xi1,xi,xi+1进行二次插值。
即在每一个区间 [ x i − 1 , x i + 1 ] [x_{i - 1},x_{i + 1}] [xi1,xi+1]上,取:
f ( x ) ≈ L 2 ( x ) = ∑ k = i − 1 i + 1 [ y k ∏ j = i − 1 j ≠ k i + 1 ( x − x j ) ( x k − x j ) ] f(x)\approx L_2(x)=\sum_{k = i - 1}^{i + 1}[y_k\prod_{\substack{j = i - 1\\j\neq k}}^{i + 1}\frac{(x - x_j)}{(x_k - x_j)}] f(x)L2(x)=k=i1i+1[ykj=i1j=ki+1(xkxj)(xxj)]

这种分段的低次插值称为分段二次插值,在几何上就是用分段抛物线代替 y = f ( x ) y = f(x) y=f(x),故分段二次插值又称为分段抛物插值。

牛顿插值法

牛顿插值法每次插值只和前n项的值有关,这样每次只要在原来的函数上添加新的项,就能够产生新的函数。

f ( x ) = f ( x 0 ) + f [ x 0 , x 1 ] ( x − x 0 ) f(x)=f(x_0)+f[x_0,x_1](x - x_0) f(x)=f(x0)+f[x0,x1](xx0)
+ f [ x 0 , x 1 , x 2 ] ( x − x 0 ) ( x − x 1 ) + ⋯ +f[x_0,x_1,x_2](x - x_0)(x - x_1)+\cdots +f[x0,x1,x2](xx0)(xx1)+
+ f [ x 0 , x 1 , ⋯ , x n − 2 , x n − 1 ] ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 3 ) ( x − x n − 2 ) +f[x_0,x_1,\cdots,x_{n - 2},x_{n - 1}](x - x_0)(x - x_1)\cdots(x - x_{n - 3})(x - x_{n - 2}) +f[x0,x1,,xn2,xn1](xx0)(xx1)(xxn3)(xxn2)
+ f [ x 0 , x 1 , ⋯ , x n − 1 , x n ] ( x − x 0 ) ( x − x 1 ) ⋯ ( x − x n − 2 ) ( x − x n − 1 ) +f[x_0,x_1,\cdots,x_{n - 1},x_n](x - x_0)(x - x_1)\cdots(x - x_{n - 2})(x - x_{n - 1}) +f[x0,x1,,xn1,xn](xx0)(xx1)(xxn2)(xxn1)

  • 差商定义:
    f [ x 0 , x k ] = f ( x k ) − f ( x 0 ) x k − x 0 f[x_0,x_k]=\frac{f(x_k)-f(x_0)}{x_k - x_0} f[x0,xk]=xkx0f(xk)f(x0)为函数 f ( x ) f(x) f(x)关于点 x 0 , x k x_0,x_k x0,xk的一阶差商(亦称均差).

  • 二阶差商:
    f [ x 0 , x 1 , x 2 ] = f [ x 1 , x 2 ] − f [ x 0 , x 1 ] x 2 − x 0 f[x_0,x_1,x_2]=\frac{f[x_1,x_2]-f[x_0,x_1]}{x_2 - x_0} f[x0,x1,x2]=x2x0f[x1,x2]f[x0,x1]

  • K阶差商:( x k , x k − 1 x_k,x_{k - 1} xk,xk1可以不相邻)
    f [ x 0 , x 1 , ⋯ , x k ] = f [ x 1 , ⋯ , x k − 1 , x k ] − f [ x 0 , x 1 , ⋯ , x k − 1 ] x k − x 0 f[x_0,x_1,\cdots,x_k]=\frac{f[x_1,\cdots,x_{k - 1},x_k]-f[x_0,x_1,\cdots,x_{k - 1}]}{x_k - x_0} f[x0,x1,,xk]=xkx0f[x1,,xk1,xk]f[x0,x1,,xk1]

与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性。但是牛顿插值也存在龙格现象的问题。同时,两种插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的性态。然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值

Hermite埃尔米特插值

原理

  • 设函数 f ( x ) f(x) f(x)在区间 [ a , b ] [a,b] [a,b]上有 n + 1 n + 1 n+1个互异节点 a = x 0 < x 1 < x 2 < ⋯ < x n = b a = x_0 < x_1 < x_2 < \cdots < x_n = b a=x0<x1<x2<<xn=b
  • 定义在 [ a , b ] [a,b] [a,b]上函数 f ( x ) f(x) f(x)在节点上满足:
    f ( x i ) = y i , f ′ ( x i ) = y i ′ ( i = 0 , 1 , 2 , ⋯ , n ) f(x_i)=y_i,f'(x_i)=y_i'\ (i = 0,1,2,\cdots,n) f(xi)=yi,f(xi)=yi (i=0,1,2,,n) 2 n + 2 2n + 2 2n+2个条件)
  • 可唯一确定一个次数不超过 2 n + 1 2n + 1 2n+1的多项式 H 2 n + 1 ( x ) = H ( x ) H_{2n + 1}(x)=H(x) H2n+1(x)=H(x)满足:
    H ( x j ) = y j , H ′ ( x j ) = m j ( j = 0 , 1 , ⋯ , n ) H(x_j)=y_j,\ H'(x_j)=m_j\ (j = 0,1,\cdots,n) H(xj)=yj, H(xj)=mj (j=0,1,,n).
  • 其余项为:
    R ( x ) = f ( x ) − H ( x ) = f ( 2 n + 2 ) ( ξ ) ( 2 n + 2 ) ! ω 2 n + 2 ( x ) R(x)=f(x)-H(x)=\frac{f^{(2n + 2)}(\xi)}{(2n + 2)!}\omega_{2n + 2}(x) R(x)=f(x)H(x)=(2n+2)!f(2n+2)(ξ)ω2n+2(x)

可以看到,直接使用Hermite插值得到的次数较高,也存在龙格现象,因此在实际应用中,往往使用分段三次Hermite插值多项式(pchip).

分段三次埃尔米特插值

构造
  • 已知给定 n + 1 n + 1 n+1个节点 x 0 , x 1 , ⋯ , x n x_0,x_1,\cdots,x_n x0,x1,,xn,以及对应的函数值 y 0 , y 1 , ⋯ , y n y_0,y_1,\cdots,y_n y0,y1,,yn和导数值 m 0 , m 1 , ⋯ , m n m_0,m_1,\cdots,m_n m0,m1,,mn

  • 函数值基函数 h i ( x ) h_i(x) hi(x)

    • 对于节点 x i x_i xi,构造函数值基函数 h i ( x ) h_i(x) hi(x),使其满足 h i ( x j ) = δ i j h_i(x_j)=\delta_{ij} hi(xj)=δij(其中 δ i j \delta_{ij} δij是克罗内克符号,当 i = j i = j i=j时, δ i j = 1 \delta_{ij}=1 δij=1;当 i ≠ j i\neq j i=j时, δ i j = 0 \delta_{ij}=0 δij=0)。
    • 一种常见的构造方式是:
      h i ( x ) = ( 1 + 2 x − x i x i + 1 − x i ) ( x − x i + 1 x i − x i + 1 ) 2 h_i(x)=\left(1 + 2\frac{x - x_i}{x_{i + 1}-x_i}\right)\left(\frac{x - x_{i + 1}}{x_i - x_{i + 1}}\right)^2 hi(x)=(1+2xi+1xixxi)(xixi+1xxi+1)2,当 i = 0 , 1 , ⋯ , n − 1 i = 0,1,\cdots,n - 1 i=0,1,,n1
      h n ( x ) = ( 1 + 2 x − x n x n − 1 − x n ) ( x − x n − 1 x n − x n − 1 ) 2 h_n(x)=\left(1 + 2\frac{x - x_n}{x_{n - 1}-x_n}\right)\left(\frac{x - x_{n - 1}}{x_n - x_{n - 1}}\right)^2 hn(x)=(1+2xn1xnxxn)(xnxn1xxn1)2
  • 导数值基函数 h ^ i ( x ) \hat{h}_i(x) h^i(x)

    • 构造导数值基函数 h ^ i ( x ) \hat{h}_i(x) h^i(x),使其满足 h ^ i ′ ( x j ) = δ i j \hat{h}_i'(x_j)=\delta_{ij} h^i(xj)=δij
    • 例如:
      h ^ i ( x ) = ( x − x i ) ( x − x i + 1 x i − x i + 1 ) 2 \hat{h}_i(x)=(x - x_i)\left(\frac{x - x_{i + 1}}{x_i - x_{i + 1}}\right)^2 h^i(x)=(xxi)(xixi+1xxi+1)2,当 i = 0 , 1 , ⋯ , n − 1 i = 0,1,\cdots,n - 1 i=0,1,,n1
      h ^ n ( x ) = ( x − x n ) ( x − x n − 1 x n − x n − 1 ) 2 \hat{h}_n(x)=(x - x_n)\left(\frac{x - x_{n - 1}}{x_n - x_{n - 1}}\right)^2 h^n(x)=(xxn)(xnxn1xxn1)2
  • 构造三次埃尔米特插值多项式 H ( x ) H(x) H(x)
    H ( x ) = ∑ i = 0 n [ y i h i ( x ) + m i h ^ i ( x ) ] H(x)=\sum_{i = 0}^{n}[y_ih_i(x)+m_i\hat{h}_i(x)] H(x)=i=0n[yihi(x)+mih^i(x)]

应用

Matlab有内置的函数(直接调用就行了):
p = pchip(x,y,new_x)
x,y是已知的样本点的坐标,new_x是插值横坐标

x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = pchip(x,y,new_x);
plot(x, y, 'o', new_x, p, 'r-')

三次样条插值

定义

y = f ( x ) y = f(x) y=f(x)在点 x 0 , x 1 , x 2 , ⋯ x n x_0,x_1,x_2,\cdots x_n x0,x1,x2,xn的值为 y 0 , y 1 , y 2 , ⋯ y n y_0,y_1,y_2,\cdots y_n y0,y1,y2,yn,若函数 S ( x ) S(x) S(x)满足下列条件

  • S ( x i ) = f ( x i ) = y i S(x_i)=f(x_i)=y_i S(xi)=f(xi)=yi i = 0 , 1 , 2 , ⋯ , n i = 0,1,2,\cdots,n i=0,1,2,,n
  • 在每个子区间 [ x i , x i + 1 ] ( i = 0 , 1 , 2 , ⋯ , n − 1 ) [x_i,x_{i + 1}](i = 0,1,2,\cdots,n - 1) [xi,xi+1](i=0,1,2,,n1) S ( x ) S(x) S(x)是三次多项式
  • S ( x ) S(x) S(x) [ a , b ] [a,b] [a,b]上二阶连续可微。

则称 S ( x ) S(x) S(x)为函数 f ( x ) f(x) f(x)的三次样条插值函数。

  • S ( x ) S(x) S(x)除了满足基本插值条件 s ( x i ) = f i s(x_i)=f_i s(xi)=fi外还应具有如下形式:
    S ( x ) = { S 0 ( x ) , x ∈ [ x 0 , x 1 ] , S 1 ( x ) , x ∈ [ x 1 , x 2 ] , ⋮ S n − 1 ( x ) , x ∈ [ x n − 1 , x n ] ; S(x)=\begin{cases} S_0(x), & x\in[x_0,x_1], \\ S_1(x), & x\in[x_1,x_2], \\ \vdots \\ S_{n - 1}(x), & x\in[x_{n - 1},x_n]; \end{cases} S(x)= S0(x),S1(x),Sn1(x),x[x0,x1],x[x1,x2],x[xn1,xn];
    S i ( x ) ∈ C 3 ( [ x i , x i + 1 ] ) S_i(x)\in C^3([x_i,x_{i + 1}]) Si(x)C3([xi,xi+1]).
    并且满足条件:
    { S i − 1 ( x i ) = S i ( x i ) , S i − 1 ′ ( x i ) = S i ′ ( x i ) , S i − 1 ′ ′ ( x i ) = S i ′ ′ ( x i ) , \begin{cases} S_{i - 1}(x_i)=S_i(x_i), \\ S_{i - 1}'(x_i)=S_i'(x_i), \\ S_{i - 1}''(x_i)=S_i''(x_i), \end{cases} Si1(xi)=Si(xi),Si1(xi)=Si(xi),Si1′′(xi)=Si′′(xi),

应用

Matlab有内置的函数:
p = spline (x,y, new_x)
x,y是已知的样本点的坐标,new_x是要插入处对应的横坐标

x = -pi:pi;
y = sin(x);
new_x = -pi:0.1:pi;
p1 = pchip(x,y,new_x);    %分段三次埃尔米特插值
p2 = spline(x,y,new_x);   %三次样条插值
plot(x,y,'o',new_x,p1,'r-',new_x,p2,'b-')
Legend('样本点','三次埃尔米特插值','三次样条插值','Location','SouthEast')    %标注显示在东南方向

三次Hermite插值和三次样条插值的对比

在这里插入图片描述
三次样条比Hermite更光滑,实际应用中两种都可以使用

n维数据的插值

这个了解即可。
p = interpn(x1,x2,...,xn, y, new_x1,new_x2,...,new_xn, method)
x1,x2,...,xn是已知的样本点的横坐标
y是已知的样本点的纵坐标
new_x1,new_x2,...,new_xn是要插入点的横坐标
method是要插值的方法
‘linear’: 线性插值 (默认算法);
‘cubic’: 三次插值;
‘spline’: 三次样条插值法; (最为精准)
‘nearest’: 最邻近插值算法。

x = -pi:pi; y = sin(x);
new_x = -pi:0.1:pi;
p = interpn (x, y, new_x,'spline');
%等价于p = spline(x, y, new_x);
plot(x, y, 'o', new_x, p, 'r-')

省流:本栏最有用的两行
p = pchip(x,y,new_x)
p = spline (x,y, new_x)


拟合算法

插值算法中,得到的多项式 f ( x ) f(x) f(x)要经过所有样本点。但是如果样本点太多,那么这个多项式次数过高,会造成龙格现象。
比如说这个例子
在这里插入图片描述
尽管我们可以选择分段的方法避免龙格现象,但是更多时候我们更倾向于得到一个确定的曲线,尽管这条曲线不能经过每一个样本点,但只要保证误差足够小即可,这就是拟合的思想。(拟合的结果是得到一个确定的较为简单的曲线)

最小二乘法

高中学的 懒得解释。
在这里插入图片描述
在这里插入图片描述
解释一下 k , b = arg min ⁡ k , b ( f ( x ) ) k,b=\argmin_{\substack{k,b}}(f(x)) k,b=k,bargmin(f(x))指的是求使得 f ( x ) f(x) f(x)取最小值时的参数 k , b k,b k,b的值

  • 推导过程:
    在这里插入图片描述
  • 结论:

k ^ = n ∑ i = 1 n x i y i − ∑ i = 1 n y i ∑ i = 1 n x i n ∑ i = 1 n x i 2 − ∑ i = 1 n x i ∑ i = 1 n x i \hat{k} = \frac{n\sum_{i = 1}^{n}x_iy_i - \sum_{i = 1}^{n}y_i\sum_{i = 1}^{n}x_i}{n\sum_{i = 1}^{n}x_i^2 - \sum_{i = 1}^{n}x_i\sum_{i = 1}^{n}x_i} k^=ni=1nxi2i=1nxii=1nxini=1nxiyii=1nyii=1nxi
b ^ = ∑ i = 1 n x i 2 ∑ i = 1 n y i − ∑ i = 1 n x i ∑ i = 1 n x i y i n ∑ i = 1 n x i 2 − ∑ i = 1 n x i ∑ i = 1 n x i \hat{b} = \frac{\sum_{i = 1}^{n}x_i^2\sum_{i = 1}^{n}y_i - \sum_{i = 1}^{n}x_i\sum_{i = 1}^{n}x_iy_i}{n\sum_{i = 1}^{n}x_i^2 - \sum_{i = 1}^{n}x_i\sum_{i = 1}^{n}x_i} b^=ni=1nxi2i=1nxii=1nxii=1nxi2i=1nyii=1nxii=1nxiyi

拟合评价

  • 三个基本概念

    • 总体平方和 S S T SST SST (Total sum of squares): S S T = ∑ i = 1 n ( y i − y ˉ ) 2 SST = \sum_{i = 1}^{n}(y_i - \bar{y})^2 SST=i=1n(yiyˉ)2

    • 误差平方和 S S E SSE SSE (The sum of squares due to error): S S E = ∑ i = 1 n ( y i − y ^ i ) 2 SSE = \sum_{i = 1}^{n}(y_i - \hat{y}_i)^2 SSE=i=1n(yiy^i)2

    • 回归平方和 S S R SSR SSR (Sum of squares of the regression): S S R = ∑ i = 1 n ( y ^ i − y ˉ ) 2 SSR = \sum_{i = 1}^{n}(\hat{y}_i - \bar{y})^2 SSR=i=1n(y^iyˉ)2

  • 可以证明: S S T = S S E + S S R SST = SSE + SSR SST=SSE+SSR

    • 证明:在这里插入图片描述
  • 拟合优度: 0 ≤ R 2 = S S R S S T = S S T − S S E S S T = 1 − S S E S S T ≤ 1 0 \leq R^2 = \frac{SSR}{SST} = \frac{SST - SSE}{SST} = 1 - \frac{SSE}{SST} \leq 1 0R2=SSTSSR=SSTSSTSSE=1SSTSSE1
    R 2 R^2 R2越接近 1 1 1,说明误差平方和 S S E SSE SSE 越接近 0 0 0说明拟合的越好

  • 注意: R 2 R^2 R2只能用于拟合函数是线性函数时,拟合结果的评价.
    线性函数和其他函数(如复杂的指数函数)比较拟合的好坏,直接看 S S E SSE SSE即可

    • 线性函数的界定:这里我们说的线性函数指的是对参数为线性,即在函数中,参数仅以一次方出现,并且不能乘以或除以其他任何参数,也不能出现参数的复合函数形式。
      形如 y = a + b x 2 y=a+bx^2 y=a+bx2 是线性函数,这里的参数就是 a , b a,b a,b.
      形如 y = a + b 3 x y = a + b^{3}x y=a+b3x y = a + b x + b c x 2 y = a + bx + bcx^{2} y=a+bx+bcx2 y = a ( x − b ) 2 y = a(x - b)^{2} y=a(xb)2 y = a sin ⁡ ( b + c x ) y = a\sin(b + cx) y=asin(b+cx)都不是线性函数,不能用 R 2 R^{2} R2.

实际应用中,常使用多个不同的拟合函数去试,然后比较这几个拟合函数的拟合优度,取最优的一个拟合函数。
曲线复杂度与拟合误差之间的取舍:次数越高(或者指数函数越复杂),误差越小,但是产生龙格现象的概率越大,且函数曲线越复杂。(一个理解:在插值算法中,曲线经过每一个点,那么曲线的 S S E SSE SSE即为0,如果放在拟合算法中来讲,这种曲线的拟合优度极高,但是曲线本身十分复杂,这就违背了拟合的初衷)
因此实际上,如果两个拟合函数的 S S E SSE SSE相差不大,但是曲线复杂度相差较大,那么就取明显更为简单的那个函数,哪怕它的 S S E SSE SSE相较另一个更大一点。

y\_hat = k*x+b;  % y的拟合值
SSR = sum((y\_hat-mean(y)).^2)  % 回归平方和 注:mean()是求均值的函数。
SSE = sum((y\_hat-y).^2)  % 误差平方和
SST = sum((y-mean(y)).^2)  % 总体平方和
SST-SSE-SSR
R\_2 = SSR / SST

Matlab自带拟合工具箱cftool

在这里插入图片描述
在这里插入图片描述

  • 拟合方法

    • Custom Equations:用户自定义的函数类型 注意修改范围Fit options
    • Exponential:指数逼近,有2种类型, a ∗ e x p ( b ∗ x ) a*exp(b*x) aexp(bx) a ∗ e x p ( b ∗ x ) + c ∗ e x p ( d ∗ x ) a*exp(b*x) + c*exp(d*x) aexp(bx)+cexp(dx)
    • Fourier:傅立叶逼近,有7种类型,基础型是 a 0 + a 1 ∗ c o s ( x ∗ w ) + b 1 ∗ s i n ( x ∗ w ) a0 + a1*cos(x*w) + b1*sin(x*w) a0+a1cos(xw)+b1sin(xw)
    • Gaussian:高斯逼近,有8种类型,基础型是 a 1 ∗ e x p ( − ( ( x − b 1 ) / c 1 ) 2 ) a1*exp(-((x-b1)/c1)^2) a1exp(((xb1)/c1)2)
    • Interpolant:插值逼近,有4种类型,linear、nearest neighbor、cubic spline、shape-preserving
    • Polynomial:多形式逼近,有9种类型,linear ~、quadratic ~、cubic ~、4-9th degree ~
    • Power:幂逼近,有2种类型, a ∗ x b 、 a ∗ x b + c a*x^b 、a*x^b + c axbaxb+c
    • Rational:有理数逼近,分子、分母共有的类型是linear ~、quadratic ~、cubic ~、4-5th degree ~;此外,分子还包括constant型
    • Smoothing Spline:平滑逼近
    • Sum of Sin Functions:正弦曲线逼近,有8种类型,基础型是 a 1 ∗ s i n ( b 1 ∗ x + c 1 ) a1*sin(b1*x + c1) a1sin(b1x+c1)
    • Weibull:只有一种, a ∗ b ∗ x ( b − 1 ) ∗ e x p ( − a ∗ x b ) a*b*x^{(b-1)}*exp(-a*x^b) abx(b1)exp(axb)
  • 拟合工具还可以直接生成代码Generate code,可放在附录里。

  • 小tips:导出图像可以在文件-导出设置-渲染-修改分辨率,使图更清晰

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66791.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.2 WSL中安装Centos7

官网链接使用 WSL 访问网络应用程序 | Microsoft Learn 一、Win安装WSL配置 WSL官网链接使用 WSL 访问网络应用程序 | Microsoft Learn 1.1 命令模式开启虚拟化设置步骤 # 启用适用于 Linux 的 Windows 子系统&#xff1a;打开powershell并输入&#xff1a; dism.exe /onli…

有收到腾讯委托律师事务所向AppStore投诉带有【水印相机】主标题名称App的开发者吗

近期&#xff0c;有多名开发者反馈&#xff0c;收到来自腾讯科技 (深圳) 有限公司委托北京的一家**诚律师事务所卞&#xff0c;写给AppStore的投诉邮件。 邮件内容主要说的是&#xff0c;腾讯注册了【水印相机】这四个字的商标&#xff0c;所以你们这些在AppStore上的app&…

linux网络 | https前置知识 | 数据加密与解密、数据摘要

前言:本节内容讲述https的相关内容。 https博主会着重讲解https如何让一个请求和一个响应能够安全的进行交互。 https博主将用两篇文章进行讲解。本篇是两篇中第一篇。会把http的安全问题引出来&#xff0c; 然后说一下https的基本解决方法。 下面废话不多说&#xff0c; 开始我…

安科瑞 Acrel-1000DP 分布式光伏监控系统在工业厂房分布式光伏发电项目中的应用

吕梦怡 18706162527 摘 要&#xff1a;常规能源以煤、石油、天然气为主&#xff0c;不仅资源有限&#xff0c;而且会造成严重的大气污染&#xff0c;开发清洁的可再生能源已经成为当今发展的重要任务&#xff0c;“节能优先&#xff0c;效率为本”的分布式发电能源符合社会发…

视频编辑最新SOTA!港中文Adobe等发布统一视频生成传播框架——GenProp

文章链接&#xff1a;https://arxiv.org/pdf/2412.19761 项目链接&#xff1a;https://genprop.github.io 亮点直击 定义了一个新的生成视频传播问题&#xff0c;目标是利用 I2V 模型的生成能力&#xff0c;将视频第一帧的各种变化传播到整个视频中。 精心设计了模型 GenProp&…

年度技术突破奖|中兴微电子引领汽车芯片新变革

随着以中央计算区域控制为代表的新一代整车电子架构逐步成为行业主流&#xff0c;车企在电动化与智能化之后&#xff0c;正迎来以架构创新为核心的新一轮技术竞争。中央计算SoC&#xff0c;作为支撑智驾和智舱高算力需求的核心组件&#xff0c;已成为汽车电子市场的重要新增量。…

后门原理与实践

实验目录 windows主机与kali虚拟机实现互联互通使用netcat获取主机操作Shell&#xff0c;cron启动使用socat获取主机操作Shell, 任务计划启动使用MSF meterpreter生成可执行文件&#xff0c;利用ncat或socat传送到主机并运行获取主机Shell使用MSF meterpreter生成获取目标主机…

Apache Hop从入门到精通 第一课 揭开Apache Hop神秘面纱

一、Apache Hop是什么&#xff1f; 1、Apache Hop&#xff0c;简称Hop&#xff0c;全称为Hop Orchestration Platform&#xff0c;即Hop 工作编排平台&#xff0c;是一个数据编排和数据工程平台&#xff0c;旨在促进数据和元数据编排的所有方面。Hop让你专注于你想要解决的问题…

嵌入式C语言:什么是指针?

目录 一、指针的基本概念 1.1. 定义指针 1.2. 赋值给指针 1.3. 解引用指针 1.4. 指针运算 1.5. 空指针 1.6. 函数参数 1.7. 数组和指针 1.8. 示例代码 二、指针在内存中的表示 2.1. 内存地址存储 2.2. 内存模型 2.3. 指针与硬件交互 2.4. 示例代码 三 、指针的重…

带格式 pdf 翻译

支持 openAI 接口&#xff0c;国内 deepseek 接口兼容 openAI 接口&#xff0c; deepseek api 又非常便宜 https://pdf2zh.com/ https://github.com/Byaidu/PDFMathTranslate

【redis初阶】初识Redis

目录 一、初识Redis 二、盛赞 Redis 三、Redis 特性 3.1 速度快 ​编辑3.2 基于键值对的数据结构服务器 3.3 丰富的功能 3.4 简单稳定 &#x1f436; 3.6 持久化&#xff08;Persistence&#xff09; 3.7 主从复制&#xff08;Replication&#xff09; 3.8 高可用&#xff08;H…

虚拟机Linux Red Hat 7.9 Docker部署.Net 7 Zr.Admin项目(后端)

0、环境信息 应用部署在虚拟机里的docker&#xff0c;里面的应用访问宿主主机的MySQL 1、开启MySQL远程访问 使用非安装版MySQL参考Windows 使用 非安装版MySQL 8 为了避免出现 Host is not allowed to connect to this MySQL server 使用root用户登录 cmd进入到MySQL的bi…

UE小白学习日记

Level UE中的Level(关卡)和Unity中的Scene(场景)在概念和用途上非常相似,都是用来组织和管理3D环境的基本单位。让我为您详细对比一下: 相似之处: 它们都是游戏世界的容器,可以包含游戏对象、光照、地形等元素都支持场景/关卡的切换和加载都可以用来划分游戏内容,比如不同关…

cmake - build MS STL project

文章目录 cmake - build MS STL project概述笔记END cmake - build MS STL project 概述 MS在github上开源了VS IDE 用的STL实现。 想看看微软的测试用例中怎么用STL. 想先用CMake编译一个MS STL发布版出来。 笔记 CMake需要3.30以上, 拟采用 cmake-3.30.6-windows-x86_64.…

微信小程序之历史上的今天

微信小程序之历史上的今天 需求描述 今天我们再来做一个小程序&#xff0c;主要是搜索历史上的今天发生了哪些大事&#xff0c;结果如下 当天的历史事件或者根据事件选择的历史事件的列表&#xff1a; 点击某个详细的历史事件以后看到详细信息&#xff1a; API申请和小程序…

错误修改系列---基于RNN模型的心脏病预测(pytorch实现)

前言 前几天发布了pytorch实现&#xff0c;TensorFlow实现为&#xff1a;基于RNN模型的心脏病预测(tensorflow实现)&#xff0c;但是一处繁琐地方 一处错误&#xff0c;这篇文章进行修改&#xff0c;修改效果还是好了不少&#xff1b;源文章为&#xff1a;基于RNN模型的心脏病…

vue.js+vite搭建一个简单的新春祈福活动网站

vue.jsvite搭建一个简单的新春祈福活动网站&#xff01;使用canvas技术&#xff0c;绘制视觉特效。 功能有&#xff1a;燃放烟花&#xff0c;和撞钟祈福。祈福撞钟我设计了是按钮事件&#xff0c;播放一个mp4动画&#xff0c;配上播放一段撞钟的生效文件mp3. <template>&…

有机物谱图信息的速查技巧有哪些?

谱图信息是化学家解读分子世界的“语言”&#xff0c;它们在化学研究的各个领域都发挥着不可或缺的作用。它们是理解和确定分子结构的关键&#xff0c;对化学家来说极为重要&#xff0c;每一种谱学技术都提供了不同的视角来观察分子&#xff0c;从而揭示其独特的化学和物理特性…

视频转码对画质有影响吗?视频融合平台EasyCVR支持哪些转码格式?

视频转码过程是将视频文件从一种编码格式转换为另一种格式的过程&#xff0c;这一过程在现代数字媒体中扮演着至关重要的角色。众所周知&#xff0c;视频转码不仅仅是简单的格式转换&#xff0c;它涉及多个关键参数的改变&#xff0c;例如视频编码格式、比特率、分辨率以及帧率…

微信小程序防止重复点击事件

直接写在app.wpy里面&#xff0c;全局可以调用 // 防止重复点击事件preventActive(fn) {const self this;if (this.globalData.PageActive) {this.globalData.PageActive false;if (fn) fn();setTimeout(() > {self.globalData.PageActive true;}, 3000); //设置该时间内…