目錄其它插值方法
在離散資料的基礎上補插連續的函式,使得這條連續函式經過所有離散資料點,這個過程就叫插值。其意義在於:
插值是離散函式逼近的重要方法,利用它可通過函式在有限個點處的取值狀況,估算出函式在其他點處的近似值。怎麼理解這個東西呢?舉個例子,操場上有人在踢足球。球員一腳把球踢飛了,假設球始終在乙個平面上執行,它的軌跡就可以抽象為乙個函式\(f(t)\)(假設它只與與時間相關)。
現在,你借來了一台高速攝像機,拍下了很多張片**,那麼一張**實際上就是得到了函式影象上的乙個點 \((t_i,f(t_i))\)。
插值就相當於,你知道了一些**(離散的資料),想要還原出球的運動軌跡 \(f(t)\)。當然,由於你只可能有有限的**,而函式是連續的,那麼你只能去近似地還原函式。這也意味之,插值的結果 \(g(t)\)總是無窮多的。
插值有許多方法,包括:三角函式插值;線性插值法;牛頓插值法;拉格朗日插值法......
下面請出今天的主角——拉格朗日...插值法!拍肚皮拍肚皮拍肚皮......
拉格朗日插值法 ( lagrange interpolation polynomial ) 是以十八世紀數學家約瑟夫·拉格朗日 ( joseph-louis lagrange ) 命名的插值法,它可以根據已有離散資料得出多項式的差值結果。
它的思想非常簡單,大概可以理解為——硬性配湊!
怎麼配湊呢?我們舉個例子,平面上有三個點, \((x_1,y_1),(x_2,y_2),(x_3,y_3)(x_1,我們現在用它們仨插值。
根據小學基礎知識,我們知道,這三個點肯定可以唯一確定乙個二次函式。
那麼我們就嘗試找到它,怎麼找?拉格朗日想到了乙個比較粗暴的方法——咱對於每個點都搞乙個子函式 \(f_i(x)\),要求 \(f_i(x)\) 在 \(x=x_i\) 的時候得到 \(1\),在 \(x=x_j(j\not=i)\) 的時候得到 \(0\),把 \(n\) 個子函式湊起來,得到的函式不就過了 \(n\) 個點了!
也就是說,我們要計算 \(n\) 個子函式,第 \(i\) 個子函式為:
\[f_i(x)=
\begin
1 & x=x_i\\
0 & x=x_j(j\not=i)\\
i\ don't\ care & otherwise
\end
\]那麼插值的結果就是:
\[f(x)=\sum_^n y_if_i(x)
\]回到原問題上面來。考慮構造 \(f_1(x)\),對於 \(f_1(x_j)=0(j>1)\) 的情況很好滿足,可以想到:
\[f_1(x)=(x-x_2)(x-x_3)
\]怎麼讓 \(f_1(x_1)=1\) 呢?我們只需要把不用的丟掉就好:
\[f_1(x)=\frac
\]所以最後就有 \(f_1(x_1)\) 長成下面這個亞子:
同理構造出 \(f_2(x)\):
和 \(f_3(x)\):
求和得到\(f(x)\):
也可以很方便地推廣到一般形式:對於\(n\)個點\((x_1,y_1),(x_2,y_2),...,(x_n,y_n)(x_1,設:
\[f_i(x)=\frac(x-x_j)}(x_i-x_j)}
\]那麼插值結果就是:
\[f(x)=\sum_^ny_if_i(x)=\sum_^ny_i\times \frac(x-x_j)}(x_i-x_j)}
\]模板lgp4781:
for( int i = 1 ; i <= n ; i ++ )
拉格朗日插值法可以直接用於離散資料的多項式插值,普通方法的時間複雜度是 \(o(n^2)\),經過多項式膜法優化之後可以達到 \(o(n\log_2^2n)\)(沒錯,多項式快速插值就是從拉格朗日插值法優化來的)。
其實,如果不知道拉格朗日插值法,也可以使用一般方法進行多項式插值——直接上待定係數法,用高斯消元解方程組就可以。但是拉格朗日方法顯然優點明顯:
快,快,快得多。高斯消元 \(o(n^3)\),拉格朗日只有 \(o(n^2)\),還可以優化至 \(o(n\log_2^2n)\)。
2.拉格朗日插值法支援取模,而高斯消元法......
3.還有很多優點,我這裡就不一一枚舉了
不過,在實際應用中,拉格朗日插值法也存在一些缺點。比如說,如果離散資料是變化的,時不時就會多乙個點或者少乙個點,那麼每次變化,拉格朗日插值法都需要重新計算一遍每乙個子函式,導致效率非常非常低下。這個時候可以考慮採用易於處理這種情況的牛頓插值法或者拉格朗日插值法的改進版。
再比如,拉格朗日插值法的結果的次數與插值點數成正比。這就意味著,插值點多幾個,拉格朗日插值法在非插值點的位置,就有可能會顯出很大的偏差。(具體可以參考龍格現象)
這兩個東西怎麼會有關係呢?嗯?
它們確實有關係......
在一類計數 dp 中,如果判定 dp 可以被表示為關於狀態內某個變數的多項式函式,那麼我們就可以利用小範圍的點值,插值得到函式,再代入題目所需的資料求解。
這種方法通常要求小範圍的點值可以在時間限制內快速計算,但最關鍵的還是,要找出「 dp 為變數的多項式函式」這一性質,並且準確地猜測估計計算出函式的次數。
該方法的主要意義還是在於縮減資料範圍,當規模小到可以直接計算,就直接計算,然後倒推回答案。
經典例題:[集訓隊互測]calc。
這個應用基於乙個性質:設 \(s_k(n)=\sum_^ni^k\),那麼 \(s_k(n)\) 就一定可以被表示為乙個關於 \(n\) 的 \(k+1\) 次多項式。
證明可以由自然數冪和的推導方式得來(比如差分法),或者使用數學歸納法,之類的。
然後,既然知道了這個結論,我們就直接用,求 \(s_k(n)\) 的時候,我們先算出前 \(k+2\) 項的冪和,然後就可以把 \(n\) 代入求值。由於前 \(k+2\) 個自然數是連續的一段整數,因此可以很方便地對插值過程中的係數進行遞推。單次可以做到 \(o(k\log_2p)\),其中 \(p\) 為模數(需要存在逆元)。
題外話:求自然數冪和的方法不少,插值法之外還有 伯努利數 + 多項式膜法 ,第二類斯特林數 等等。
這個方法其實......就是對原先的式子稍微修改一下。
考察 \(f_i(x)\) :
\[\begin
f_i(x)
&=\frac(x-x_j)}(x_i-x_j)}\\
&=\frac^n(x-x_j)}\times \frac(x_i-x_j)}
\end
\]經過這樣的變換,我們發現每個子函式都有一大塊是相似的,因此定義:
\[\ell(x)=\prod_^n (x-x_j)
\]於是就有:
\[f_i(x)=\frac\times \frac(x_i-x_j)}
\]對 " 各具特色 " 的後半部分專門定義,稱為重心權:
\[w_i=\frac(x_i-x_j)}
\]於是我們就得到了拉格朗日公式改進版:
\[f(x)=\sum_^n \ell(x)\frac
\]這個公式的優點在於,插值點多乙個或者少乙個,它就只會影響到共 \(n\) 個值。而這 \(n\) 個值的修改理論可以做到單個 \(o(1)\),總的修改時間就是 \(o(n)\) 。
待填坑
拉格朗日插值法
拉格朗日插值法 拉格朗日插值法可以幫助我們解決以下的問題 已知x取值0,1,1,2時,f取值2,2,0,6 求x 3時f的值。示例1 intxs intys f 3 intval lagrangepolynomial 3,xs,ys staticint lagrangepolynomial intx...
拉格朗日插值法
模板題 給出n nn個點 xi yi x i,y i xi y i 讓你確定這個n 1 n 1n 1次方程並代入求值 這個有三種求法 第一種是差分法,只適用於xi ix i i xi i的情況,就是不斷做差分直到序列變成乙個定值就可以求出所有項的係數,複雜度o n 2 o n 2 o n2 第二種是...
拉格朗日插值法
function p lagrange x,y p lagrange x,y 其中x和y是向量,p是返回的多項式向量 m獲取x的個數 m length x for k 1 1 m 表示乙個插值函式的起始值 v 1 for i 1 1 m if k i 注意 以後凡是在遇到乙個在數學上是 x 1 等包...