插值

在数学的数值分析领域中，內插，或稱插值（英語：Interpolation），是一種通过已知的、离散的数据點，在範圍內推求新數據點的过程或方法。求解科学和工程的问题時，通常有許多數據點藉由采样、实验等方法获得，这些数据可能代表了有限個數值函數，其中自變量的值。而根据这些数据，我们往往希望得到一个连续的函数（也就是曲线）；或者更密集的离散方程与已知数据互相吻合，这个过程叫做拟合。 與插值密切相關的另一個問題是通過簡單函數逼近複雜函數。假設給定函數的公式是已知的，但是太複雜以至於不能有效地進行評估。來自原始函數的一些已知數據點，或許會使用較簡單的函數來產生插值。當然，若使用一個簡單的函數來估計原始數據點時，通常會出現插值誤差；然而，取決於該問題领域和所使用的插值方法，以簡單函數推得的插值數據，可能會比所導致的精度損失更大。 內插是曲线必须通过已知点的拟合。参见拟合条目。 例如，已知数据： x 1 = 1 {\displaystyle x_{1}=1} ， y 1 = 2 {\displaystyle y_{1}=2} ， x 2 = 2 {\displaystyle x_{2}=2} ， y 2 = 3 {\displaystyle y_{2}=3} ， x 3 = 4 {\displaystyle x_{3}=4} ， y 3 = 6 {\displaystyle y_{3}=6} ； 求： 当 x = 3 {\displaystyle x=3} 时的y值。 给定 n {\displaystyle n} 个离散数据点（称为节点） ( x k , y k ) {\displaystyle (x_{k},y_{k})} ， k = 1 , 2 , . . . , n {\displaystyle k=1,2,...,n} 。对于 x , ( x ≠ x k , k = 1 , 2 , . . . n ) {\displaystyle x,(x\neq x_{k},k=1,2,...n)} ，求 x {\displaystyle x} 所对应的 y {\displaystyle y} 的值称为內插。 f ( x ) {\displaystyle f(x)} 为定义在区间 [ a , b ] {\displaystyle [a,b]} 上的函数。 x 1 , x 2 , x 3 . . . x n {\displaystyle x_{1},x_{2},x_{3}...x_{n}} 为 [ a , b ] {\displaystyle [a,b]} 上n个互不相同的点， G {\displaystyle G} 为给定的某一函数类。若 G {\displaystyle G} 上有函数 g ( x ) {\displaystyle g(x)} 满足： g ( x i ) = f ( x i ) , k = 1 , 2 , . . . n {\displaystyle g(x_{i})=f(x_{i}),k=1,2,...n} 则称 g ( x ) {\displaystyle g(x)} 为 f ( x ) {\displaystyle f(x)} 关于节点 x 1 , x 2 , x 3 . . . x n {\displaystyle x_{1},x_{2},x_{3}...x_{n}} 在 G {\displaystyle G} 上的插值函数。 舉例假設我們有這樣如下列一個表，它給出了某個未知函數 f {\displaystyle f} 的值 插值提供了估算中間點函數的方法，如 x = 2.5 {\displaystyle x=2.5} 。 有許多不同的插值方法，其中一些在下面描述。 在選擇適當的算法時需要考慮的一些問題是：方法有多準確？ 它的計算成本有多高？ 插值有多平滑？ 需要多少數據點？ 最簡單的插值方法是找到最近的數據值，並分配相同的值。這種方法又稱為最近鄰插值。在簡單的問題中，不太可能使用這種方法，因為線性插值（見下一小節）幾乎一樣容易，但在高維度的多變量插值中，這可能是衡量速度和簡單性的有利選擇。 考慮上面估計 f(2.5) 的例子。由於 2.5 在 2 和 3 之間，所以在 f(2) = 0.9093 和 f(3) = 0.1411 之間，取中間的 f(2.5) 是合理的，得到 0.5252。 一般來說，線性插值採用兩個數據點，例如 (xa,ya) 和 (xb,yb)， 則線性插值的公式為 y = y a + ( y b − y a ) x − x a x b − x a  在 點  ( x , y ) {\displaystyle y=y_{a}+\left(y_{b}-y_{a}\right){\frac {x-x_{a}}{x_{b}-x_{a}}}{\text{ 在 點 }}\left(x,y\right)} y − y a y b − y a = x − x a x b − x a {\displaystyle {\frac {y-y_{a}}{y_{b}-y_{a}}}={\frac {x-x_{a}}{x_{b}-x_{a}}}} y − y a x − x a = y b − y a x b − x a {\displaystyle {\frac {y-y_{a}}{x-x_{a}}}={\frac {y_{b}-y_{a}}{x_{b}-x_{a}}}} 上面公式中的方程式表明， ( x a , y a ) {\displaystyle (x_{a},y_{a})} 和 ( x , y ) {\displaystyle (x,y)} 的斜率，與 ( x a , y a ) {\displaystyle (x_{a},y_{a})} 和 ( x b , y b ) {\displaystyle (x_{b},y_{b})} 之間的斜率相同，線性插值是快速簡單的，但不是很精確。另一個缺點是在插值點 xk 不是可微分的。 以下誤差估計顯示線性插值不是很精確。用 g 表示我們要插入的函數，假設 x 位於 xa 和 xb，而 g 是連續可微的。那麼線性插值的誤差是 | f ( x ) − g ( x ) | ≤ C ( x b − x a ) 2 where C = 1 8 max r ∈ [ x a , x b ] | g ″ ( r ) | . {\displaystyle |f(x)-g(x)|\leq C(x_{b}-x_{a})^{2}\quad {\text{where}}\quad C={\frac {1}{8}}\max _{r\in [x_{a},x_{b}]}|g''(r)|.} 換言之，誤差與數據點之間的距離的平方成正比。包括多項式插值和样條插值（見下一小節）在內的其他一些方法中的誤差與數據點之間距離的較高冪成正比。這些方法也產生更平滑的插值。 多項式插值是線性插值的推廣。線性插值是一個線性函數。我們現在用一個更高階的多項式代替這個插值。 再考慮一下上面給出的問題。以下的六次多項式經歷了所有七個點： f ( x ) = − 0.0001521 x 6 − 0.003130 x 5 + 0.07321 x 4 − 0.3577 x 3 + 0.2255 x 2 + 0.9038 x . {\displaystyle f(x)=-0.0001521x^{6}-0.003130x^{5}+0.07321x^{4}-0.3577x^{3}+0.2255x^{2}+0.9038x.} 代入 x = 2.5，我們發現 f(2.5) = 0.5965。 一般情況下，如果我們有 n 個數據點，那麼在所有的數據點中只有一個最多 n-1 次多項式。插值誤差與數據點與冪次 n 之間的距離成正比。此外，插值是一個多項式，因此是無限可微的。所以我們看到多項式插值克服了線性插值的大部分問題。但是，多項式插值也有一些缺點。與線性內插相比，計算內插多項式的成本是昂貴的（參見計算複雜度）。此外，多項式插值可能會出現振盪偽像，特別是在端點（見龍格現象）。 與線性插值不同，多項式插值可以估計樣本範圍之外的局部最大值和最小值。例如，上面的插值在 x ≈ 1.566 處有一個局部最大值，f(x) ≈ 1.003，在 x ≈ 4.708 處有一個局部最小值，f(x) ≈ −1.003。然而，這些最大值和最小值可能會超出函數的理論範圍 - 例如，一個總是正的函數可能有一個負值的插值，因此它的逆值包含假垂直漸近線。 更一般地說，所得曲線的形狀，特別是對於獨立變量的非常高或低的值，可能與常識相反，即與已經產生數據點的實驗系統已知的情況相反。通過使用樣條插值或限制對切比雪夫多项式的注意可以減少這些缺點。 線性插值對每個區間 [xk,xk+1] 使用線性函數。 樣條插值在每個間隔中使用低階多項式，並選擇多項式以使它們平滑地吻合在一起。 結果函數被稱為樣條曲線。 例如，三次样条是分片段立方，兩次連續可微。 此外，它的二階導數在終點為零。 在上表中插入點的三次樣條函數由下式給出 f ( x ) = { − 0.1522 x 3 + 0.9937 x , if  x ∈ [ 0 , 1 ] , − 0.01258 x 3 − 0.4189 x 2 + 1.4126 x − 0.1396 , if  x ∈ [ 1 , 2 ] , 0.1403 x 3 − 1.3359 x 2 + 3.2467 x − 1.3623 , if  x ∈ [ 2 , 3 ] , 0.1579 x 3 − 1.4945 x 2 + 3.7225 x − 1.8381 , if  x ∈ [ 3 , 4 ] , 0.05375 x 3 − 0.2450 x 2 − 1.2756 x + 4.8259 , if  x ∈ [ 4 , 5 ] , − 0.1871 x 3 + 3.3673 x 2 − 19.3370 x + 34.9282 , if  x ∈ [ 5 , 6 ] . {\displaystyle f(x)={\begin{cases}-0.1522x^{3}+0.9937x,&{\text{if }}x\in [0,1],\\-0.01258x^{3}-0.4189x^{2}+1.4126x-0.1396,&{\text{if }}x\in [1,2],\\0.1403x^{3}-1.3359x^{2}+3.2467x-1.3623,&{\text{if }}x\in [2,3],\\0.1579x^{3}-1.4945x^{2}+3.7225x-1.8381,&{\text{if }}x\in [3,4],\\0.05375x^{3}-0.2450x^{2}-1.2756x+4.8259,&{\text{if }}x\in [4,5],\\-0.1871x^{3}+3.3673x^{2}-19.3370x+34.9282,&{\text{if }}x\in [5,6].\end{cases}}} 在這種情況下，我們得到 f(2.5) = 0.5972。 與多項式插值的方法相比較，樣條跟多項式一樣，其插值誤差會小於線性插值，而且插值更平滑；使用樣條會比使用高階多項式更容易評估。 它也不會受到龍格現象的影響。 其他形式的插值可以通過選擇不同的插值類來構造。 例如，有理插值是使用Padé逼近的有理函數插值，而三角插值是使用傅里叶级数的三角多項式插值。 另一種可能是使用小波。 如果數據點的數量是無限的，則可以使用Whittaker-Shannon插值公式。 有時候，我們不僅知道我們想插入的函數的值，而且也知道它的導數。 這導致Hermite插值問題。 當每個數據點本身就是一個函數時，將插值問題看作是每個數據點之間的局部對流問題是有用的。 這個想法導致了運輸理論中使用的位移插值問題。 在数字信号处理领域，插值是指使用各种数字滤波器（例如带限脉冲信号）提高数字信号（例如语音信号）的采样率（即升采样）。在升采样的过程中，原始信号的谐波成分需要在不产生高于原始信号奈奎斯特频率（原始信号采样率的一半）的混叠谐波的情况下保留。Rabiner和Crochiere的书Multirate Digital Signal Processing对此进行了讨论。 術語外推用於找到已知數據點範圍之外的數據點。 在曲線擬合問題中，插值必須準確穿過數據點的約束被放寬。 只需要盡可能接近數據點（在一些其他限制內）。 這需要參數化潛在的插值並且有一些測量誤差的方法。 在最簡單的情況下，這導致最小二乘法逼近。 近似理論研究如何從某個預定的類別的另一個函數找到給定函數的最佳逼近，以及這個近似值有多好。 這明顯產生了內插函數可以近似未知函數的界限。 本章内容参考了《数学手册》。 牛顿第一內插公式（牛顿向前內插公式） 牛顿第二內插公式（牛顿向后內插公式） 斯特林內插公式 贝塞耳內插公式 拉格朗日内插多项式 三次样条内插公式 埃尔米特內插公式（Hermite） 二元內插公式 一元三点內插公式 R.E. Crochiere and L.R. Rabiner. (1983). Multirate Digital Signal Processing. Englewood Cliffs, NJ: Prentice–Hall.. [2023-03-15]. （原始内容存档于2016-04-13）.  《数学手册》编写组，《数学手册》，高等教育出版社，1979年 数学主题 数值分析 拟合 样条 談補間法 （页面存档备份，存于互联网档案馆） Sol Tutorials - Interpolation Tricks （页面存档备份，存于互联网档案馆）