重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
matlab中使用插值函数
成都创新互联公司从2013年创立,是专业互联网技术服务公司,拥有项目成都网站制作、做网站网站策划,项目实施与项目整合能力。我们以让每一个梦想脱颖而出为使命,1280元茄子河做网站,已为上家服务,为茄子河各地企业和个人服务,联系电话:13518219792
插值函数(the function of interpolation )
interp1
调用函数的格式(Syntax)
yi = interp1(x,Y,xi)
yi = interp1(Y,xi)
yi = interp1(x,Y,xi,method)
yi = interp1(x,Y,xi,method,'extrap')
yi = interp1(x,Y,xi,method,extrapval)
pp = interp1(x,Y,method,'pp')
调用格式说明(Description)
yi = interp1(x,Y,xi) 返回矢量X和Y决定的根据输入的节点xi时对应的y的值.矢量Y是矢量X的一个函数映射.
如果Y是一个矩阵,那么插值结果是一个对应的矩阵.
[===================================================
yi = interp1(x,Y,xi) returns vector yi containing elements corresponding to the elements of xi and determined by interpolation within vectors x and Y. The vector x specifies the points at which the data Y is given. If Y is a matrix, then the interpolation is performed for each column of Y and yi is length(xi)-by-size(Y,2).
===================================================]
yi = interp1(x,Y,xi,method)插值中可以使用的方法: 插值方法 说明 nearest 临近的两点插值 linear 线性插值(默认) spline 三次样条插值 pchip 分段三次Hermite插值多项式插值 cubic (作用于pchip相同) v5cubic 用matlab5版本中断三次样条插值 [====================================================
yi = interp1(x,Y,xi,method) interpolates using alternative methods:
methodDescription
nearestNearest neighbor interpolation
linearLinear interpolation (default)
splinesplineCubic spline interpolation
pchipPiecewise cubic Hermite interpolation
cubic(Same as 'pchip')
v5cubicCubic interpolation used in MATLAB 5
======================================================]
简单程序示例
x=[0.0 0.1 0.195 0.3 0.401 0.5];
y=[0.39849 0.39695 0.39142 0.38138 0.36812 0.35206];
plot(x,y);
T=interp1(x,y,.25,'linear') %线性插值
(返回结果T=0.3862)
T=interp1(x,y,.25,'nearest') % 两点插值
(返回结果T=0.3814)
T=interp1(x,y,.25,'spline') % 三次样条插值
(返回结果T =0.3867)
T=interp1(x,y,.25,'cubic') %三次插值
(返回结果T =0.3867)
用Matlab实现了3次样条曲线插值的算法。边界条件取为自然边界条件,即:两个端点处的2阶导数等于0;
共包含3各个函数文件,主函数所在文件(即使用的时候直接调用的函数)为spline3.m,另外两个函数文件是在splin3函数文件中被调用的自定义函数。一个是GetParam.m,一个是GetM.m。
%GetParam.m文件的内容:
%根据给定的离散点的横坐标所构成的向量,计算各个区间段的h值;
function GetParam(Vx,Vy)
global gh;
global gf;
global gu;
global gr;
global gd;
global gff;
global gM;
%global gn;
%n=length(Vx);%length()为向量Vx所含元素的个数;
%n=legth(Vx);
%gn=n;
%n=gn;
n=length(Vx);
gh(1)=Vx(2)-Vx(1);
gf(1)=(Vy(2)-Vy(1))/gh(1);
for i=2:1:n-1%从区间0到区间n-1;
gh(i)=Vx(i+1)-Vx(i);
gf(i)=(Vy(i+1)-Vy(i))/gh(i);
gu(i)=gh(i-1)/(gh(i-1)+gh(i));
gr(i)=1-gu(i);
gff(i)=(gf(i-1)-gf(i))/(Vx(i-1)-Vx(i+1));
gd(i)=6*gff(i);
end
%设置与边界条件有关的参数;
gM(1)=0;%起点的2阶导数;
gM(n)=0;%终点的2阶导数;
end
%GetM.m文件的内容:
function GetM(Vx)
global gh;
global gf;
global gu;
global gr;
global gd;
global gff;
global gM;
%global gn;
nn=length(Vx);
%nn=gn;
n=nn-2;
b=zeros(n,1);
A=zeros(n,n);
A(1,1)=2;A(1,2)=gr(2);
b(1)=gd(2)-gu(2)*gM(1);
for i=2:1:n-1
A(i,i)=2;
A(i,i-1)=gu(i+1);
A(i,i+1)=gr(i+1);
b(i)=gd(i+1);
end
A(n,n-1)=gu(n);A(n,n)=2;
b(n)=gd(nn-1)-gr(nn-1)*gM(nn);
X=(inv(A))*b;
for i=2:1:nn-1
gM(i)=X(i-1);
end
end
%主函数文件spline3.m的内容:
function result=spline3(x,Vx,Vy)
global gh;
global gf;
global gu;
global gr;
global gd;
global gff;
global gM;
%global gn;
GetParam(Vx,Vy);
GetM(Vx);
%n=length(Vx);
%n=gn;
n=length(Vx);
nn=length(x);
y=zeros(1,nn);
for j=1:1:nn
i=1;
while(x(j)Vx(i+1))
i=i+1;
end
sn=i;
t1=(Vx(sn+1)-x(j))^3/(6*gh(sn));
t1=t1*gM(sn);
t2=(x(j)-Vx(sn))^3/(6*gh(sn));
t2=t2*gM(sn+1);
t3=Vy(sn)-gM(i)*((gh(i))^2)/6;
t3=t3*(Vx(sn+1)-x(j))/gh(sn);
t4=Vy(sn+1)-gM(sn+1)*((gh(sn))^2)/6;
t4=t4*(x(j)-Vx(sn))/gh(sn);
y(j)=t1+t2+t3+t4;
end
result=y;
end
函数调用的时候,result=spline3(x,Vx,Vy),x为代求点的横坐标向量,
(Vx,Vy)为已知的点的坐标。
2=6.610;
x3=6.082;
x4=5.607;
x5=5.423;
xH=5.825;
%我这里的版本是2006a的,不知道6.5是否可以通过,你可以自己试试。
x=[x1 x2 x3 x4 x5];
y=[638.3 640.2 650.6 653.2 659.9];%你原来x只有5个元素,而y却有7个元素,所以会出错,我删了最后两个
xi=linspace(x1,x5,100);%这里自动让它平均生成了100个点,如果觉得太多可以自行改少一点
%你下面左引号都是全角中文的,应该换成英文半角状态
ycubic=interp1(x,y,xi,'cubic');
ylinear=interp1(x,y,xi,'linear');
yH1=interp1(x,y,xH,'cubic');
yH2=interp1(x,y,xi,'linear');
plot(x,y,'*',xH,yH1,'o',xi,ycubic,'-');
grid on
————————————————————————————
你们老师果然不负责任啊,选课的时候也不说明的。
建议自己找本matlab的教材学习一下,应该还是很好上手的。