当前位置:文档之家› MATLAB二次插值应用程序

MATLAB二次插值应用程序

MATLAB二次插值应用程序
MATLAB二次插值应用程序

function eccz

syms x;%定义

f=25.666667*(5-4*x+x^2)+38.5*(1+x^2); %目标函数

a1=0.5;

a2=1.5;

a3=1; %插值区间

k=0;

while (abs(a3-a1)>1.0e-7) %精度

f1=subs(f,x,a1);

f2=subs(f,x,a2);

f3=subs(f,x,a3);

C1=(f3-f1)/(a3-a1);

C2=((f2-f1)/(a2-a1)-C1)/(a2-a3);

ap=0.5*(a1+a3-C1/C2);

fp=subs(f,x,ap);

if ap>a2;

if f2>=fp

a1=a2;

f1=f2;

a2=ap;

f2=fp;

else

a3=ap; f3=fp;

end

else

if f2>=fp; a3=a2; f3=f2; a2=ap; f2=fp;

else

a1=ap; f1=fp;

end

end

k=k+1

a=ap

ff=subs(f,x,ap) end

matlab插值法实例

Several Typical Interpolation in Matlab Lagrange Interpolation Supposing: If x=175, while y=? Solution: Lagrange Interpolation in Matlab: 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 input: x0=[144 169 225] y0=[12 13 15] y=lagrange(x0,y0,175) obtain the answer: x0 = 144 169 225 y0 = 12 13 15 y = 13.2302

