【数模学习笔记】插值算法和拟合算法
声明:以下笔记中的图片以及内容
均整理自“数学建模学习交流”清风老师的课程资料,仅用作学习交流使用
文章目录
- 插值算法
- 定义
- 三个类型插值举例
- 插值多项式
- 分段插值
- 三角插值
- 一般插值多项式
- 原理
- 拉格朗日插值法
- 龙格现象
- 分段线性插值
- 牛顿插值法
- 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 a≤x0<x1<⋯<xn≤b
上的值分别为: y 0 , y 1 , ⋯ , y n y_0,y_1,\cdots,y_n y0,y1,⋯,yn,
若存在一简单函数 P ( x ) P(x) P(x),使
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)。
- 设 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,将已知点代入可得方程组:
分段插值
- 示例:假设我们要对函数 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=n2kπ, k = 0 , 1 , ⋯ , n − 1 k = 0,1,\cdots,n - 1 k=0,1,⋯,n−1,已知这些节点上的函数值 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=π1∫02π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=π1∫02π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,0≤x<ππ≤x<2π,通过计算上述积分可以得到相应的三角插值多项式 S n ( x ) S_n(x) Sn(x),用它来近似原函数 f ( x ) f(x) f(x)在整个周期上的行为。
- 三角插值多项式可以表示为 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通过以下公式计算:
这些插值方法在不同的场景下各有优势,分段插值可以避免高次多项式的振荡问题,插值多项式计算相对简单,三角插值适用于周期函数等情况,它们都为函数的近似和数据的处理提供了有效的手段。
一般插值多项式
原理
- 定理:
- 设有 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= 11⋮1x0x1⋮xn⋯⋯⋯⋯x0nx1n⋮xnn
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=1n∏j=0i−1(xi−xj)=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)=x0−x1x−x1y0+x1−x0x−x0y1 -
三个点: ( 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)=(x0−x1)(x0−x2)(x−x1)(x−x2)y0+(x1−x0)(x1−x2)(x−x0)(x−x2)y1+(x2−x0)(x2−x1)(x−x0)(x−x1)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)=(x−x0)(x−x1)⋯(x−xn)
则 ω 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)=(xk−x0)⋯(xk−xk−1)(xk−xk+1)⋯(xk−xn).
记 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)=(xi−x0)⋯(xi−xi−1)(xi−xi+1)⋯(xi−xn)(x−x0)⋯(x−xi−1)(x−xi+1)⋯(x−xn)
= ( 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)} =(x−xi)(xi−x0)⋯(xi−xi−1)(xi−xi+1)⋯(xi−xn)(x−x0)⋯(x−xi−1)(x−xi)(x−xi+1)⋯(x−xn)
= ω n + 1 ( x ) ( x − x i ) ω n + 1 ′ ( x i ) =\frac{\omega_{n + 1}(x)}{(x - x_i)\omega_{n + 1}'(x_i)} =(x−xi)ω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(x−xk)ω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} xi−1,xi,xi+1进行二次插值。
即在每一个区间 [ x i − 1 , x i + 1 ] [x_{i - 1},x_{i + 1}] [xi−1,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=i−1∑i+1[ykj=i−1j=k∏i+1(xk−xj)(x−xj)]
这种分段的低次插值称为分段二次插值,在几何上就是用分段抛物线代替 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](x−x0)
+ 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](x−x0)(x−x1)+⋯
+ 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,⋯,xn−2,xn−1](x−x0)(x−x1)⋯(x−xn−3)(x−xn−2)
+ 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,⋯,xn−1,xn](x−x0)(x−x1)⋯(x−xn−2)(x−xn−1)
-
差商定义:
称 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]=xk−x0f(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]=x2−x0f[x1,x2]−f[x0,x1] -
K阶差商:( x k , x k − 1 x_k,x_{k - 1} xk,xk−1可以不相邻)
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]=xk−x0f[x1,⋯,xk−1,xk]−f[x0,x1,⋯,xk−1]
与拉格朗日插值法相比,牛顿插值法的计算过程具有继承性。但是牛顿插值也存在龙格现象的问题。同时,两种插值仅仅要求插值多项式在插值节点处与被插函数有相等的函数值,而这种插值多项式却不能全面反映被插值函数的性态。然而在许多实际问题中,不仅要求插值函数与被插值函数在所有节点处有相同的函数值,它也需要在一个或全部节点上插值多项式与被插函数有相同的低阶甚至高阶的导数值。
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+1−xix−xi)(xi−xi+1x−xi+1)2,当 i = 0 , 1 , ⋯ , n − 1 i = 0,1,\cdots,n - 1 i=0,1,⋯,n−1;
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+2xn−1−xnx−xn)(xn−xn−1x−xn−1)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)=(x−xi)(xi−xi+1x−xi+1)2,当 i = 0 , 1 , ⋯ , n − 1 i = 0,1,\cdots,n - 1 i=0,1,⋯,n−1;
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)=(x−xn)(xn−xn−1x−xn−1)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,⋯,n−1)上 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),⋮Sn−1(x),x∈[x0,x1],x∈[x1,x2],x∈[xn−1,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} ⎩ ⎨ ⎧Si−1(xi)=Si(xi),Si−1′(xi)=Si′(xi),Si−1′′(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^=n∑i=1nxi2−∑i=1nxi∑i=1nxin∑i=1nxiyi−∑i=1nyi∑i=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^=n∑i=1nxi2−∑i=1nxi∑i=1nxi∑i=1nxi2∑i=1nyi−∑i=1nxi∑i=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(yi−yˉ)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(yi−y^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^i−yˉ)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 0≤R2=SSTSSR=SSTSST−SSE=1−SSTSSE≤1
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(x−b)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) a∗exp(b∗x) 、 a ∗ e x p ( b ∗ x ) + c ∗ e x p ( d ∗ x ) a*exp(b*x) + c*exp(d*x) a∗exp(b∗x)+c∗exp(d∗x)
- 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+a1∗cos(x∗w)+b1∗sin(x∗w)
- Gaussian:高斯逼近,有8种类型,基础型是 a 1 ∗ e x p ( − ( ( x − b 1 ) / c 1 ) 2 ) a1*exp(-((x-b1)/c1)^2) a1∗exp(−((x−b1)/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 a∗xb、a∗xb+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) a1∗sin(b1∗x+c1)
- Weibull:只有一种, a ∗ b ∗ x ( b − 1 ) ∗ e x p ( − a ∗ x b ) a*b*x^{(b-1)}*exp(-a*x^b) a∗b∗x(b−1)∗exp(−a∗xb)
- Custom Equations:用户自定义的函数类型 注意修改范围
-
拟合工具还可以直接生成代码
Generate code
,可放在附录里。 -
小tips:导出图像可以在文件-导出设置-渲染-修改分辨率,使图更清晰
相关文章:
【数模学习笔记】插值算法和拟合算法
声明:以下笔记中的图片以及内容 均整理自“数学建模学习交流”清风老师的课程资料,仅用作学习交流使用 文章目录 插值算法定义三个类型插值举例插值多项式分段插值三角插值 一般插值多项式原理拉格朗日插值法龙格现象分段线性插值 牛顿插值法 Hermite埃尔…...
JavaScript 数组及其常用方法
1. JavaScript 数组概述 数组是 JavaScript 中用于存储多个值的数据结构。它可以存储不同类型的元素,并提供强大的方法来操作和管理数据。数组的元素按索引(从 0 开始)进行访问。 2. 数组的创建方式 1) 使用数组字面量 let fruits [&quo…...
SQL HAVING 子句深入解析
SQL HAVING 子句深入解析 介绍 SQL(Structured Query Language)是一种用于管理关系数据库管理系统的标准编程语言。在SQL中,HAVING子句是与GROUP BY子句一起使用的,用于筛选分组后的数据。它根据聚合函数的结果对组进行条件过滤…...
vue3+ts的几个bug调试
由于编译问题,把几个type检查给关闭了,否则错误太多。 1)第一个检查出的问题,拼写错误数组的length,写成了lengh。 2)数组的对象引用。 torStatus Array(8).fill({ ...defaultStatus }) as TorStatus[]…...
git: hint:use --reapply-cherry-picks to include skipped commits
问: 当我在feture分支写完功能,切换到dev更新了远端dev代码,切回feture分支,git rebase dev分支后出现报错: warning skipped previously applied commit 709xxxx hint:use --reapply-cherry-picks to include skippe…...
Microsoft Sql Server 2019 数据类型
数据类型 bigint、int、smallint、tinyint 使用整数数据的精确数字数据类型。 若要节省数据库空间,请使用能够可靠包含所有可能值的最小数 据类型。 例如,对于一个人的年龄,tinyint 就足够了,因为没人活到 255 岁以上。 但对于建筑物的 年龄,tinyint 就不再适应,因为建…...
C++实现设计模式---代理模式 (Proxy)
代理模式 (Proxy) 代理模式 是一种结构型设计模式,它为其他对象提供一个代理以控制对该对象的访问。代理模式常用于延迟加载、访问控制、智能引用等场景。 意图 提供对某对象的控制。控制对目标对象的访问,通常用于在不改变目标对象的情况下࿰…...
微信小程序用的SSL证书有什么要求吗?
微信小程序主要建立在手机端使用,然而手机又涉及到各种系统及版本,所以对SSL证书也有要求,如果要小程序可以安全有效的访问需要满足以下要求: 1、原厂SSL证书(原厂封)。 2、DV单域名或者DV通配符。 3、兼…...
Flutter中Get.snackbar和Get.dialog关闭冲突问题记录
背景: 在使用GetX框架时,同时使用了Get.snackbar提示框和Get.dialog加载框,当这两个widget同时存在时,Get.dialog加载框调用Get.back()无法正常关闭。 冲突解释: 之所以会产生冲突,是因为Get.snackbar在关…...
命令模式-Command Pattern
什么是命令模式 命令模式是一种行为类设计模式,核心是将每种请求或操作封装为一个独立的对象,从而可以集中管理这些请求或操作,比如将请求队列化依次执行、或者对操作进行记录和撤销。 命令模式通过将请求的发送者(客户端)和接收者(执行请求…...
【Linux笔记】Day1
基于韩顺平老师课程记录: https://www.bilibili.com/video/BV1Sv411r7vd 安装CentOS 给CentOS手动分区 分为三个区: boot分区(给1G就行) 交换分区(和内存相关,这里和虚拟机的内存2G一致) …...
如何明智地提问
如何明智地提问的重要总结,让我为主要观点添加一些具体的实践建议: 提问前的准备工作 尝试在 Google、Stack Overflow 等平台搜索相似问题阅读相关文档和错误日志尝试自己调试和排查问题记录下已尝试过的解决方案 选择合适的提问平台 Stack Overflow…...
【大前端】Vue3 工程化项目使用详解
目录 一、前言 二、前置准备 2.1 环境准备 2.1.1 create-vue功能 2.1.2 nodejs环境 2.1.3 配置nodejs的环境变量 2.1.4 更换安装包的源 三、工程化项目创建与启动过程 3.1 创建工程化项目 3.2 项目初始化 3.3 项目启动 3.4 核心文件说明 四、VUE两种不同的API风格 …...
window.print()预览时表格显示不全
问题描述:使用element的table组件,表格列宽为自适应,但使用window.print()方法预览的页面会直接按预览宽度截取表格内容进行展示,造成表格可能的显示不全问题 解决方法:添加如下样式 media print {::v-deep {// 表头…...
《解锁鸿蒙Next系统人工智能语音助手开发的关键步骤》
在当今数字化时代,鸿蒙Next系统与人工智能的融合为开发者带来了前所未有的机遇,开发一款人工智能语音助手应用更是备受关注。以下是在鸿蒙Next系统上开发人工智能语音助手应用的关键步骤: 环境搭建与权限申请 安装开发工具:首先需…...
计算机网络之---MAC协议
MAC协议的作用 在数据链路层中,MAC(媒介访问控制)协议负责控制设备如何访问共享的通信介质(如以太网、无线电波等),确保在多台设备共享同一传输媒介时能够有效地进行数据传输,避免冲突、控制流…...
系统思考—要素连接
“改变你的思维,就能改变你的世界”— 诺曼皮尔 世界上的所有事物,都在规律的支配下,以系统的方式运转。显性的部分是我们能看到的“要素”,而那些看不见的力量,正是推动系统运作的要素之间的相互作用。更隐秘的&…...
influxdb 采集node_exporter数据
一、打开Scrapers添加 node_exporter地址:http://192.168.31.135:9100/metrics 查看数据...
数据链路层-STP
生成树协议STP(Spanning Tree Protocol) 它的实现目标是:在包含有物理环路的网络中,构建出一个能够连通全网各节点的树型无环逻辑拓扑。 选举根交换机: 选举根端口: 选举指定端口: 端口名字&…...
学技术学英语:ELK是什么
📢📢📢: 先看关键单词,再看英文,最后看中文总结,再回头看一遍英文原文,效果更佳!! 关键词 aggregate 聚合 /ˈɡrɪɡeɪt/ analytics 分析学 /ˌnəˈl…...
快速实现一个快递物流管理系统:实时更新与状态追踪
物流管理是电商、仓储和配送等行业的重要组成部分。随着电子商务的快速发展,快递物流的高效管理和实时状态更新变得尤为关键。本文将演示如何使用Node.js、Express、MongoDB等技术快速构建一个简单的快递物流管理系统,该系统支持快递订单的实时更新和追踪…...
android分区和root
线刷包内容: 线刷包是一个完整的android镜像,不但包括android、linux和用户数据,还包括recovery等。当然此图中没有recovery,但是我们可以自己刷入一个。 主要分区 system.img 系统分区,包括linux下主要的二进制程序。 boot.img…...
【Go】:深入解析 Go 1.24:新特性、改进与最佳实践
前言 Go 1.24 尚未发布。这些是正在进行中的发布说明。Go 1.24 预计将于 2025 年 2 月发布。本文将深入探讨 Go 1.24 中引入的各项更新,并通过具体示例展示这些变化如何影响日常开发工作,确保为读者提供详尽而有价值的参考。 新特性及改进综述 HTTP/2 …...
Vue3组件通讯——自定义事件(子->父)
需求如下: 1.在子组件中,当用户点击提交按钮后,更新数据库 2.数据更新成功后,子组件通知父组件getUserInfo函数,重新获取数据,同步更新 3.子组件等待getUserInfo函数执行完毕后,调用init函数…...
【Rust自学】12.2. 读取文件
12.2.0. 写在正文之前 第12章要做一个实例的项目——一个命令行程序。这个程序是一个grep(Global Regular Expression Print),是一个全局正则搜索和输出的工具。它的功能是在指定的文件中搜索出指定的文字。 这个项目分为这么几步: 接收命令行参数读…...
《OpenCV计算机视觉实战项目》——银行卡号识别
文章目录 项目任务及要求项目实现思路项目实现及代码导入模块设置参数对模版图像中数字的定位处理银行卡的图像处理读取输入图像,预处理找到数字边框使用模版匹配,计算匹配得分 画出并打印结果 项目任务及要求 任务书: 要为某家银行设计一套…...
Windows 下Mamba2 / Vim / Vmamba 环境安装问题记录及解决方法终极版(无需绕过triton)
导航 安装教程导航 Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(初版)Linux 下Mamba 及 Vim 安装问题参看本人博客:Mamba 环境安装踩坑问题汇总及解决方法(重置版)Windows …...
OpenCV的一种改进型的素描特效算法
实现素描特效的原理主要基于图像处理中的边缘检测和灰度反转等技术。边缘检测能够突出图像中的轮廓信息,而灰度反转则用于增强对比,使图像看起来更像手绘素描。 1 素描特效的常规算法 图像读取与预处理 使用图像处理库(如OpenCV)…...
Maven核心插件之maven-resources-plugin
前言 Maven 插件是 Maven 构建系统的重要组成部分,它们为 Maven 提供了丰富的功能和扩展能力,使得 Maven 不仅是一个构建工具,更是一个强大的项目管理平台。在 Maven 项目中,插件的使用通常通过配置 pom.xml 文件来完成。每个插件…...
LeetCode 283题:移动零
LeetCode 283题:移动零 (Move Zeroes) LeetCode 第283题要求将数组中的所有零移动到数组的末尾,同时保持非零元素的相对顺序。 题目描述 给定一个数组 nums,编写一个函数将所有的 0 移动到数组的末尾,同时保持非零元素的相对顺序…...
常见的开源协议及注意事项【精简版】
注: 以下内容出自Github Copilot。 常见的开源协议有以下几种,每种协议都有其特定的使用场景和注意事项: MIT许可证: 特点:非常宽松,允许用户自由使用、复制、修改、合并、发布、分发、再许可和/或销售软件…...
【Oracle专栏】2个入参,生成唯一码处理
Oracle相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 业务需要:2个参数,如 aidbankid ,两个值是联合主键,需要生成一个固定唯一码,长度有限制32位,为了…...
component-动态控制 div width 的值 根据传入的变量决定width的值 vue
1.实现 根据参数的值,div显示不同的长度 <div class"node-line" :style"lineProgress"></div> <script>export default {name: "trainSummaryInfo",data(){return{linePercentage:200,}},computed:{lineProgress…...
<2025 网络安全>《网络安全政策法规-关键信息基础设施安全保护条例》
1 政策出台背景 《关键信息基础设施安全保护条例》的实施背景主要包括以下几个方面: 首先,关键信息基础设施在经济社会中的重要地位使其成为网络安全的核心保护对象。关键信息基础设施包括公共通信和信息服务、能源、交通、水利、金融、公共服…...
【MySQL数据库】基础总结
目录 前言 一、概述 二、 SQL 1. SQL通用语法 2. SQL分类 3. DDL 3.1 数据库操作 3.2 表操作 4. DML 5. DQL 5.1 基础查询 5.2 条件查询 5.3 聚合函数 5.4 分组查询 5.5 排序查询 5.6 分页查询 6. DCL 6.1 管理用户 6.2 权限控制 三、数据类型 1. 数值类…...
acwing_5721_化学方程式配平
acwing_5721_化学方程式配平 这是一道T3的题目,操作起来可能有些棘手,但是耐下心来做一遍会有收获的! 下面是对于大佬的题解进行的注释 #include <iostream> #include <string> #include <map> #include <vector>…...
C++ 中的 template <typename T> 用法 ← 泛型
【语法解析】 ● C 中的 template <typename T> 用法 template <typename T> 是C编程语言中的一个模板声明,用于定义一个模板,其中 T 是一个模板参数,可以是任何类型。这种机制允许程序员编写与类型无关的代码,从而提…...
C语言 操作符_位操作符、赋值操作符、单目操作符
1.位操作符 & - 按(2进制)位与 | - 按(2进制)位或 ^ - 按(2进制)位异或 只适用于整型 例:实现交换两个变量的值,要求不能新建变量 //3^3 0 -> a^a 0 //011 //011 //000 …...
C++ 鼠标轨迹算法 - 防止游戏检测
一.简介 鼠标轨迹算法是一种模拟人类鼠标操作的程序,它能够模拟出自然而真实的鼠标移动路径。 鼠标轨迹算法的底层实现采用C/C语言,原因在于C/C提供了高性能的执行能力和直接访问操作系统底层资源的能力。 鼠标轨迹算法具有以下优势: 模拟…...
计算机网络 笔记 数据链路层3(局域网,广域网,网桥,交换机)
局域网: LAN:在某一区域内由多台计算机互联成的计算机组,使用广播信道 特点: 覆盖范围有限:通常局限在几千米范围内,比如一栋办公楼、一个校园或一个工厂等相对较小的地理区域。 数据传输速率高:一般能达到 10Mbps…...
【Qnx】Qnx常用工具
Qnx常用分析工具 近期项目中Qnx端常用到的工具,总结一下。 查看进程 Display information about the processes in the system (QNX Neutrino) pidin使用pidin命令,可以查看Qnx系统运行的进程信息,包括PID、TID、NAME、PRIO(优先级)、STATE…...
基于 Selenium 实现上海大学校园网自动登录
基于 Selenium 实现上海大学校园网自动登录 一、技术方案 核心工具: Selenium:一个用于自动化测试的工具,能够模拟用户在浏览器上的操作。Edge WebDriver:用于控制 Edge 浏览器的驱动程序。 功能设计: 检测网络状…...
相机小孔成像模型与透视变换
0 背景 本文用于记录小孔相机成像的数学模型推导,并讨论特定条件下两个相机之间看到图像的变换关系。 1 小孔成像模型 小孔成像模型如上图所示。物理世界发光点P,经过小孔O投影到物理成像平面,形成像点I’。 简易起见,构造虚拟成…...
微信小程序订阅消息提醒-云函数
微信小程序消息订阅分2种: 1.一次性订阅:用户订阅一次就可以推送一次,如果需要多次提醒需要多次订阅。 2.长期订阅:只有公共服务领域,如政务、医疗、交通、金融和教育等。在用户订阅后,在很长一段时间内…...
语音技术与人工智能:智能语音交互的多场景应用探索
引言 近年来,智能语音技术取得了飞速发展,逐渐渗透到日常生活和各行各业中。从语音助手到智能家居控制,再到企业客服和教育辅导,语音交互正以前所未有的速度改变着人机沟通的方式。这一变革背后,人工智能技术无疑是关键…...
ros2笔记-6.2 使用urdf创建机器人模型
本节主要跟着小鱼老师的视频操作,不同的仿真平台有不同的建模语言,但是几乎都支持URDF。 本节使用URDF创建一个机器人模型。 6.2.1 帮机器人创建一个身体 URDF使用XML来描述机器人的结构和传感器、执行器等信息。 在chapt6/chap6_ws/src创建功能包:r…...
SQL刷题快速入门(二)
其他章节:SQL刷题快速入门(一) 承接上一章节,本章主要讲SQL的运算符、聚合函数、SQL保留小数的几种方式三个部分 运算符 SQL 支持多种运算符,用于执行各种操作,如算术运算、比较、赋值、逻辑运算等。以下…...
大数据技术实训:Zookeeper集群配置
一、本地模式安装部署 1)安装前准备 (1)安装jdk (2)拷贝Zookeeper安装包到Linux系统下 (3)解压到指定目录 tar -zxvf zookeeper-3.5.7.tar.gz -C /opt/module/ 2)配置修改 &am…...
SpringBoot日常:集成Kafka
文章目录 1、pom.xml文件2、application.yml3、生产者配置类4、消费者配置类5、消息订阅6、生产者发送消息7、测试发送消息 本章内容主要介绍如何在springboot项目对kafka进行整合,最终能达到的效果就是能够在项目中通过配置相关的kafka配置,就能进行消息…...
初学stm32 --- DAC输出三角波和正弦波
输出三角波实验简要: 1,功能描述 通过DAC1通道1(PA4)输出三角波,然后通过DS100示波器查看波形 2,关闭通道1触发(即自动) TEN1位置0 3,关闭输出缓冲 BOFF1位置1 4,使用12位右对齐模式 将数字量写入DAC_…...