matlab用插值法plot,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~=n4 error(‘向量x與y的長度必須一致‘);5 end6 s=0;7 for k=1:n8 t=ones(1,p);9 for j=1:n10 if j~=k11 t=t.*(xi-x(j))./(x(k)-x(j));12 end13 end14 s=s+t.*y(k);15 end16 yi=s;17 end
Lagrange
運行示例:
牛頓插值法代碼:
1 function yi=newtonint(x,y,xi)2 m=length(x);n=length(y);3 if m~=n4 error(‘向量x與y的長度必須一致‘);5 end6 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 end12 end13 %根據差商表,求對應的牛頓插值多項式在x=xi處的值yi14 N(1)=A(1,1);15 for j=2:n16 T=1;17 for i=1:j-1
18 T=T*(xi-x(i));19 end20 N(j)=A(1,j)*T;21 end22 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 end7 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 end13 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 end7 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 end13 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~=n4 error(‘向量x與y的長度必須一致‘);5 end6 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 end12 end13 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 on5 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 end10 plot(x,y,‘r-o‘);11 legend(‘原圖像‘,‘4次插值圖像‘);
plot3
小結:
在編寫牛頓插值的代碼時,我遇到了超出元組索引的問題。我在MATLAB的提示下(它的提示是英語),如圖:
這個f是使用迭代來求差商的,但是出現了問題。我根據它的提示創建了一個全零數組用于存儲運算得到的差商,在某種程度上解決了這個問題。
在解決第3題時,我特意編寫了一個算差商的程序和一個4次牛頓插值多項式代入數據畫圖的程序。差商的程序是修改第2題的牛頓插值程序得到的,這在一定程度上說明,一個程序的功能是可以分開的同時也可以寫在一起的。但在寫4次多項式代入畫圖的程序時,并沒有參考的我,只能回看書本關于4次牛頓插值的知識,我得到了這個牛頓插值多項式的公式,并發現它的關鍵就是每一項的系數,而那些系數就是算得的差商,所以,很快,我就寫出了4次多項式代入畫圖的程序。很開心的是,算得的多項式擬合得很好。
原文:https://www.cnblogs.com/jianle23/p/12817734.html
總結
以上是生活随笔為你收集整理的matlab用插值法plot,Matlab插值法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: javascript进制转换_「js基础
- 下一篇: Linux磁盘的划分