拉格朗日插值法


題目描述

由小學知識得\(n + 1\)\(x\) 坐標不同的點確定唯一的最高次為 \(n\) 次的多項式 \(y = f(n)\) 。現在給出 \(n + 1\) 個點,求出這些點構成的多項式在某一位置的取值

拉格朗日插值法

假設給出的曲線是個二次多項式

\[f(x) = ax^2 + bx + c \]

現在有三個已經確定的點 \((x_1, y_1)\)\((x_2, y_2)\) , \((x_3, y_3)\)

代入柿子

\[\begin{cases} f(x_1) = ax_1^2 + bx_1 + c\\ f(x_2) = ax_2^2 + bx_2 + c\\ f(x_3) = ax_3^2 + bx_3 +c \end{cases} \]

很顯然可以用高斯消元求出 \(a,b,c\) , 時間復雜度 \(O(n^3)\)

但拉格朗日插值法只需要 \(n^2\)

神奇的構造:

我們需要構造三條曲線 \(f_1,f_2,f_3\)

  • 對於第一條曲線 \(f_1(x)\)

\(f_1(x_1) = 1, f_1(x_2) = f_1(x_3) = 0\)

  • 對於第二條曲線 \(f_2 (x)\)

\(f_2(x_2) = 1, f_2(x_1) = f_2(x_3) = 0\)

  • 對於第三條曲線 \(f_3(x)\)

\(f_3(x_3) = 1, f_3(x_1) = f_3(x_2) = 0\)

然后

  • \(y_1f_1(x)\) 就能保證在 \(x_1\) 處為 \(y_1\)\(x_2,x_3\) 處為取值為 0

  • \(y_2f_2(x)\) 就能保證在 \(x_2\) 處為 \(y_2\)\(x_1,x_3\) 處為取值為 0

  • \(y_3f_3(x)\) 就能保證在 \(x_3\) 處為 \(y_3\)\(x_1,x_2\) 處為取值為 0

再然后

\[f(x) = y_1f_1(x) + y_2f_2(x) + y_3f_3(x) \]

神奇 發現這三條曲線就求出了想要的那條曲線

推導

對於上面的三條曲線顯然滿足性質

\[f_i(x_j) = \begin{cases} 1~~~(i = j)\\ 0~~~(i \neq j) \end{cases} \]

然后構造出這么個柿子

\[f_1(x) = \frac{(x - x_2)(x - x_3)}{(x_1 - x_2)(x_1 - x_3)} \]

進一步推廣

\[f_i(x) = \prod_{j \neq i}^{j\leq n}\frac{x - x_j}{x_i - x_j} \]

然后就有了

\[f(x) = \sum_{i = 1}^{i = n} y_i * f_i(x) \]

P4781 【模板】拉格朗日插值

code

x 取值連續時

當題目要用到的 x 取值是連續的,上面的柿子可以優化到 \(O(n)\)

先列出柿子

\[f(k) = \sum_{i = 1}^{i = n} y_i * \prod_{j \neq i}^{j\leq n}\frac{x_k - x_j}{x_i - x_j} \]

考慮 \(O(1)\) 求出 \(\prod_{j \neq i}\frac{x_k - x_j}{x_i - x_j}\)

維護 \(x_k\) 的前綴積和后綴積

\[pre_i = \prod_{j = 0}^{i} (x_k - x_j)\\ suf_i = \prod_{j = i}^{n} (x_k - x_j) \]

對於分母,就是個階乘形式,柿子就成了

\[f(k) = \sum_{i = 0}^{n}y_i\frac{pre_{i - 1}*suf_{i + 1}}{fac_i * fac_{n - i}} \]

坑:當 \(n - i\) 為奇數的時候分母為負值

CF622F The Sum of the k-th Powers

code

重心拉格朗日插值法

毒瘤題目會隨時增加或者減少差值點,這個時候曲線就會改變,上面的柿子就需要重新計算了,那么上面的復雜度就會退化成 \(n^3\) 於是就有了重心拉格朗日插值 (好像牛頓插值法也可以辦到 = =)

還是前面的柿子

\[f(x) = \sum_{i = 1}^{n}y_i\prod_{i\neq j} \frac{x - x_j}{x_i - x_j}\\ ~~\\ = \sum_{i = 1}^{n}y_i\frac{\prod_{i\neq j}{x - x_j}}{\prod_{i\neq j}{x_i - x_j}}\\ ~~\\ = \sum_{i = 1}^{n}y_i\frac{\prod_{i = 1}^{n}(x - x_i)}{\prod_{i\neq j}(x_i - x_j)*(x - x_i)} ~~\\ ~=\prod_{i = 1}^{n}(x - x_i)\sum_{i = 1}^{n}\frac{y_i}{\prod_{i\neq j}(x_i - x_j)*(x - x_i)} \]

令 $g = \prod_{i = 1}^{n}(x - x_i),t(i) = \prod_{i\neq j}(x_i - x_j) $

然后柿子就成了

\[f(x) = g\sum^n_{i = 1}\frac{y_i}{(x - x_i)*t(i)} \]

對於每加入或減少一個點,可以只 \(O(n)\) 更新 \(t(i)\)

對於求值,可以 \(O(n)\) 求出 g,然后套公式就好了

預處理出逆元

時間復雜度 \(O(n)\)

參考資料

如何直觀地理解拉格朗日插值法?

拉格朗日插值學習小結

拉格朗日插值學習總結


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM