天天看點

Lagrange插值函數及其Matlab代碼

一.為什麼要引進插值函數

在實際問題中,兩個變量的關系y=f(x)經常要 靠實驗和觀測來獲得,而在通常的情況下隻能得到f(x)在有限個點上的值

Lagrange插值函數及其Matlab代碼

=

Lagrange插值函數及其Matlab代碼

(

Lagrange插值函數及其Matlab代碼

),  i=0,1,2,...,n

人們希望找到f(x)的一個近似函數y=

Lagrange插值函數及其Matlab代碼

(x),使得

Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼

,i=0,1,2,...,n                                   (0.1)

此時,

Lagrange插值函數及其Matlab代碼

稱為被插函數,點

Lagrange插值函數及其Matlab代碼

稱為插值結點,

Lagrange插值函數及其Matlab代碼

稱為插值函數,(0.1)稱為插值條件。

在處理插值問題的時候,首先根據需要選擇

Lagrange插值函數及其Matlab代碼

是哪一類函數,如果選擇

Lagrange插值函數及其Matlab代碼

為代數多項式就産生了代數插值問題。類似地,有三角多項式插值,有理函數插值和樣條函數插值等問題,本文主要考慮代數多項式插值問題。

二.Lagrange插值的定義

由于大家都學過推到過程,我就不一一推導了,直接上公式:

n次Lagrange插值多項式:

Lagrange插值函數及其Matlab代碼

其中

Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼

Lagrange插值函數及其Matlab代碼

次基函數               

Lagrange插值函數及其Matlab代碼

這裡着重講一下一次Lagrange插值和二次Lagrange插值,又分别稱為線性Lagrange插值和抛物線性Lagrange插值。

例如我們通過實驗或觀測已知如下表所示的資料,要求構造一個抛物線插值函數。

抛物線插值問題

X
Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼
Y
Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼

直接帶入公式可得:

Lagrange插值函數及其Matlab代碼

                                                                                               (1)

                        其中     

Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼
Lagrange插值函數及其Matlab代碼

Lagrange插值多項式不必死記硬背,其基函數

Lagrange插值函數及其Matlab代碼

隻有在x=

Lagrange插值函數及其Matlab代碼

時,基函數才為1,在x等于其他點時,

Lagrange插值函數及其Matlab代碼

=0.記住這個特性,基函數公式就特别簡單推到了。

三.Lagrange插值多項式的應用

光說不練都是假把戲,接題:

已知

Lagrange插值函數及其Matlab代碼

,求

Lagrange插值函數及其Matlab代碼

Lagrange插值函數及其Matlab代碼

=100,

Lagrange插值函數及其Matlab代碼

=10,

Lagrange插值函數及其Matlab代碼

=121,

Lagrange插值函數及其Matlab代碼

=11,

Lagrange插值函數及其Matlab代碼

=144,

Lagrange插值函數及其Matlab代碼

=12

代入(1)得                

Lagrange插值函數及其Matlab代碼

将(2)整理下,然後将x=115代入得y=10.7228,可以驗證同精度比較,該結果具有4位有效數字。

四.Lagrange插值多項式的Matlab程式

function s=LagrangeInter(x,y,x0)
%% LagrangeInter:求拉格朗日插值多項式函數
% x為節點X坐标向量
% y為節點Y坐标向量
% x0為待計算點的x坐标

syms p;
n=length(x);             %讀取x向量維數                             
s=0;
for i=1:n
    Li=y(i); 
%構造基函數
    for j=1:i-1
        Li=Li*(p-x(j))/(x(i)-x(j));      
    end
    for j=i+1:n
        Li=Li*(p-x(j))/(x(i)-x(j));    
    end
    s=s+Li;                        
    simplify(s);                       
end
%對輸入參數個數做判斷,如果隻有兩個參數直接給出插值多項式
%如果三個參數  則給出插值點的插值結果,第三個參數可以為向量
if(nargin==2)
  s=subs(s,'p','x');  
  s=collect(s);        %展開多項式
%  s=vpa(s,4);          %把系數取到6位精度表達         
else
    s = subs(s,'p',x0);
    %   m=length(x0);     %讀取t長度
%分别對t的每一個分量插值 
%   for i=1:m
%      temp(i)=subs(s,'p',x0(i)); 
%   end  
%     s=temp;
end
           

繼續閱讀