什麼是拉格朗日插值?假設我們現在有三個點 \((x_1,y_1),(x_2,y_2),(x_3,y_3)\),現在我們要找一條唯一的二次曲線剛好經過這三個點。
拉格朗日給出了乙個絕妙的方法,他把我們要求的曲線的表示式等同於三個函式的累加。具體是這麼操作的:
第乙個函式保證\(f_1(x_1)=1,f_1(x_2)=f_1(x_3)=0\)
第二個函式保證\(f_2(x_2)=1,f_2(x_1)=f_2(x_3)=0\)
第三個函式保證\(f_3(x_3)=1,f_3(x_1)=f_3(x_2)=0\)
那麼我們所要求的函式即為:
$f(x)=y1f_(x)+y2f_(x)+y3f_(x)$
可以保證的是這個函式同時經過\((x_1,y_1),(x_2,y_2),(x_3,y_3)\)並且是唯一的滿足條件的二次函式。
如果上面的部分你看懂了,那麼你已經掌握了拉格朗日插值的用法和思想。接下來我們要做的就是尋找乙個公式使得利用現在已有的\(n\)個點,來推導出\(n-1\)次的函式。
那麼這個函式為:
$f(x)=\sum_^ny_i\prod_^n\frac$ 一般情況下拉格朗日插值的複雜度是\(o(n^2)\),即:
#includeusing namespace std;
const int n = 1e6+100;
typedef long long ll;
const ll mod = 998244353;
struct pointp[n];
int n,k;
ll qpow(ll a,ll b,ll mod)
a=(a%mod*a%mod)%mod;
b>>=1;
} return ans%mod;
}ll lagrange(int k)
ans=(ans%mod+(p[j].y%mod*base1%mod*qpow(base2,mod-2,mod)%mod)%mod)%mod;
} return ans;
} int main()
return (ans%mod+mod)%mod;
}//拉格朗日插值,n項,每個點的座標為(x_i,y_i),求第xi項的值,保證x是連續的一段
ll lagrange(ll n, ll *x, ll *y, ll xi)
int main(){
ll n,k;
cin>>n>>k;
if(k==0){
cout其實拉格朗日插值在演算法競賽中主要用於資料分析,即對於給定的某些關係構造出若干已知點,然後利用這些已知點去計算通項公式。
拉格朗日插值
拉格朗日插值基函式 li x x x 0 x xi 1 x xi 1 x x n x i x0 xi xi 1 xi xi 1 xi xn 拉格朗日差值函式 ln x i 0 nyil i x 其中,x為缺失值對應的下表序號,ln x 為缺失值的插值結果,xi 為缺失值yi 的下表序號。對全部缺失值...
拉格朗日插值
function s larg1 x,y,xi m length x 求出插值節點向量長度 n length y if m n error 向量x與y的長度必須一致 這裡肯定一致,只是為了消除直接選取x,y資料的時候出錯而設定的 end s 0 for i 1 n z ones 1,length x...
拉格朗日插值
存在性和唯一性的證明以後再補。拉格朗日插值,emmmm,名字挺高階的 joy 它有什麼應用呢?我們在fft中講到過 設 n 1 次多項式為 y sum a i x i 有乙個顯然的結論 如果給定 n 個互不相同的點 x,y 則該 n 1 次多項式被唯一確定 那麼如果給定了這互不相同的 n 個點,利用...