在數(shù)值分析中,拉格朗日插值法是以法國十八世紀(jì)數(shù)學(xué)家約瑟夫·拉格朗日命名的一種多項式插值方法。許多實際問題中都用函數(shù)來表示某種內(nèi)在聯(lián)系或規(guī)律,而不少函數(shù)都只能通過實驗和觀測來了解。
如對實踐中的某個物理量進(jìn)行觀測,在若干個不同的地方得到相應(yīng)的觀測值,拉格朗日插值法可以找到一個多項式,其恰好在各個觀測的點取到觀測到的值。這樣的多項式稱為拉格朗日(插值)多項式。
數(shù)學(xué)上來說,拉格朗日插值法可以給出一個恰好穿過二維平面上若干個已知點的多項式函數(shù)。拉格朗日插值法最早被英國數(shù)學(xué)家愛德華·華林于1779年發(fā)現(xiàn),不久后(1783年)由萊昂哈德·歐拉再次發(fā)現(xiàn)。1795年,拉格朗日在其著作《師范學(xué)校數(shù)學(xué)基礎(chǔ)教程》中發(fā)表了這個插值方法,從此他的名字就和這個方法聯(lián)系在一起。
第二步:構(gòu)造拉格朗日插值算法函數(shù),并使用C/C++ 語言實現(xiàn)
//預(yù)先定義插值節(jié)點的個數(shù)為1000個,根據(jù)控制臺輸入的個數(shù)num從而確定插值節(jié)點的個數(shù)const int N=1000;// 拉格朗日插值算法float lglr(float x[], float y[],int n,float t){float yResult=0.0;//LValue[N]存放的是每次求解的插值基函數(shù)的通項float LValue[N];//循環(huán)變量k,mint k,m;//插值基函數(shù)中的上下累乘temp1,temp2float temp1,temp2;for(k=0;k{ temp1=1.0; temp2=1.0;for(m=0;m { (m==k) {continue; } temp1 *= (t-x[m]); temp2 *= (x[k]-x[m]); } LValue[k]=temp1/temp2; }for(int i=0;i { yResult += y[i]*LValue[i]; }return yResult;}
第三步:測試線性插值效果
1.給寫入的算法送入斜線的3個點,來預(yù)測此區(qū)間的其它點,發(fā)現(xiàn)預(yù)測出的線性值很好,線性度很飽滿。
2.同樣是給寫入的算法送入正弦曲線3個點,來預(yù)測此區(qū)間的其它點,發(fā)現(xiàn)預(yù)測出的正弦曲線不太理想,相關(guān)度很差。
3.增加給寫入的算法送入正弦曲線的點數(shù)到10個點,來預(yù)測此區(qū)間的其它點,發(fā)現(xiàn)預(yù)測出的正弦曲線已達(dá)到要求,相關(guān)度很好。
4.下面是使用matlab在繪制的圖像,分別是線性3點、正弦3、5、10的和原始值對比的圖像。
第四步:移植到單片機使用串口輸出測試插值效果,效果還可以哦!
第四步:進(jìn)階完善,有點不甘心,使用Qt 搭了一個界面,做了一下可視化。
你別說效果還可以,Qt界面代碼 放到了 gitee有興趣的來一起完善 https://gitee.com/lumengcode/my-qt/tree/master/MathTool/MathTool
插值題外話:
關(guān)于插值算法:可以繼續(xù)完善 牛頓插值、三次樣條插值等,都很好玩!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!