Spline Interpolation Solution : Input x=[ 1 4 9 6];y=[ 1 4 9 6];x=[ 1 4 9 6];pp=spline(x,y) pp = form: 'pp' breaks: [1 4 6 9] coefs: [3x4 double] pieces: 3 order: 4 dim: 1 output : pp.coefs ans = -0.0500 0.5333 -0.8167 1.0000 -0.0500 0.0833 1.0333 2.0000 -0.0500 -0.2167 0.7667 4.0000 It shows the coefficients of cubic spline polynomial , so: S (x )=, 169,3)9(1484.0)9(0063.0)9(0008.0,94,2)4(2714.0)4(0183.0)4(0008 .0, 41,1)1(4024.0)1(0254.0)1(0008.0232 3 23≥≤+-+---≥≤+-+---≥≤+-+---x x x x x x x x x x x x Newton’s Interpolation Resolve 65 Solution: Newton’s Interpolation in matlab : function yi=newint(x,y,xi); n=length(x); ny=length(y); if n~=ny error end Y=zeros(n);Y(:,1)=y';

Matlab中插值函数汇总和使用说明

MATLAB中的插值函数 命令1:interp1 功能:一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。 x:原始数据点 Y:原始数据点 xi:插值点 Yi:插值点 格式 (1) yi = interp1(x,Y,xi) 返回插值向量yi,每一元素对应于参量xi,同时由向量x 与Y 的内插值决定。参量x 指定数据Y 的点。若Y 为一矩阵,则按Y 的每列计算。yi 是阶数为length(xi)*size(Y,2)的输出矩阵。 (2) yi = interp1(Y,xi) 假定x=1:N,其中N 为向量Y 的长度,或者为矩阵Y 的行数。 (3) yi = interp1(x,Y,xi,method) 用指定的算法计算插值: ’nearest’:最近邻点插值,直接完成计算; ’linear’:线性插值(缺省方式),直接完成计算; ’spline’:三次样条函数插值。对于该方法,命令interp1 调用函数spline、ppval、mkpp、umkpp。这些命令生成一系列用于分段多项式操作的函数。命令spline 用它们执行三次样条函数插值; ’pchip’:分段三次Hermite 插值。对于该方法,命令interp1 调用函数pchip,用于对向量x 与y 执行分段三次内插值。该方法保留单调性与数据的外形; ’cubic’:与’pchip’操作相同; ’v5cubic’:在MATLAB 5.0 中的三次插值。 对于超出x 范围的xi 的分量,使用方法’nearest’、’linear’、’v5cubic’的插值算法,相应地将返回NaN。对其他的方法,interp1 将对超出的分量执行外插值算法。 (4)yi = interp1(x,Y,xi,method,'extrap') 对于超出x 范围的xi 中的分量将执行特殊的外插值法extrap。 (5)yi = interp1(x,Y,xi,method,extrapval) 确定超出x 范围的xi 中的分量的外插值extrapval,其值通常取NaN 或0。

拉格朗日插值matlab程序

拉格朗日插值的调用函数 function y=lagrange(x0,y0,x) n=length(x0);m=length(x); for i=1:m z=x(i); L=0.0; for j=1:n T=1.0; for k=1:n if k~=j T=T*(z-x0(k))/(x0(j)-x0(k)); end end L=T*y0(j)+L; end y(i)=L; end 四个图在一起: x=[-1:0.05:1]; y=1./(1+25*x.^2); x0=[-1:0.4:1]; y0=1./(1+25*x0.^2); y1=lagrange(x0,y0,x); x0=[-1:0.2:1]; y0=1./(1+25*x0.^2); y2=lagrange(x0,y0,x); x0=[-1:0.1:1]; y0=1./(1+25*x0.^2); y3= lagrange(x0,y0,x); plot(x,y,'-r') hold on plot(x,y1,'-b',x,y2,'-r',x,y3,'-r')

l5和fx在一起: x=[-1:0.05:1]; y=1./(1+25*x.^2); x0=[-1:0.4:1]; y0=1./(1+25*x0.^2); y1=lagrange(x0,y0,x); plot(x,y,'-r') hold on plot(x,y1,'-b') l10和fx在一起: x=[-1:0.05:1]; y=1./(1+25*x.^2); x0=[-1:0.2:1]; y0=1./(1+25*x0.^2); y2= lagrange(x0,y0,x); plot(x,y,'-r') hold on plot(x,y2,'-b') l20和fx在一起: x=[-1:0.05:1]; y=1./(1+25*x.^2); x0=[-1:0.1:1]; y0=1./(1+25*x0.^2); y3= lagrange(x0,y0,x); plot(x,y,'-r') hold on plot(x,y3,'-b')

matlab插值法,迭代法程序

数值分析作业 姓名王建忠 学号132080202006 学院能源与动力工程 专业机械电子工程 2013年12月16日

https://www.doczj.com/doc/f48760456.html,grange插值多项式程序 function f=nalagr(x,y,xx) %x为节点向量 %y为节点函数值 %xx是插值点 syms s if(length(x)==length(y)) n=length(x); else disp('x和y的维数不相等!'); return; end f=0.0; for(i=1:n) l=y(i); for(j=1:i-1) l=l*(s-x(j))/(x(i)-x(j)); end; for(j=i+1:n) l=l*(s-x(j))/(x(i)-x(j));%计算拉格朗日基函数end; f=f+l;%计算拉格朗日插值函数 simplify(f); if(i==n) if(nargin==3) f=subs(f,'s');%计算插值点的函数值else f=collect(f);%将插值多项式展开 f=vpa(f,6);%将插值多项式的系数化成6位精度的小数 end end end >>x=[-2,-1,0,1];%已知节点向量y=[3,1,1,6];%节点函数值向量 f=nalagr(x,y) f= 0.5*s^3+ 2.5*s^2+ 2.0*s+ 1.0 >>f=nalagr(x,y,0) f=1 >>

2.牛顿插值多项式程序 function[p2,z]=newTon(x,y,t) %输入参数中x,y为元素个数相等的向量,t为待估计的点,可以为数字或向量。%输出参数中p2为所求得的牛顿插值多项式,z为利用多项式所得的t的函数值。 n=length(x); chaS(1)=y(1); for i=2:n x1=x;y1=y; x1(i+1:n)=[]; y1(i+1:n)=[]; n1=length(x1); s1=0; for j=1:n1 t1=1; for k=1:n1 if k==j continue; else t1=t1*(x1(j)-x1(k)); end end s1=s1+y1(j)/t1; end chaS(i)=s1; end b(1,:)=[zeros(1,n-1)chaS(1)]; cl=cell(1,n-1); for i=2:n u1=1; for j=1:i-1 u1=conv(u1,[1-x(j)]); cl{i-1}=u1; end cl{i-1}=chaS(i)*cl{i-1}; b(i,:)=[zeros(1,n-i),cl{i-1}]; end p2=b(1,:); for j=2:n p2=p2+b(j,:); end if length(t)==1 rm=0;

matlab插值(详细 全面)

Matlab中插值函数汇总和使用说明 MATLAB中的插值函数为interp1,其调用格式 为: yi= interp1(x,y,xi,'method') 其中x,y为插值点,yi为在被插值点xi处的插值结果;x,y为向量, 'method'表示采用的插值方法,MATLAB提供的插值方法有几种: 'method'是最邻近插值, 'linear'线性插值; 'spline'三次样条插值; 'cubic'立方插值.缺省时表示线性插值 注意:所有的插值方法都要求x是单调的,并且xi不能够超过x的范围。 例如:在一天24小时内,从零点开始每间隔2小时测得的环境温度数据分别为 12,9,9,10,18 ,24,28,27,25,20,18,15,13, 推测中午12点(即13点)时的温度. x=0:2:24; y=[12 9 9 10 18 24 28 27 25 20 18 15 13]; a=13; y1=interp1(x,y,a,'spline') 结果为: 27.8725 若要得到一天24小时的温度曲线,则: xi=0:1/3600:24; yi=interp1(x,y,xi, 'spline'); plot(x,y,'o' ,xi,yi)

命令1 interp1 功能一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。 x:原始数据点 Y:原始数据点 xi:插值点 Yi:插值点 格式 (1)yi = interp1(x,Y,xi) 返回插值向量yi,每一元素对应于参量xi,同时由向量x 与Y 的内插值决定。参量x 指定数据Y 的点。 若Y 为一矩阵,则按Y 的每列计算。yi是阶数为length(xi)*size(Y,2)的输出矩阵。(2)yi = interp1(Y,xi) 假定x=1:N,其中N 为向量Y 的长度,或者为矩阵Y 的行数。 (3)yi = interp1(x,Y,xi,method) 用指定的算法计算插值: ’nearest’:最近邻点插值,直接完成计算; ’linear’:线性插值(缺省方式),直接完成计算; ’spline’:三次样条函数插值。对于该方法,命令interp1 调用函数spline、ppval、mkpp、umkpp。这些命令生成一系列用于分段多项式操作的函数。命令spline 用它们执行三次样条函数插值; ’pchip’:分段三次Hermite 插值。对于该方法,命令interp1 调用函数pchip,用于对

MATLAB三次样条插值之三转角法

非常类似前面的三弯矩法,这里的sanzhj函数和intersanzhj作用相当于前面的sanwanj和intersanwj,追赶法程序通用,代码如下。 %%%%%%%%%%%%%%%%%%% function [newu,w,newv,d]=sanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值 % 将插值点分两次输入,x0 y0 单独输入 % 边值条件a的一阶导数 y1a 和b的一阶导数 y1b n=length(x);m=length(y); if m~=n error('x or y 输入有误,再来'); end v=ones(n-1,1); u=ones(n-1,1); d=zeros(n-1,1); w=2*ones(n-1,1); h0=x(1)-x0; h=zeros(n-1,1); for k=1:n-1 h(k)=x(k+1)-x(k); end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=3*(v(1)*(y(2)-y(1))/h(1)+u(1)*((y(1)-y0))/h0); % for k=2:n-1 v(k)=h(k-1)/(h(k-1)+h(k)); u(k)=1-v(k); d(k)=3*(v(k)*(y(k+1)-y(k))/h(k)+u(k)*(y(k)-y(k-1))/h(k-1)); end d(1)=d(1)-u(1)*y1a; d(n-1)=d(n-1)-v(n-1)*y1b; newv=v(1:n-2,:); newu=u(2:n-1,:); %%%%%%%%%%%% function intersanzhj(x,y,x0,y0,y1a,y1b) % 三转角样条插值

函数的插值方法及matlab程序

6.1 插值问题及其误差 6.1.2 与插值有关的MATLAB 函数 (一) POLY2SYM函数 调用格式一:poly2sym (C) 调用格式二:f1=poly2sym(C,'V') 或f2=poly2sym(C, sym ('V') ), (二) POLYVAL函数 调用格式:Y = polyval(P,X) (三) POLY函数 调用格式:Y = poly (V) (四) CONV函数 调用格式:C =conv (A, B) 例 6.1.2求三个一次多项式、和的积.它们的零点分别依次为0.4,0.8,1.2. 解我们可以用两种MATLAB程序求之. 方法1如输入MATLAB程序 >> X1=[0.4,0.8,1.2]; l1=poly(X1), L1=poly2sym (l1) 运行后输出结果为 l1 = 1.0000 - 2.4000 1.7600 -0.3840 L1 = x^3-12/5*x^2+44/25*x-48/125 方法2如输入MATLAB程序 >> P1=poly(0.4);P2=poly(0.8);P3=poly(1.2); C =conv (conv (P1, P2), P3) , L1=poly2sym (C) 运行后输出的结果与方法1相同. (五) DECONV 函数 调用格式:[Q,R] =deconv (B,A) (六) roots(poly(1:n))命令 调用格式:roots(poly(1:n)) (七) det(a*eye(size (A)) - A)命令 调用格式:b=det(a*ey e(size (A)) - A) 6.2 拉格朗日(Lagrange)插值及其MATLAB程序 6.2.1 线性插值及其MATLAB程序 例 6.2.1 已知函数在上具有二阶连续导数,,且满足条件 .求线性插值多项式和函数值,并估计其误差. 解输入程序 >> X=[1,3];Y=[1,2]; l01= poly(X(2))/( X(1)- X(2)), l11= poly(X(1))/( X(2)- X(1)), l0=poly2sym (l01),l1=poly2sym (l11), P = l01* Y(1)+ l11* Y(2), L=poly2sym (P),x=1.5; Y = polyval(P,x) 运行后输出基函数l0和l1及其插值多项式的系数向量P(略)、插值多项式L和插值Y为l0 = l1 = L = Y = -1/2*x+3/2 1/2*x-1/2 1/2*x+1/2 1.2500 输入程序 >> M=5;R1=M*abs((x-X(1))* (x-X(2)))/2

Matlab求解插值问题

Matlab求解插值问题 在应用领域中,由有限个已知数据点,构造一个解析表达式,由此计算数据点之间的函数值,称之为插值。 实例:海底探测问题 某公司用声纳对海底进行测试,在5×5海里的坐标点上测得海底深度的值,希望通过这些有限的数据了解更多处的海底情况。并绘出较细致的海底曲面图。 1、一元插值 一元插值是对一元数据点(x i,y i)进行插值。 线性插值:由已知数据点连成一条折线,认为相临两个数据点之间的函数值就在这两点之间的连线上。一般来说,数据点数越多,线性插值就越精确。 调用格式:yi=interp1(x,y,xi,’linear’) %线性插值 zi=interp1(x,y,xi,’spline’) %三次样条插值 wi=interp1(x,y,xi,’cubic’) %三次多项式插值说明:yi、zi、wi为对应xi的不同类型的插值。x、y为已知数据点。 例:已知数据: 求当x i=0.25时的y i的值。 程序: x=0:.1:1; y=[.3 .5 1 1.4 1.6 1 .6 .4 .8 1.5 2]; yi0=interp1(x,y,0.025,'linear') xi=0:.02:1; yi=interp1(x,y,xi,'linear'); zi=interp1(x,y,xi,'spline'); wi=interp1(x,y,xi,'cubic'); plot(x,y,'o',xi,yi,'r+',xi,zi,'g*',xi,wi,'k.-') legend('原始点','线性点','三次样条','三次多项式') 结果:yi0 = 0.3500

三次样条插值的MATLAB实现

MATLAB 程序设计期中考查 在许多问题中,通常根据实验、观测或经验得到的函数表或离散点上的信息,去研究分析函数的有关特性。其中插值法是一种最基本的方法,以下给出最基本的插值问题——三次样条插值的基本提法: 对插值区间[]b a ,进行划分:b x x x a n ≤

双线性插值Matlab程序

I=imread('flower.jpg'); %读入原图像 [nrows,ncols]=size(I);%读取图像矩阵大小,方便后面操作 K = str2double(inputdlg('please input scale factor (must between 0.2 - 5.0)', 'INPUT scale factor', 1, {'0.5'})); width = K * nrows; height = K * ncols; J = uint8(zeros(width,height)); widthScale = nrows/width; heightScale = ncols/height; for x = 5:width - 5 % 5是为了防止矩阵超出边界溢出 for y = 5:height - 5 xx = x * widthScale; % xx, yy为原坐标,x,y为新坐标 yy = y * heightScale; if (xx/double(uint16(xx)) == 1.0) & (yy/double(uint16(yy)) == 1.0) J(x,y) = I(int16(xx),int16(yy));%若xx,yy为整数,直接赋值 else a = double(uint16(xx)); b = double(uint16(yy)); x11 = double(I(a,b)); % x11 <- I(a,b) x12 = double(I(a,b+1)); % x12 <- I(a,b+1) x21 = double(I(a+1,b)); % x21 <- I(a+1,b) x22 = double(I(a+1,b+1)); % x22 <- I(a+1,b+1) J(x,y) = uint8( (b+1-yy) * ((xx-a)*x21 + (a+1-xx)*x11) + (yy-b) * ((xx-a)*x22 +(a+1-xx)

Matlab 一维插值interp1 例子 及 可视拟合界面

一维插值: 已知离散点上的数据集,即已知在点集X上对应的函数值Y,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。 MATLAB命令:yi=interp1(X, Y, xi, method) 一些个人经验说明: ①关于拟合参数的,X必须是向量,行向量或列向量均可,不可以是复数 ②Y是向量或矩阵.但必须满足行数与length(X)相同即size(Y,1)==length (X) ③针对以上说明的例子 function tu x=[5 1 2 20 14 21]' y=rand(6,2)%按列计算的 xi=linspace(0,21,100); yi=interp1(x,y,xi,'cubic') plot(x,y,'o',xi,yi) size(x) size(y,1) length(x) 结果 size(x) 6 1 size(y,1) 6 length(x) 6

该命令用指定的算法找出一个一元函数,然后以给出处的值。xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一:‘nearest’:最近邻点插值,直接完成计算; ‘spline’:三次样条函数插值; ‘linear’:线性插值(缺省方式),直接完成计算; ‘cubic’:三次函数插值; 对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。

%-- 09-4-1 下午8:38 --% %已知数据 t=1900:10:1990; p=[75.995,91.972,105.711,123.203,131.669,150.697,179.323,203.212,226.505,249.633];

MATLAB程序 插值

例1 用不同插值方法对一维数据进行插值。 程序代码 %interp1_example.m %用不同插值方法对一维数据进行插值,并比较其不同 x=0:1.2:10; y=sin(x); xi=0:0.1:10; yi_nearest=interp1(x,y,xi,'nearst');%最邻近插值 yi_linear=interp1(x,y,xi);% 默认插值方法线性插值 yi_spline=interp1(x,y,xi,'spline');% 三次样条插值 yi_cubic=interp1(x,y,xi,'cubic');% 三次多项式插值 yi_v5cubic=interp1(x,y,xi,'v5cubic'); %MATLAB5中使用的三次多项式插值hold on; subplot(2,3,1); plot(x,y,'ro',xi,yi_nearest,'b-'); title('最邻近插值'); subplot(2,3,2); plot(x,y,'ro',xi,yi_linear,'b-'); title('线性插值'); subplot(2,3,3); plot(x,y,'ro',xi,yi_spline,'b-'); title('三次样条插值'); subplot(2,3,4); plot(x,y,'ro',xi,yi_cubic,'b-'); title('三次多项式插值'); subplot(2,3,5); plot(x,y,'ro',xi,yi_v5cubic,'b-'); title('三次多项式插值(MATLAB5)');

运行结果

matlab线性插值

Matlab线性插值 已知离散点上的数据集,即已知在点集X上对应的函数值Y,构造一个解析函数(其图形为一曲线)通过这些点,并能够求出这些点之间的值,这一过程称为一维插值。 MATLAB命令:yi=interp1(X, Y, xi, method) 该命令用指定的算法找出一个一元函数,然后以给出xi处的值。xi可以是一个标量,也可以是一个向量,是向量时,必须单调,method可以下列方法之一: 'nearest':最近邻点插值,直接完成计算; 'spline':三次样条函数插值; 'linear':线性插值(缺省方式),直接完成计算; 'cubic':三次函数插值; 对于[min{xi},max{xi}]外的值,MATLAB使用外推的方法计算数值。下面是一个例子:t=1900:10:1990; p=[75.995,91.972,105.711,123.203,131.669,150.697,179.323,203.212,226.505,249.633]; x=1900:0.01:1990; %使用不同的方法进行一维插值 yi_linear=interp1(t,p,x); %线性插值 yi_spline=interp1(t,p,x,'spline');%三次样条插值 yi_cubic=interp1(t,p,x,'cubic');%三次多项式插值 yi_v5cubic=interp1(t,p,x,'v5cubic');%matlab5中使用的三次多项式插值 %绘制图像对比 %subplot是将多个图画到一个平面上的工具。其中,m表示是图排成m行,n表示图排成n列,也就是整个figure中有n个图是排成一行的,一共m行,如果第一个数字是2就是表示2行图。p是指你现在要把曲线画到figure中哪个图上,最后一个如果是1表示是从左到右第一个位置。 subplot(2,1,1); plot(t,p,'ko'); hold on; plot(x,yi_linear,'g','LineWidth',1.5);grid on; plot(x,yi_spline,'y','LineWidth',1.5);

插值MATLAB程序-数值分析

插值MATLAB程序(可以输出多项式)—数值分析 1.拉格朗日多项式逼近 function [C,L,y]=lagran(X,Y) %拉格朗日多项式逼近 w=length(X); L=zeros(w,w); for k=1:w V=1; for j=1:w if k~=j V=conv(V,poly(X(j)))/(X(k)-X(j)); end end L(k,:)=V; end C=Y*L; y=poly2sym(C,'x'); 2.牛顿插值多项式 function [C,D,y]=newpoly(X,Y) %牛顿插值多项式 n=length(X); D=zeros(n,n); D(:,1)=Y'; for j=2:n for k=j:n D(k,j)=(D(k,j-1)-D(k-1,j-1))/(X(k)-X(k-j+1)); end end C=D(n,n); for k=(n-1):-1:1 C=conv(C,poly(X(k))); m=length(C); C(m)=C(m)+D(k,k); end y=poly2sym(C,'x'); 3.切比雪夫逼近 function [C,X,Y]=cheby(fun,n,a,b) %切比雪夫逼近 if nargin==2 a=-1;b=1; end

d=pi/(2*n+2); C=zeros(1,n+1); for k=1:n+1 X(k)=cos((2*k-1)*d); end X=(b-a)*X/2+(a+b)/2; x=X; Y=eval(fun); for k=1:n+1 z=(2*k-1)*d; for j=1:n+1 C(j)=C(j)+Y(k)*cos((j-1)*z); end end C=2*C/(n+1); C(1)=C(1)/2;

hermite插值以及两种MATLAB程序

给定矢量P 0, P 1, R 0, R 1,称满足下列条件的参数三次多项式曲线P (t ),t ∈[0,1]为Hermite 曲线: H (x 0)=y 0,H (x 1)=y 1, H ′(x 0)=m 0,H ′(x 1)=m 1, 即Hermite 曲线两个端点为P 0, P 1,在两端点的切矢量分别R 0, R 1。记几何矩阵和基矩阵分别为G H , M H , G H , M H 是未知的.取G H =[P 0,P 1,R 0,R 1],则只要M H 就可以了。一般的曲线经过多项式分解, 得到参数多项式曲线的矩阵表示: P (t )=G ?M ?T 将(1)式代入(2)得到: G H ?M H ?T H |t=0=G H ?M H ?(1,0,0,0)T =P 0, G H ?M H ?T H |t=1=G H ?M H ?(1,1,1,1)T =P 1, G H ?M H ?T H |t=0=G H ?M H ?(0,1,0,0)T =R 0, G H ?M H ?T H |t=0=G H ?M H ?(0,1,2,3)T =R 1, 将上面四个式子合并如下形式: G H ?M H ?[1 01001111020103 ]=[P 0,P 1,R 0,R 1]=G H 上面方程的解不唯一,不妨取 M H =[1 01001111020103]?1=[1000?320?3?21?2100?11 ] 从而得到三次Hermite 曲线的方程:

P(t)=G H?M H?T 其中M H?T确定了一组Hermite基函数G0(t),G1(t),H0(t),H1(t),即 M H?T=[1 0?32 0?3?2 1?21 00?11 ][ 1 t t2 t3 ]=[ 1?3t2+2t3 3t2?2t3 t?2t2+t3 ?t2+t3 ] 附:MATLAB程序 function yy=hermite(x,y,dy,xx) % 输入 X——左右两个端点的X轴坐标 Y——左右两个端点的Y轴坐标 dy——左右两个端点的切矢 xx——中间插值的点X轴坐标 %输出 yy——中间插值的点Y轴坐标 function yy=hermite(x,y,dy,xx) k=length(xx); z=zeros(1,k); for i=1:k; s=0; xaix=xx(i); a=1-3.*(xaix)^2+2.*(xaix)^3; b=2.*(xaix)^2-2.*(xaix)^3; c=xaix-2.*(xaix)^2+(xaix)^3; d=-2.*(xaix)^2+(xaix)^3; s=y(1)*a+y(2)*b+dy(1)*c+dy(2)*d; z(i)=s; end yy=z;

MATLAB三次样条插值之三弯矩法

MATLAB三次样条插值之三弯矩法 首先说这个程序并不完善,为了实现通用(1,2,…,n)格式解题,以及为调用追赶法程序,没有针对节点数在三个以下的情况进行分类讨论。希望能有朋友给出更好的方法。 首先,通过函数sanwanj得到方程的系数矩阵,即追赶法方程的四个向量参数,接下来调 用追赶法(在intersanwj函数中),得到三次样条分段函数系数因子,然后进行多项式合并 得到分段函数的解析式,程序最后部分通过判断输入值的区间自动选择对应的分段函数并计算 改点的值。附:追赶法程序chase %%%%%%%%%%%%%% function [newv,w,newu,newd]=sanwj(x,y,x0,y0,y1a,y1b)?%三弯矩样 条插值?%将插值点分两次输入,x0y0单独输入?% 边值条件a的二阶导数 y1a 和b 的二阶导数y1b,这里建议将y1a和y1b换成y2a和y2b,以便于和三转角代码相区别 ?n=length(x);m=length(y); if m~=n?error('x or y 输入有误,再来'); end?v=ones(n-1,1);u=ones(n-1,1);d=zeros(n-1,1);?w=2*o nes(n+1);?h0=x(1)-x0;?h=zeros(n-1,1); for k=1:n-1?h(k)=x(k+1)-x(k);?end v(1)=h0/(h0+h(1)); u(1)=1-v(1); d(1)=6*((y(2)-y(1))/h(1)-(y(1)-y0)/h0)/(h0+h(1));?% for k=2:n-1?v(k)=h(k-1)/(h(k-1)+h(k));?u(k)=1-v(k);?d(k)= 6*((y(k+1)-y(k))/h(k)-(y(k)-y(k-1))/h(k-1))/(h(k-1)+h(k)); end newv=[v;1];?newu=[1;u]; d0=6*((y(1)-y0)/h0-y1a)/h0; d(n)=6*(y1b-(y(n)-y(n-1))/h(n-1))/h(n-1); newd=[d0;d]; %%%%%%%%%%%% function intersanwj(x,y,x0,y0,y1a,y1b) %三弯矩样条插值?%第一部分?n=length(x);m=length(y); if m~=n?error('xory 输入有误,再来'); end?%重新定义h?h=zeros(n,1); h(1)=x(1)-x0; for k=2:n h(k)=x(k)-x(k-1);?end %sptep1调用三弯矩函数?[a,b,c,d]=sanwj(x,y,x0,y0,y1a,y1b);

matlab插值程序设计

例1、 已知数据x=[0,3,5,7,9,11,12,13,14,15], y=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.4,1.6],采用四种方法进行插值,得到每隔0.5的数据。P96 课本 编写脚本文件: %Interpolation using the four methods x=[0,3,5,7,9,11,12,13,14,15]; y=[0,1.2,1.7,2.0,2.1,2.0,1.8,1.2,1.4,1.6]; length_of_x=length(x); scalar_x=[x(1):0.5:x(length_of_x)]; length_of_sx=length(scalar_x); for i=1: length_of_x y_nearst(i)=interp1(x,y,scalar_x(i), ‘nearst ’); y_linear(i)=interp1(x,y,scalar_x(i), ‘linear ’); y_spline(i)=interp1(x,y,scalar_x(i), ‘spline ’); y_cubic(i)=interp1(x,y,scalar_x(i), ‘cubic ’); end subplot(2,2,1),plot(x,y,‘*’ ),hold on ,plot(scalar_x,y_nearest),titie(‘menthod=‘nearest ’); subplot(2,2,2),plot(x,y,’*’ ),hold on ,plot(scalar_x,y_linear),titie(‘menthod= linear ’); subplot(2,2,3),plot(x,y,’*’ ),hold on ,plot(scalar_x,y_spline),titie(‘menthod= spline ’); subplot(2,2,4),plot(x,y,’*’ ),hold on ,plot(scalar_x,y_cubic),titie(‘menthod= cubic ’); ‘’函数的运算 1、2211()6(0.3)0.01(0.9)0.04 f x x x =+--+-+ P100 2、f(x)=lo g x+sin x-2在6附近的解 3、32()f x x ax bx c =+++ 求它的极小值

Matlab中插值函数汇总和使用说明

告: Matlab中插值函数汇总和使用说明收藏 命令1 interp1 功能一维数据插值(表格查找)。该命令对数据点之间计算内插值。它找出一元函数f(x)在中间点的数值。其中函数f(x)由所给数据决定。x:原始数据点 Y:原始数据点 xi:插值点 Yi:插值点 格式 (1)yi = interp1(x,Y,xi) 返回插值向量yi,每一元素对应于参量xi,同时由向量x 与Y 的内插值决定。参量x 指定数据Y 的点。 若Y 为一矩阵,则按Y 的每列计算。yi 是阶数为length(xi)*size(Y,2)的输出矩阵。 (2)yi = interp1(Y,xi) 假定x=1:N,其中N 为向量Y 的长度,或者为矩阵Y 的行数。 (3)yi = interp1(x,Y,xi,method) 用指定的算法计算插值: ’nearest’:最近邻点插值,直接完成计算; ’linear’:线性插值(缺省方式),直接完成计算; ’spline’:三次样条函数插值。对于该方法,命令interp1 调用函数spline、ppval、mkpp、umkpp。这些命令生成一系列用于分段多项式操作的函

数。命令spline 用它们执行三次样条函数插值; ’pchip’:分段三次Hermite 插值。对于该方法,命令interp1 调用函数p chip,用于对向量x 与y 执行分段三次内插值。该方法保留单调性与数据的外形; ’cubic’:与’pchip’操作相同; ’v5cubic’:在MATLAB 5.0 中的三次插值。 对于超出x 范围的xi 的分量,使用方法’nearest’、’linear’、’v5cubic’的插值算法,相应地将返回NaN。对其他的方法,interp1 将对超出的分量执行外插值算法。 (4)yi = interp1(x,Y,xi,method,'extrap') 对于超出x 范围的xi 中的分量将执行特殊的外插值法extrap。 (5)yi = interp1(x,Y,xi,method,extrapval) 确定超出x 范围的xi 中的分量的外插值extrapval,其值通常取NaN 或0。 例1 1.>>x = 0:10; y = x.*sin(x); 2.>>xx = 0:.25:10; yy = interp1(x,y,xx); 3.>>plot(x,y,'kd',xx,yy) 复制代码 例2 1.>> year = 1900:10:2010; 2.>> product = [75.995 91.972 105.711 12 3.203 131.669 150.697 179.323 203.212 226.505

Lagrange插值MATLAB源程序

function y=lagrange(x0,y0,x);%x0自变量取值向量已知y0为已知对应x0的函数取值,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; %lagrange插值多项式 end y(i)=s; end 测试: x0=[0:2] y0=[2 3 5] x=0.5 Lagrange(x0,y0,x) x0=[0:2] y0=[2 3 5] x=[0:0.01:2] Lagrange(x0,y0,x)

function f=Newton(x,y,x0) syms t; n = length(x); c(1:n) = 0.0; f = y(1); y1 = 0; l = 1; for(i=1:n-1) for(j=i+1:n) y1(j) = (y(j)-y(i))/(x(j)-x(i)); end c(i) = y1(i+1); l = l*(t-x(i)); f = f + c(i)*l; simplify(f); y = y1; if(i==n-1) if(nargin == 3) f = subs(f,'t',x0); else f = collect(f); end end end test: x=[1 -1 2] y=[0 -3 4] x0=[-1:0.1:2] Newton(x,y,x0)

用MATLAB实现拉格朗日插值和分段线性插值

用MATLAB实现拉格朗日插值和分段线性插值 1、实验内容: 用MATLAB实现拉格朗日插值和分段线性插值。 2、实验目的: 1)学会使用MATLAB软件; 2)会使用MATLAB软件进行拉格朗日插值算法和分段线性 差值算法; 3、实验原理: 利用拉格朗日插值方法进行多项式插值,并将图形显式出来。 4、实验步骤及运行结果 (1)实现lagrange插值 1)定义函数:f = 1/(x^2+1) 将其保存在f.m 文件中,具体程序 如下: function y = f1(x) y = 1./(x.^2+1); 2)定义拉格朗日插值函数:将其保存在lagrange.m 文件中, 具体实现程序编程如下: function y = lagrange(x0,y0,x) m = length(x); /区间长度/ n = length(x0);

for i = 1:n l(i) = 1; end for i = 1:m for j = 1:n for k = 1:n if j == k continue; end l(j) = ( x(i) -x0(k))/( x0(j) - x0(k) )*l(j); end end end y = 0; for i = 1:n y = y0(i) * l(i) + y; end 3)建立测试程序,保存在text.m文件中,实现画图: x=-5:0.001:5; y=(1+x.^2).^-1; p=polyfit(x,y,n); py=vpa(poly2sym(p),10) plot_x=-5:0.001:5; f1=polyval(p,plot_x); figure plo t(x,y,‘r',plot_x,f1) 输入n=6,出现下面的图形: 通过上图可以看到当n=6是没有很好的模拟。

相关主题
文本预览
相关文档 最新文档