Matlab插值法


實驗目的:

1.Matlab中多項式的表示及多項式運算

2.用Matlab實現拉格朗日及牛頓插值法

3.用多項式插值法擬合數據

實驗要求:

1.掌握多項式的表示和運算 

2.拉格朗日插值法的實現(參見呂同富版教材)

3.牛頓插值法的實現(參見呂同富版教材)

實驗內容:

1.多項式的表達式和創建;多項式的四則運算、導數與積分。

2.Matlab實現拉格朗日及牛頓插值法。

3.用多項式插值法擬合數據。

 

 

 實驗步驟:

  1.多項式的表達式,MATLAB中使用以為向量來表示多項式,將多項式的系數按照降冪次序存放在向量中。多項式P(x)的具體表示方法:的系數構成向量為:

 

 

 

。示例如下:

 

 

   

 

 

 

 

 

  將向量表示的多項式用字符串輸出的通用函數示例:

 

   

 

 

   例子運行示例:

  

 

 

   多項式的加法:

  

 

 

   結果是

 

  多項式乘法:

  

 

 

   結果是

 

 

   多項式除法:

   

 

 

   多項式導數:

   

 

 

   

 

 

   

 

  2.用Matlab實現拉格朗日,拉格朗日代碼:

 1 function yi=Lagrange(x,y,xi)
 2 m=length(x);n=length(y);p=length(xi);
 3 if m~=n 
 4     error('向量x與y的長度必須一致');
 5 end
 6 s=0;
 7 for k=1:n
 8     t=ones(1,p);
 9     for j=1:n
10         if j~=k
11             t=t.*(xi-x(j))./(x(k)-x(j));
12         end
13     end
14     s=s+t.*y(k);
15 end
16 yi=s;
17 end    
Lagrange

  運行示例:

  

 

 

   

 

  

 

 

   

 

 

   

 

 

   

 

 

   牛頓插值法代碼:

 1 function yi=newtonint(x,y,xi)
 2 m=length(x);n=length(y);
 3 if m~=n
 4     error('向量x與y的長度必須一致');
 5 end
 6 A=zeros(n);
 7 A(:,1)=y;
 8 for j=2:n%j為列標
 9     for i=1:(n-j+1) %i為行標
10         A(i,j)=(A(i+1,j-1)-A(i,j-1))/(x(i+j-1)-x(i));%計算差商表
11     end
12 end
13 %根據差商表,求對應的牛頓插值多項式在x=xi處的值yi
14 N(1)=A(1,1);
15 for j=2:n
16     T=1;
17     for i=1:j-1
18         T=T*(xi-x(i));
19     end
20     N(j)=A(1,j)*T;
21 end
22 yi=sum(N);  %將x=xi帶入牛頓插值多項式,得到的yi的值
23 %A  輸出差商表
24 end
newtonint

  運行實例:

   

 

 

   等距節點的牛頓向后插值代碼:

 1 function yi=newtonint1(x,y,xi)
 2 h=x(2)-x(1);t=(xi-x(1))/h;
 3 n=length(y);Y=zeros(n);Y(:,1)=y';
 4 for k=1:n-1
 5     Y(:,k+1)=[diff(y',k);zeros(k,1)];
 6 end
 7 yi=Y(1,1);
 8 for i=1:n-1
 9     z=t;
10     for k=1:i-1 
11         z=z*(t-k);
12     end
13     yi=yi+Y(1,i+1)*z/prod([1:i]);
14 end
newtonint1

  運行實例:

  

 

 

   等距節點的牛頓向前插值代碼:

 1 function yi=newtonint2(x,y,xi)
 2 n=length(x);h=x(n)-x(n-1);t=(x(n)-xi)/h;
 3 n=length(y);Y=zeros(n);Y(:,1)=y';
 4 for k=1:n-1
 5     Y(:,k+1)=[zeros(k,1);diff(y',k)];
 6 end
 7 h=x(n)-x(n-1);t=(x(n)-xi)/h;yi=Y(n,1);
 8 for i=1:n-1
 9     z=t;
10     for k=1:i-1 
11         z=z*(t-k);
12     end
13     yi=yi+Y(n,i+1)*(-1)^i*z/prod([1:i]);
14 end
newtonint2

  運行示例:

  

 

 

 

 

  3.使用4次牛頓插值多項式插值,並作圖:

  

 

 

   解:由4次牛頓插值多項式,

  

 

 

   求上述多項式的系數:(修改newtonint.m代碼,得到差商表),代碼如下:

 1 function B=newtonint4(x,y)
 2 m=length(x);n=length(y);
 3 if m~=n
 4     error('向量x與y的長度必須一致');
 5 end
 6 A=zeros(n);
 7 A(:,1)=y;
 8 for j=2:n%j為列標
 9     for i=1:(n-j+1) %i為行標
10         A(i,j)=(A(i+1,j-1)-A(i,j-1))/(x(i+j-1)-x(i));%計算差商表
11     end
12 end
13 B=A;
14 end
newtonint4

  代入數據得到差商表:

  

0.98

-0.3

-0.625

-0.2083

-0.5208

0.92

-0.55

-0.75

-0.625

0

0.81

-0.85

-1.125

0

0

0.64

-1.3

0

0

0

0.38

0

0

0

0

  已知,第一行的便是插值多項式的系數,代入插值多項式:

  

 

   並作出圖像:

 1 x0=[0.2 0.4 0.6 0.8 1.0];
 2 y0=[0.98 0.92 0.81 0.64 0.38];
 3 plot(x0,y0,'b-o')
 4 hold on
 5 k=0:1:10;
 6 x=0.2+0.08*k;
 7 for i=1:1:11
 8     y(i)=0.98-0.3*(x(i)-0.2)-0.625*(x(i)-0.2)*(x(i)-0.4)-0.2083333*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)-0.520833333*(x(i)-0.2)*(x(i)-0.4)*(x(i)-0.6)*(x(i)-0.8);
 9 end
10 plot(x,y,'r-o');
11 legend('原圖像','4次插值圖像');
plot3

  

 

 

 

小結:

  在編寫牛頓插值的代碼時,我遇到了超出元組索引的問題。我在MATLAB的提示下(它的提示是英語),如圖:

  

 

   這個f是使用迭代來求差商的,但是出現了問題。我根據它的提示創建了一個全零數組用於存儲運算得到的差商,在某種程度上解決了這個問題。

   在解決第3題時,我特意編寫了一個算差商的程序和一個4次牛頓插值多項式代入數據畫圖的程序。差商的程序是修改第2題的牛頓插值程序得到的,這在一定程度上說明,一個程序的功能是可以分開的同時也可以寫在一起的。但在寫4次多項式代入畫圖的程序時,並沒有參考的我,只能回看書本關於4次牛頓插值的知識,我得到了這個牛頓插值多項式的公式,並發現它的關鍵就是每一項的系數,而那些系數就是算得的差商,所以,很快,我就寫出了4次多項式代入畫圖的程序。很開心的是,算得的多項式擬合得很好。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM