拉格朗日插值法
拉格朗日插值法可以幫助我們解決以下的問題
已知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,intxs,intys)
c1+=c2;
}return
c1;}
lagrange插值方法的核心就是構造一組基函式
。如果插值點是
i=1..n
,那麼希望構造出一組多項式
f_i(x)
使得f_i(x_i)=1,f_i(x_j)=0(j!=i)
其實就是構造乙個函式,這個函式在其中一點的值為1,其它點的值為0。
這樣的話把n個這樣的函式加權加起來得到的函式就是在每個點上的值都是需要的了。
注意1:這裡的多項式是一組。函式即是指多項式。其實針對每個插入點構造乙個多項式(函式)。
注意2:
關於如何得到多項式的請參閱
也就是說要構造「只受其中乙個點影響」(這種**比較粗糙,因為和其他點的位置還是有關係)的函式。
如果這一點能辦到,那麼只要取f(x)=sum(y_i*f_i(x))就是所要的插值多項式。
lagrange的插值方法其實就是直接構造出上述基函式:
f_i(x)=prod(x-x_j)/prod(x_i-x_j),其中prod是關於所有不等於i的j求乘積,
直接就可以驗證f_i(x)滿足前面提到的條件,
因為分子相當於確定了f_i(x)的所有根,分母則是歸一化係數。
對於一些很複雜的函式運算。也可以用拉格朗日插值法來計算以提高效率。
我們可以先用函式運算均勻的生成一些x點和其對應得數值對。
然後就可以用拉格朗日插值法來計算以提高效率。
具體使用見例項1
:staticvoid
lagrangedemo
()while
(data
>kmaxx);
}floatres0,res1;
floatdiff=0;
floatdiffmax=0;
floatdiffrate=0;
floatdiffratemax=0;
floatdiffall=0;
for(inti=0;i
}system.out.println("diffall:"+diffall+"diffmax:"+(diffmax)+"diffratemax:"+diffratemax+"%");
longtime=system.currenttimemillis();
for(inti=0;i
system.out.println("lagrangetime:"+(system.currenttimemillis()-time));
time=system.currenttimemillis();
for(inti=0;i
system.out.println("normaltime:"+(system.currenttimemillis()-time));
}static
hashmaphashmap=newhashmap();
finalstaticint
ksection=100;
staticfloat
count(inta,floatx)
return
lagrangepolynomial(x,f[0],f[1]);
}finalstaticfloatkminx=0;
finalstaticfloatkmaxx=100;
staticfloat
getpairs(inta)
return
pairs;
}staticfloat
function(inta,floatx)
c1+=c2;
}return
c1;}
staticfloat
lagrangepolynomial
(floatx,floatxs,floatys)
c1+=c2;
}return
c1;}
執行結果
:diffall:nandiffmax:4.8828125e-4diffratemax:-6.088556e-6%
lagrangetime:687
normaltime:99359
注意:只有函式f(x)非常複雜,且f(x)的值隨x變化不是很大時,用拉格朗日插值法來計算才有意義。
否則拉格朗日插值法的效率比直接用函式計算還要低。
關於拉格朗日插值法的更多數學知識請參考
拉格朗日插值法
模板題 給出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 等包...
拉格朗日插值法
當 x 的取值不一定是 1 n 連續的時候,我們只能 o n 地插出結果 洛谷 p4781 include define ll long long using namespace std const int n 2e3 10 const int mod 998244353 int x n y n l...