日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

[数学建模(六)]使用MATLAB实现插值

發(fā)布時(shí)間:2024/8/26 综合教程 35 生活家
生活随笔 收集整理的這篇文章主要介紹了 [数学建模(六)]使用MATLAB实现插值 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

常用的插值:拉格朗日多項(xiàng)式插值、牛頓插值、分段線性插值、Hermite 插值和三次樣條插值。

1.拉格朗日插值法

function y=lagrange(x0,y0,x);

n=length(x0);m=length(x);

for i=1:m

  z=x(i);

  s=0.0;

  for k=1:n

   p=1.0;

     for j=1:n

       if j~=k

         p=p*(z-x0(j))/(x0(k)-x0(j));

       end

     end

     s=p*y0(k)+s;

  end

  y(i)=s;

end

測(cè)試:

>> x0=1:5;

>> y0=x0.^2;

>> x=2.5;

>> y=lagrange(x0,y0,x)

y =

6.2500

>> plot(x0,y0)

>> hold on

>> plot(x,y,'*')

2.牛頓插值

function yi=newton(x,y,xi)

n=length(x);

m=length(y);

if n~=m

    error('The lengths of X ang Y must be equal!');

    return;

end

Y=zeros(n);

Y(:,1)=y';

for k=1:n-1

    for i=1:n-k

        if abs(x(i+k)-x(i))<eps

            error('the DATA is error!');

            return;

        end

        Y(i,k+1)=(Y(i+1,k)-Y(i,k))/(x(i+k)-x(i));

    end

end

yi=0;

for i=1:n

    z=1;

    for k=1:i-1

        z=z*(xi-x(k));

    end

    yi=yi+Y(1,i)*z;

end

測(cè)試:

x0=1:5;

y0=x0.^2;

x=2.5;

y=newton(x0,y0,x)

plot(x0,y0)

hold on

plot(x,y,'*')

y =

6.2500

3.分段線性插值

y=interp1(x0,y0,x,'method')

method 指定插值的方法,默認(rèn)為線性插值。其值可為:

'nearest' 最近項(xiàng)插值

'linear' 線性插值

'spline' 逐段3 次樣條插值

'cubic' 保凹凸性3 次插值。

所有的插值方法要求 x0 是單調(diào)的。

測(cè)試:

x0=1:5;

y0=x0.^2;

x=2.5;

y=interp1(x0,y0,x,'linear')

plot(x0,y0)

hold on

plot(x,y,'*')

y =

6.5000

4. 埃爾米特(Hermite)插值

function y=hermite(x0,y0,y1,x); %y1是導(dǎo)數(shù)值

n=length(x0);m=length(x);

for k=1:m

  yy=0.0;

  for i=1:n

    h=1.0;

    a=0.0;

    for j=1:n

      if j~=i

        h=h*((x(k)-x0(j))/(x0(i)-x0(j)))^2;

        a=1/(x0(i)-x0(j))+a;

      end

    end

    yy=yy+h*((x0(i)-x(k))*(2*a*y0(i)-y1(i))+y0(i));

  end

  y(k)=yy;

end

測(cè)試:

>> x0=1:5;

y0=x0.^2;

x=2.5;

y1=[1 1 1 1 1];

y=hermite(x0,y0,y1,x)

plot(x0,y0)

hold on

plot(x,y,'*')

y =

7.4228

5.樣條插值

Matlab 中三次樣條插值也有現(xiàn)成的函數(shù):

(1)y=interp1(x0,y0,x,'spline');

(2)y=spline(x0,y0,x);

(3)pp=csape(x0,y0,conds);

y=ppval(pp,x)

說明:

csape 的返回值是pp 形式,要求插

值點(diǎn)的函數(shù)值,必須調(diào)用函數(shù)ppval。

pp=csape(x0,y0):使用默認(rèn)的邊界條件,即Lagrange 邊界條件。

pp=csape(x0,y0,conds)中的conds 指定插值的邊界條件,其值可為:

'complete' 邊界為一階導(dǎo)數(shù),即默認(rèn)的邊界條件

'not-a-knot' 非扭結(jié)條件

'periodic' 周期條件

'second' 邊界為二階導(dǎo)數(shù),二階導(dǎo)數(shù)的值[0, 0]。

'variational' 設(shè)置邊界的二階導(dǎo)數(shù)值為[0,0]。

測(cè)試:

x0=1:5;

y0=x0.^2;

x=2.5;

y1=interp1(x0,y0,x,'spline')

y2=spline(x0,y0,x)

pp=csape(x0,y0,'second')

y3=ppval(pp,x)

plot(x0,y0)

hold on

plot(x,y1,'*')

plot(x,y2,'*')

plot(x,y3,'*')

y1 =

6.2500

y2 =

6.2500

pp =

包含以下字段的 struct:

form: 'pp'

breaks: [1 2 3 4 5]

coefs: [4×4 double]

pieces: 4

order: 4

dim: 1

y3 =

6.2321

6.二維插值

一維插值:節(jié)點(diǎn)為一維變量,插值函數(shù)是一元函數(shù)(曲線)。

二維插值:節(jié)點(diǎn)是二維的,插值函數(shù)就是二元函數(shù),即曲面。

6.1插值節(jié)點(diǎn)為網(wǎng)格節(jié)點(diǎn)

(1)z=interp2(x0,y0,z0,x,y,'method')

(2)pp=csape({x0,y0},z0,conds,valconds); %三次樣條插值

z=fnval(pp,{x,y})

6.2 插值節(jié)點(diǎn)為散亂節(jié)點(diǎn)

總結(jié)

以上是生活随笔為你收集整理的[数学建模(六)]使用MATLAB实现插值的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。