1. 程式人生 > >拉格朗日插值法複習小計

拉格朗日插值法複習小計

拉格朗日插值法

概述

因為n次方的函式影象可以有n+1個點確定(比如說y=kx+b就只用兩個點確定,y=ax2+bx+c,只用三個點就可以確定),所以個n次方的方程給你n+1個x或者y就能確定這個方程。拉格朗日插值法就可以把這n+1個對應的值插進一個方程,然後給一個x,可以求出y。比如y=3x+2,給你(x=1,y=5;x=4,y=14)那麼隨意詢問一個x,用拉格朗日插值法就可以求出對應的y。

拉格朗日插值法基本多項式

li(x)=yinj=1,jixxjxixj(x是代進去的數)

運用

首先給你n個x,和n個對應的y。(x[i],y[i])
有一個公式y=ni=1li

(x)=ni=1yinj=1,jixxjxixj
比如說x1=1,y1=5;x2=4,y2=14
那麼我們詢問x=15時,y=?
y=y115x2x1x2+y215x1x2x1
算出來後,y=47

證明

我們可以發現拉格朗日插值法基本多項式li(x)在x=x[i]時,li(x)=yi1=yi,但是在li(x,xi)是,如果x=x[j] (ji)時,li(x)=yi0=0。最後求和一下,如果帶進去的x是x[i] (1,2,3,4..n)(給出的那些點)中的某個數,那麼ni=1li(x)=yi。因為一共給了n個點得座標,n個對應的值可以確定一個n-1次的多項式函式,而

ni=1li(x)都會得到對應的值,所以就可以確定這個函式,那麼隨意帶進去一個x都會返回對應的y。
如果要求多項式的係數,可以把ni=1li(x)=yi展開,不過有些麻煩。

拉格朗日插值法Code

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
using namespace std;
int x,i,j,k,l,t,n,m,a[100000
],b[10000];//a是x,b是y double temp,ans; int main(){ scanf("%d",&n); fo(i,1,n){ scanf("%d%d",&a[i],&b[i]); } scanf("%d",&x); fo(i,1,n){ temp=b[i]; fo(j,1,n){ if(i==j) continue; temp*=(x-a[j]); temp/=(a[i]-a[j]); } ans+=temp; } printf("%.5lf",ans); }

注意

拉格朗日插值法如果要在(mod p)意義下進行的話,那麼p只能是質數。
如果要mod非質數的話,那麼就要用牛頓插值法。