插值
告訴你一個函數會經過 \(n\) 個點(\(n\)個點各不相同),然后讓你計算其余幾個位置的取值。(應該吧,個人理解)
一般情況下可能會用在一些數據統計中函數的擬合。(不然為什么會有這么多亂七八糟的擬合啊QAQ)
當然,這里主要涉及的是多項式插值,即利用經過這\(n\)個點的最高次項次數小於\(n\)的關於\(x\)的那個多項式,通過代入或者其他方法求出這幾個位置的取值。
當然,這里給出一道模板題,在拉格朗日插值和牛頓插值時就是用這個模板題的。
當然,這種題目暴力用高斯消元也是能做的,可惜A不了,畢竟時間復雜度時\(O(n^3)\)
下文都認為給出的是\(n+1\)個點,點的標號從\(0\)開始,同時設第\(k\)個點為\((x_{k},y_{k})\)。
拉格朗日插值法
普通拉格朗日插值法
觀察模板題和高斯消元,你會發現我們把這個多項式解出來真的太浪費啦。
有沒有不用求出多項式也能求值的方法呢?
有!
拉格朗日發表了這么一個方法:
\(L(x)=\sum\limits_{i=0}^nℓ_{i}(x)y_{i}\)
其中\(ℓ_{i}(x)\)叫 拉格朗日基本多項式 ,\(L(n)\)叫 拉格朗日插值多項式 。
\(ℓ_{i}(x)=\prod\limits_{j=0,j≠i}^n\frac{(x-x_{j})}{(x_{i}-x_{j})}\)
這個多項式有個非常NB的性質(其實也非常顯然)
就是\(ℓ_{i}(x)\)在\(x_{j}(j≠i)\)處為\(0\),在\(x_{i}\)處為\(1\)。
那么顯然,\(L(x)\)經過這\(n\)個點。
這樣,我們就只需要把\(k\)代入,就可以在\(O(n^2)\)的時間內求解了。
顯然,我們節省的是求出這個多項式的時間。
當然,可以證明的是,這個拉格朗日插值多項式是唯一一個次數≤\(n\)的經過這\(n+1\)個點的多項式。
唯一性
假設存在兩個\(n\)次多項式,都經過這\(n+1\)個點,假設這兩個多項式為\(P_1,P_2\)
\(P_3=P_2-P_1\)
那么\(P_3\)顯然\(≠0\)。
而且因為都經過\(n+1\)個點,所以有\(n+1\)個根,所以\(P_3\)的次數為\(n\)。
而且可以寫成
那么\(P_{3}\)可以寫成\(k\prod\limits_{i=0}^n(x-x_i)\)
但是這樣次數是\(n+1\)的,顯然不對,矛盾,證畢。
所以最多存在這樣唯一一個多項式。
存在性
首先,不一定存在次數為 \(n\) 的多項式,舉個例子:
\((1,1),(2,2),(3,3)\)就不能被一個二次方程經過。
當然,能經過這\(n+1\)個點的也不一定要是個次數大於\(0\)的多項式,比如你給\(n+1\)個\(y\)值相等的點,怎么可能存在一個\(n\)次多項式能夠經過\(n+1\)個\(y\)值相同的點啊(因為這和一個多項式能有\(n+1\)個點的命題是等價的,這個命題先讓錯誤,不然可以寫成\((x-x_{i})\)的形式,證明這個形式次數大於\(n\))。
所以下面假定至少存在兩個點 \(y\) 值不同。
在這個條件下,我們可以證明\(L(x)\)是一個次數大於\(0\)的多項式。
我們假設存在一組\(a_0,a_1,a_2,...a_{n+1}\)系數,使得:
\(P(x)=\sum\limits_{i=0}^na_{i}ℓ(i)=a_{n+1}\)
首先,因為\(ℓ_{i}(x)\)函數只有在\(x_{i}\)處為\(1\),其余\(x_{j}\)處都是為\(0\)的,所以顯然\(P(x_{i})=a_{i}\),但是呢,這個函數的值又是恆定的,所以\(a_{0}=a_{1}=a_{2}=....=a_{n+1}\)。
又因為\(y_{i}\)並不相同,所以證畢。
代碼
當然,這道題目我還是有🐎代碼的。
時間復雜度\(O(n^2)\)
#include<cstdio>
#include<cstring>
#define N 2100
using namespace std;
typedef long long LL;
const LL mod=998244353;
inline LL ksm(LL x,LL y)
{
x%=mod;
LL ans=1;
while(y)
{
if(y&1)ans=ans*x%mod;
x=x*x%mod;y>>=1;
}
return ans;
}
LL n,k;
LL xx[N],yy[N];
void calc()
{
LL ans=0;
for(int i=0;i<=n;i++)
{
LL shit=1;
for(int j=0;j<=n;j++)if(i!=j)shit=(k-xx[j]+mod)*ksm(xx[i]-xx[j]+mod,mod-2)%mod*shit%mod;
ans=(shit*yy[i]+ans)%mod;
}
printf("%lld\n",ans);
}
int main()
{
scanf("%lld%lld",&n,&k);n--;
for(int i=0;i<=n;i++)scanf("%lld%lld",&xx[i],&yy[i]);
calc();
return 0;
}
當然,這樣🐎是\(O(n^2\log{n})\)的,改進的方法也比較簡單,分母乘起來最后求逆元就行了。
這樣就可以到嚴格的\(O(n^2)\)了。
優點與缺點
這里直接照搬https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html的,因為我自己根本就不了解插值,OI中也基本上不會去處理數據擬合,下面是OI的貌似也不太需要的亞子。
拉格朗日插值法的公式結構整齊緊湊,在理論分析中十分方便,然而在計算中,當插值點增加或減少一個時,所對應的基本多項式就需要全部重新計算,於是整個公式都會變化,非常繁瑣。這時可以用重心拉格朗日插值法或牛頓插值法來代替。此外,當插值點比較多的時候,拉格朗日插值多項式的次數可能會很高,因此具有數值不穩定的特點,也就是說盡管在已知的幾個點取到給定的數值,但在附近卻會和“實際上”的值之間有很大的偏差(如右下圖)。這類現象也被稱為龍格現象,解決的辦法是分段用較低次數的插值多項式。
連續情況
當然,在給定的取值是連續的情況下(即等差數列),可以做到\(O(n)\)的插值。(當然,前提是你得花\(n\log{n}\)檢驗其是否是等差數列,當然,有時候是已知條件)
你可以通過函數的縮放,把\(x\)轉變成:\(x_{i}=i\)的情況。
至於怎么做,照搬你谷日報:

而且,如果是在模運算的情況下,只要\(O(n)\)預處理逆元,也一樣可以辦到\(O(n)\)。
代碼:
//你谷日報的代碼
//當x_i=i時求L_n(k)
double L_n_k=0;
for (int i=1;i<=n;i++)
if ((n-i)%2) L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(-fac[i]*fac[n-i]));
else L_n_k+=y[i]*((pre[i-1]*suf[i+1])/(fac[i]*fac[n-i]));
重心型拉格朗日插值法
Ⅰ型
總所周知,普通拉格朗日插值法在新增加一個點的時候就需要重新\(O(n^2)\)計算一下。(霧
不是,為什么啊(・∀・(・∀・(・∀・*),難道不是只要把\(ℓ_{i}(x)\)用數組存起來,計算不也是輕輕松松的事嗎,當然,如果不用模運算的話時間復雜度是\(O(n)\),如果要用模運算,計算逆元的時間就比較久了,會到達\(O(n\log{n})\)。
如果是要另外求個點,求先把分子求出來,然后不斷逆元乘法也能解決,復雜度跟上面同理。
為什么要\(O(n^2)\)。不過我沒有去打代碼驗證
但是仔細想想上述的做法如果處理不好還是有一定弊端的,如果要另外求個點,而且是浮點數運算的話,這種做法可能掉精比較厲害,嚴重的可能精度直接起飛了,不過一般去到\(10^3\)一般也會加\(\mod{}\)運算吧,不過也很好解決,只要處理出現在分子和新的分子的比值再乘,那么掉精問題估計也就沒有那么嚴重了。
額,認真的講一下你谷博客中的\(Ⅰ\)型吧。
如果我們改變一下上述的式子:
\(L(n)=\sum\limits_{i=0}^ny_{i}\frac{\prod\limits_{j=0}^n(x-x_{i})}{(x-x_{i})\prod\limits_{j=0,i≠j}^n(x_{i}-x_{j})}\)
當然,這樣插值的前提是要求\(x≠x_{i}\),否則式子就爆炸了啊。
設\(ℓ(x)=\prod\limits_{i=0}^n(x-x_{i}),w_{i}=\frac{y_{i}}{\prod\limits_{j=0,i≠j}^n(x_{i}-x_{j})}\)
那么\(L(n)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)
其中\(w_{i}\)叫做重心權。
同樣的,這個可以支持\(O(n)\)撤銷點,加入點。
同時也支持\(O(n)\)求另外一個點。
但是如果在模運算下,這些運算的復雜度統統都是\(O(n\log{n})\)的,我是真的沒有找到這個東西到底有什么用,而且如果在非模運算下,這個做法求新的\(f(k)\)好像更加的容易掉精...,而且補救方法我也沒有想到,除非直接像普通的那樣維護,把\(ℓ(x)\)乘進\(\sum\)里面同時維護,好像就不太需要擔心掉精問題了。
可能這一塊內容就是為引出下一塊內容准備的吧QAQ。
Ⅰ型具有向后穩定性。
Ⅱ型
我們插值一下\(f(x)=1\):
\(f(x)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)
然后用\(L(x)\)除\(f(x)\)。
\(L(x)=\frac{\sum\limits_{i=0}^ny_{i}\frac{w_{i}}{(x-x_{i})}}{\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}}\)
就得到了Ⅱ型。
當然,分母一般情況下是不為\(0\)的,同理也是要求\(k≠x_{i}\)
\(f(x)=ℓ(x)\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}=1\)
所以\(\sum\limits_{i=0}^n\frac{w_{i}}{(x-x_{i})}\)是絕對不為 \(0\) 的。
可以發現,這個式子不用去計算\(ℓ(x)\),計算也是比較方便,可以說是一個優勢。
它的另一個優勢是,結合切比雪夫節點(\(x_{i}=cos(\frac{(2i+1)\pi}{2(n+1)}),i∈[0,n]∩Z\))進行插值的話,可以很好地模擬給定的函數,使得插值點個數趨於無窮時,最大偏差趨於零。同時,重心拉格朗日插值結合切比雪夫節點進行插值可以達到極佳的數值穩定性。(這段話來自https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html)
Ⅱ型具有向前穩定性,並且勒貝格常數很小。
個人認為,復雜度其實也是類似\(Ⅰ\)型,但是在浮點數誤差下,這個貌似更難去處理誤差,只能硬生生的維護重心權\(w_{i}\),但是在\(n\)去到較大級別時,\(w_{i}\)要么太大,要么太小,都是難伺候的主啊,特別容易產生較大的精度誤差,所以我也是沒有找到這個的作用在哪。。。
小結
在OI中感覺這三種類型都差不多,其實,那些向前穩定和向后穩定我都不知道是什么,阿巴QAQ,OI中應該不會涉及這么一些東西。(上面那些專業術語都是看別人博客的QAQ)
而且這三種類型在OI中應該可以算是等價的了。
我還是用普通型的吧,告辭。
牛頓插值
差商是什么?
准確定義我反復讀了三遍也沒有看懂定義在阿巴什么,但是這里給出下面會用到的式子定義。
設\(f[x_0,x_1,...x_k]\)為\(f(x)\)的\(k\)階差商。(所以我覺得 \(k\) 階差商應該是有很多值的)
定義:\(f[x_0]=f(x_0)\)
\(f[x_{0},x_{1}...,x_{k}]=\frac{f[x_{1},x_{2}...,x_{k}]-f[x_0,x_1,x_2...,x_{k-1}]}{x_{k}-x_{0}}\)
同時要求\(x_{i}≠x_j(i≠j)\)(其實你可以發現如果把\(k\)階差商全部展開成\(0\)階差商並且不通分約分合並,你會發現對於任意的 \((x_{i}-x_{j})\) ,存在 \(k∈\){\(1,-1\)} 使得 \(k(x_i-x_j)\) 存在在某個分數的分母)。
那么\(f(x)=f[x]\)
\(\frac{f[x]-f[x_{0}]}{x-x_0}=f[x,x_0]\)
\(f[x]=(x-x_0)f[x,x_0]+f[x_0]\)
代回原式:\(f(x)=f[x_0]+(x-x_0)f[x,x_0]\)
由於計算\(f[x,x_0]\)仍然需要我們計算\(f(x)\)的值,所以我們繼續像剛才一樣展開:
\(f[x,x_0]=(x-x_1)f[x,x_0,x_1]+f[x_0,x_1]\)
\(f[x,x_0,x_1]=(x-x_2)f[x,x_0,x_1,x_2]+f[x_0,x_1,x_2]\)
...
然后不斷的代回原式,直到出現\(f[x,x_0,x_1,x_2,...,x_{n+1}]\),此時停止展開,式子為:
\(f(x)=f[x,x_0,x_2,...,x_{n+1}]\prod\limits_{j=0}^{n}(x-x_i)+\sum\limits_{i=0}^nf[x_0,x_1,x_2,...,x_i]\prod\limits_{j=0}^{i-1}(x-x_i)\)
然后我們設\(R_n(x)=f[x,x_0,x_2,...,x_{n+1}]\prod\limits_{j=0}^{n}(x-x_i),N_{n}(x)=\sum\limits_{i=0}^nf[x_0,x_1,x_2,...,x_i]\prod\limits_{j=0}^{i-1}(x-x_i)\)
那么\(f(x)=N_{n}(x)+R_{n}(x)\)。
其中\(N_{n}(x)\)為牛頓插值公式,\(R_{n}(x)\)為插值余項。
而在插值的時候,我們忽略\(R_{n}(x)\),用\(N_{n}(x)\)的值表示\(f(x)\)
當然,至於正確性嗎。
當然,為什么在展開到\(f[x,x_0,x_2,...,x_{n+1}]\)的時候就停下來了呢?
因為\(\prod\limits_{j=0}^{n}(x-x_i)\)已經是個\(n+1\)次數的多項式,已經沒有用了,反正我們是用\(n\)次多項式擬合的,\(n+1\)次已經超了,直接扔掉。
但是目前的任務是確定\(N_{n}(x)\)是不是一個經過這\(n+1\)個點的多項式?(實際上擬合出來的多項式應該是和拉格朗日插值多項式是一模一樣的)
當然,其實也特別好證明,因為\(R_{n}(x_i)=0\),所以\(f(x_{i})=N_{n}(x_{i})\)。
就證明完了,所以在求\(n\)次多項式擬合的時候,其實這兩種插值法求出的多項式,我個人認為都沒有什么區別好吧。
至於計算,可以直接用遞推計算\(n\)階差商的值,然后從左往右暴力硬推,處理好一點,應該可以做到空間上的\(O(n)\),但是時間上因為要用遞推定義式計算,所以還是要\(O(n^2)\)。
但是呢,這個牛頓插值我個人認為最NB的東西也就在這,就是他同樣可以做到\(O(n^2)\)的時間插出原來多項式的系數,而且是全部系數,只要多項式加乘即可,當然,其實拉格朗日用上多項式除法(都是只用乘除\(x+a\),非常的簡單)同樣可以辦到一樣的效果,其實這兩個也沒什么區別啦QMQ。
當然,比較雞肋的是,如果你不花\(O(n^2)\)的空間記錄下所有差商的信息,你會發現添點你做起來跟掐了 * 一樣難搞,我個人認為搞不了,因為新的差商那也是真的難計算,當然,計算一個新的\(f(k)\)就只需要記錄系數就行了,這個推起來還是挺簡單的好吧。
當然,在牛頓插值中如果新增了一個點,那么只會增加一個項,這或許是優點,但是這個項的系數很難計算啊。
當然,其實還是有方法的,這個就要涉及到差商的通項公式了,這樣只要記錄通項公式中的分母,一樣可以做到\(O(n)\)計算猛如虎,求新的點值在模意義下可以到達\(O(n)\),只要你\(O(n)\)記錄系數,這個做法最妙的地方估計就是\(x\)不在分母位置,不用計算跟\(x\)有關的逆元,不過在模意義下,添加新點的代價依舊是\(O(n\log{n})\),沒什么好說的。
但是呢,雖然新的點值可以到達\(O(n)\),但是與之相對的,如果是浮點數運算,在規模較大的情況下,系數的值可能會偏小,導致誤差高漲,總之就是誤差問題,如果不擔心誤差隨便用好吧。
當然,擴展一下,這里介紹一下差商的性質。
差商的性質
公式
\(f[x_{0},x_1,x_2,x_3...,x_n]=\sum\limits_{j=0}^k\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^k(x_{j}-x_i)}\)
證明:
數學歸納法證明,當\(k=0\)時,顯然成立。
當\(k>0\)時。
\(\frac{\sum\limits_{j=1}^{k+1}\frac{f(x_j)}{\prod\limits_{i=1,i≠j}^{n+1}(x_{j}-x_i)}-\sum\limits_{j=0}^k\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^k(x_{j}-x_i)}}{(x_{k+1}-x_0)}\)
對於\(j=k+1\),分母乘\((x_{k+1}-x_0)\)直接變成\(\frac{f(x_{k+1})}{\prod\limits_{i=0}^{n}(x_{k+1}-x_i)}\)
對於\(j=0\),分母乘\((x_{k+1}-x_0)\),可以把負號和這個合並,變成\((x_{0}-x_{k+1})\),於是和\(k+1\)一樣,變成了\(k+1\)階差商中應該有的樣子。
對於\(j=[1,k]∩Z\)
\(\frac{f(x_j)}{\prod\limits_{i=1,i≠j}^{n+1}(x_{j}-x_i)}-\frac{f(x_j)}{\prod\limits_{i=0,i≠j}^{n}(x_{j}-x_i)}=\frac{x_j(x_{k+1}-x_0)}{\prod\limits_{i=0,i≠j}^{n+1}(x_{j}-x_i)}\)
剛好除去\((x_{k+1}-x_0)\),同理也變成\(k+1\)階差商的樣子,歸納法證明完畢。
這個式子可以說明順序在差商中是沒有用的,差商具有對稱性。
當然,我這里給出一個我認為正確的另外一種差商的計算式:
定義 \(c(A)\) 為這個集合的大小,集合 \(A\) 中的元素都是實數,如果集合\(A,B\)大小相同,且\(A,B\)中只有一個元素不同,那么\(A-B=x\)當且僅當\(x∈A且x∉B\)。(這里是我個人定義,請不要帶到這篇博客以外的地方使用)
那么 \(f[A]\) 為 \(c(A)-1\) 階差商,定義\(A_1,A_2\)為\(A\)的兩個不同的大小為\(c(A)-1\)的子集,那么 \(f[A]=\frac{f[A_1]-f[A_2]}{(A_1-A_2)-(A_2-A_1)}\)
其實就是把定義式利用順序不影響結果這一條結論改了一下而已QMQ
一個我不知道是什么的導數性質
對於\(f(x)\)的\(k\)階差商,如果一個區間\([a,b]\)滿足\(x_{i}(0≤i≤k)∈[a,b]\),且\([a,b]\)存在\(k\)階導數,那么存在一個\(t∈[a,b]\),滿足:
\(f[x_0,x_1,x_2,x_3...,x_t]=\frac{f^{(k)}(t)}{k!}\)
至於證明,學完微積分補,好吧。
當然,證明文檔的鏈接放在參考文獻中了,可以自行消化。
用處嗎,不知道,就當擴展眼界了。
等距節點的牛頓插值
看這個也就圖一樂好吧。
插值,其中\(x_{i}-x_{i-1}(i>0)\)是個定值,我們設其為\(h\)。
這個東西貌似也是只要根據等距的性質來,基本也不會有什么問題,不過如果你直接把其的節點縮放成\(x_{i}=i\),豈不美哉,這樣就更加好處理了啊QMQ。
定義差分:
一階前向差分:\(△f_{k}=f_{k+1}-f_{k},k=0,1,2,...,n-1\)
\(t\)階前向差分:\(△^tf_{k}=△^{t-1}f_{k+1}-△^{t-1}f_{k}\)
一階后向差分:\(∇f_{k}=f_{k}-f_{k-1},k=0,1,2,...,n-1\)
\(t\)階后向差分:\(∇^tf_{k}=∇^{t-1}f_{k}-∇^{t-1}f_{k-1}\)
差分公式
差分公式:
\(△^tf_{k}=\sum\limits_{i=0}^t(-1)^iC_{t}^if(k+t-i)\)
\(∇^tf_{k}=\sum\limits_{i=0}^t(-1)^iC_{t}^if(t-i)\)
可能寫錯了
證明的話也是非常的簡單,這里證明前向差分,后向差分類似證明。
回歸到楊輝三角形:
\(△^tf_{k}\)
\(△^{t-1}f_{k+1}\) \(△^{t-1}f_{k}\)
\(△^{t-2}f_{k+2}\) \(△^{t-2}f_{k+1}\) \(△^{t-2}f_{k}\)
...
其實對於\(f(i)\)的系數就是所有從\(△^tf_{k}\)到達\(f(i)\)的路徑方案的權值和。
那么一個路徑方案的權值是多少呢?
一個路徑從起點出發,權值為\(1\),如果往下走,乘\(1\),往右下走,乘\(-1\),最終得到的值為此方案的權值,又發現,往右下走列數\(+1\),所以方案的權值大小只與終點列數相關。
所以所有從\(△^tf_{k}\)到達\(f(i)\)的路徑方案的權值都是一樣的,要么\(1\),要么\(-1\),顯然,為\((-1)^{t+k-i}\)。
至於系數,你可以發現,如果把每個值的系數算成絕對值,這就是一個活生生的楊輝三角形啊。
得證。
差商與差分的關系
等距節點差商與差分的關系:
那么有:
\(f[x_0,x_{1},...,x_{m}]=\frac{△^mf_0}{m!h^m}=\frac{∇^mf_m}{m!h^m}\)
至於證明,也是非常的簡單,代入就可以輕松證明(這里證明前向差分,后向不證明了,類似):
計算對於\(f(x_{i})\)的系數。
那么值就等於:\(\frac{(-1)^{m-i}C_{m}^if(x_{i})}{m!h^m}\)
對比一下\(\frac{f(x_i)}{\prod\limits_{j=0,i≠j}^m(x_i-x_j)}=\frac{f(x_i)}{h^mi!(m-i)!*(-1)^{m-i}}\)
整理一下就發現兩者一模一樣。
牛頓前向插值公式
\(x_{i}=x_{0}+ih\)
設\(x=x_0+th\)(在模運算中,可以通過同余方程得到,在浮點數運算中,直接除法得到\(t\))
所以設\(w_{i}(x)=\prod\limits_{j=0}^{i-1}(x-x_j)=\prod\limits_{j=0}^{i-1}(t-j)h=h^i\prod\limits_{j=0}^{i-1}(t-j)\)
插值公式:
\(N_{n}(x)=f[x_0]+\sum\limits_{i=1}^nf[x_0,x_1...,x_i]w_{i}(x)\)
\(N_{n}(x_0+th)=f[x_0]+\sum\limits_{i=1}^n[\frac{△^if_{0}}{i!h^i}h^i\prod\limits_{j=0}^{i-1}(t-j)]=f[x_0]+\sum\limits_{i=1}^n[\frac{△^if_{0}}{i!}\prod\limits_{j=0}^{i-1}(t-j)]\)
貌似計算還是\(O(n^2)\)的,額,那好像還是沒有太大用處。
插值余項就不算了,當然,后向插值公式也懶得搞了,這些都與OI沒有太大關系,擴展到這里其實也就差不多了(其實就是我累了),有興趣的可以在參考資料中自行進行學習,后續補一下導數性質的證明吧。
至於其余擴展的東西,等我大學無聊有時間學一下吧,現在學這么久與OI無關的東西已經很拖時間了,告辭。
小結
摘自https://blog.csdn.net/littlely_ll/article/details/71107092:
牛頓插值法優缺點
牛頓插值法的優點是計算較簡單,尤其是增加節點時,計算只增加一項,這是拉格朗日插值無法比的。
缺點是仍沒有改變拉格朗日的插值曲線在節點處有尖點,不光滑,插值多項式在節點處不可導等缺點。
摘自https://www.luogu.com.cn/blog/zhang-xu-jia/ji-zhong-cha-zhi-fang-fa-yang-xie
不過它比拉格朗日插值更好的是,它可以插出多項式的系數。當給出的節點等距時,使用差分能達到更優的效果,其計算更加簡便。
不過我是真的沒有看出來牛頓插值方便計算在哪了?(估計是我傻吧,只會口胡阿巴,望各位大佬指點一下我)
但是模意義求新的點值可以到\(O(n)\)是真的香好吧。
泰勒插值
基本就是阿巴過了。
已知函數在\(x_0\)處的\(i\)階導數。\(0≤i≤k\)
\(0\)階導數其實就是它的函數值。
求一個多項式滿足這個條件。
泰勒展開隨便搞。(當然,其實不用也可以,直接導數的定義也是可以處理的)
\(f(x)=f(x_i)+\sum\limits_{i=1}^n\frac{f^{(i)}(x_i)}{i!}(x-x_0)^i\)
然后就搞定啦。
時間復雜度:\(O(n^2)\)
應該是唯一的,且存在的。
你谷奆佬評價:
又慢,限制又多。
不過有的時候還是比較方便的。
多項式快速插值
也就是求一個小於\(n+1\)次的多項式經過給定的\(n+1\)個點。
要求輸出多項式的系數。
高斯消元\(O(n^2)\),牛頓迭代\(O(n^2)\),但是還有更快的,想不到吧。
nlog^3做法
沒🐎代碼,后面補,現在更多學的是理論的東西。
其實就是分治,但是我不會QAQ。
學還是學得懂,就是比較阿巴。
同分治一樣,把點拆分成\(0-\left \lfloor \frac{n}{2} \right \rfloor\)和\((\left \lfloor \frac{n}{2} \right \rfloor+1)-n\)的兩個部分,分別命名為點集\(X_0,X_1\)。
設多項式\(A_0(x)\)是\(X_0\)的插值。
設\(P(x)=\prod\limits_{i=0}^{\left \lfloor \frac{n}{2} \right \rfloor}(x-x_i)\)。
那么我們可以得到:
\(A(x)=P(x)A_1(x)+A_0(x)\)。
\(A_1(x)\)是什么,看下去就知道了。
怎么求出\(A_1(x)\)呢?
\(y_i=P(x_i)A_1(x_i)+A_0(x_i)((\left \lfloor \frac{n}{2} \right \rfloor+1)≤i≤n)\)
\(A_{1}(x_i)=\frac{y_i-A_0(x_i)}{P(x_i)}\)
這樣,我們就可以得到新的\(X_1\),而\(A_{1}(x)\)是這個新的\(X_{1}\)的插值多項式。
但是呢,這里有幾個細節,首先是關於如何求出新的\(X_1\),原文沒說,這里推測是用多項式多點求值(但是我不會QAQ),至於求\(P(x)\),分治一下就行了,將\((x-a)\)左右分成兩半再用\(NTT\)乘起來,時間復雜度都是\(O(n\log^2{n})\)。
這樣就可以完成多項式插值了。
於是就得到了這條式子:
\(T(n)=2T(\frac{n}{2})+n\log^2{n}\)
然后就可以得到時間復雜度是\(O(n\log^3{n})\),常數還有億點點大。。。
參考文獻
https://www.luogu.com.cn/blog/zhang-xu-jia/ji-zhong-cha-zhi-fang-fa-yang-xie
(講真你谷初中生隨便吊打我個高中生QAQ,我到現在都不會微積分)
https://blog.csdn.net/littlely_ll/article/details/71107092
https://wenku.baidu.com/view/568b7fbb336c1eb91b375df4.html
百度百科
https://www.cnblogs.com/ECJTUACM-873284962/p/6833391.html
https://www.docin.com/p-632016518.html
https://zhuanlan.zhihu.com/p/66793653
論如何在參考文獻一坨的情況下學得一知半解的QAQ。
可惡,欺負我個不會微積分的人QAQ。
坑
補導數證明
補充你谷日報中提到的其余差分。
補充代碼
