当前位置:文档之家› matlab实现拉格朗日插值,多项式插值,邻近插值,线性插值 程序

matlab实现拉格朗日插值,多项式插值,邻近插值,线性插值 程序

matlab实现拉格朗日插值,多项式插值,邻近插值,线性插值 程序
matlab实现拉格朗日插值,多项式插值,邻近插值,线性插值 程序

题7:一维函数插值算法

课题内容:

课题7:一维函数插值算法

课题内容:对函数||

e-

y x

=,取[-5,5]之间步长为1 的值作

10

*

为粗值,以步长

0.1 作为细值,编写程序实现插值算法:最邻近插值算法,线性插

值算法和三次多项式函数插值算法,并对比插值效果。

课题要求:

1、设计良好的人机交互GUI 界面。

2、自己编写实现插值算法。

3、在同一个图形窗口显示对比最后的插值效果。

附录一、界面设计

二、图像结果

三、程序设计

1、线性插值

function pushbutton1_Callback(hObject, eventdata, handles) x=-5:5;

y=10*exp(-abs(x));

f1=[];

for x1=-5:0.1:5

a=(x1-floor(x1));%请读者认真逐一带入推导

if x1==floor(x1)

f1=[f1,y(floor(x1)+6)];

else

f1=[f1,y(floor(x1)+6)+a*(y(floor(x1)+7)-y(floor(x1)+6))]; end

end

m=-5:0.1:5

plot(m,f1,'-r',x,y,'+')

axis([-5 5 0 10])

legend('liner插值','原函数');

xlabel('X');

ylabel('Y');

title('liner插值与原函数的对比');

grid

2、多项式插值

x0=-5:1:-3;

y0=10*exp(-abs(x0));

x=-5:0.1:-3;

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

axis([-5 5 0 10])

plot(x,y,'m',x0,y0,'+')

legend('三次多项式插值','原函数');

xlabel('X');

ylabel('Y');

title('三次多项式插值与原函数的对比');

grid

hold on

x0=-3:1:-1;

y0=10*exp(-abs(x0));

x=-3:0.1:-1;

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

axis([-5 5 0 10])

plot(x,y,'m',x0,y0,'+')

legend('三次多项式插值','原函数');

xlabel('X');

ylabel('Y');

title('三次多项式插值与原函数的对比');

grid

hold on

x0=-1:1:1;

y0=10*exp(-abs(x0));

x=-1:0.1:1;

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

axis([-5 5 0 10])

plot(x,y,'m',x0,y0,'+')

legend('三次多项式插值','原函数');

xlabel('X');

ylabel('Y');

title('三次多项式插值与原函数的对比');

grid

hold on

x0=1:1:3;

y0=10*exp(-abs(x0));

x=1:0.1:3;

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

axis([-5 5 0 10])

plot(x,y,'m',x0,y0,'+')

legend('三次多项式插值','原函数');

xlabel('X');

ylabel('Y');

title('三次多项式插值与原函数的对比');

grid

hold on

x0=3:1:5;

y0=10*exp(-abs(x0));

x=3:0.1:5;

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

axis([-5 5 0 10])

plot(x,y,'m',x0,y0,'+')

legend('三次多项式插值','原函数');

xlabel('X');

ylabel('Y');

title('三次多项式插值与原函数的对比');

grid

3、最邻近插值

function pushbutton3_Callback(hObject, eventdata, handles) x=-5:5;

y=10*exp(-abs(x));

f2=[];

for x1=-5:0.1:5

if abs(x1-floor(x1))<0.5

f2=[f2,y(floor(x1)+6)];

else

f2=[f2,y(floor(x1)+7)];

end

end

m=[-5:0.1:5];

f4=10*exp(-abs(m));

plot(m,f2,'-r',x,y,'+')

axis([-5 5 0 10])

legend('nearest插值','原函数');

xlabel('X');

ylabel('Y');

title('nearest插值与原函数的对比');

grid

matlab实现拉格朗日插值,多项式插值,邻近插值,线性插值 程序

题7:一维函数插值算法 课题内容: 课题7:一维函数插值算法 课题内容:对函数|| e- y x =,取[-5,5]之间步长为1 的值作 10 * 为粗值,以步长 0.1 作为细值,编写程序实现插值算法:最邻近插值算法,线性插 值算法和三次多项式函数插值算法,并对比插值效果。 课题要求: 1、设计良好的人机交互GUI 界面。 2、自己编写实现插值算法。 3、在同一个图形窗口显示对比最后的插值效果。

附录一、界面设计 二、图像结果

三、程序设计 1、线性插值 function pushbutton1_Callback(hObject, eventdata, handles) x=-5:5; y=10*exp(-abs(x)); f1=[]; for x1=-5:0.1:5 a=(x1-floor(x1));%请读者认真逐一带入推导 if x1==floor(x1) f1=[f1,y(floor(x1)+6)]; else f1=[f1,y(floor(x1)+6)+a*(y(floor(x1)+7)-y(floor(x1)+6))]; end end m=-5:0.1:5 plot(m,f1,'-r',x,y,'+') axis([-5 5 0 10]) legend('liner插值','原函数'); xlabel('X'); ylabel('Y'); title('liner插值与原函数的对比'); grid 2、多项式插值 x0=-5:1:-3; y0=10*exp(-abs(x0)); x=-5:0.1:-3; 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

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';

实验5 双线性插值

实验五图像的空间变换 一、实验目的 1、学习图像空间变换,并通过实验体会空间变换的效果,对其作出分析。 2、掌握利用最邻近插值和双线性插值算法(灰度插值)实现图像的缩放。 3、掌握MATLAB编程环境中基本的图像处理函数。 二、实验要求 1.读入图像,对其利用最邻近插值和双线性插值法进行缩放变换,要求先使用IPT函数进行变换,然后自己编写函数实现; 2.对比上述得到的结果。 三、实验原理 图像的空间变换,也称几何变换或几何运算,包括图像的平移、旋转、镜像变换、转置、缩放等。几何运算可改变图像中各物体之间的空间关系,这种运算可以看成是将各物体在图像内移动。 空间变换可如下表示:设(u,v)为源图像上的点,(x,y)为目标图像上的点,则空间变换就是将源图像上(u,v)处的像素值与目标图像上(x,y)处的像素值对应起来,并具有以下关系: x=X(u,v),y=Y(u,v) (即由(u,v)计算对应(x,y))(1.1) 或u=U(x,y),v=V(x,y) (即由(x,y)计算对应(u,v))(1.2) 其中X(u,v)、Y(u,v)、U(x,y)、V(x,y)均为变换。由(1.1)对应的变换称作向前映射法也叫像素移交法,而由(1.2)对应的变换称作向后映射法也叫像素填充法,向后映射法是向前映射法的逆。 最简单的插值算法是最邻近插值,也称为零阶插值。最邻近插值算法简单,在许多情况

下都能得到令人满意的结果,但是当图像中包含像素之间灰度级有变化的细微结构时,最邻近算法会在图像中产生人为加工的痕迹。双线性插值算法计算量比零阶插值大,但缩放后图像质量高,不会出现像素值不连续的的情况,这样就可以获得一个令人满意的结果。最邻近点插值取插值点的4个邻点中距离最近的邻点灰度值作为该点的灰度值。设插值点(i,j)到周边4个邻点fk(i,j)(k =1,2,3,4)的距离为dk(k =1,2,3,4),则:g(i,j)=fk(i,j),dl =min{d1,d2,d3,d4},l=1,2,3,4 。 双线性插值是利用了需要处理的原始图像像素点周围的四个像素点的相关性,通过双线插值算法计算得出的。对于一个目的坐标,通过后映射法得到其在原始图像的对应的浮点坐标(i+u,j+v),其中i,j均为非负整数,u,v为[0,l]区间的浮点数,则这个像素的值f(i+u,j+v)可由原图像中坐标为(i,j)、(i+l,j)、(i,j+1)、(i+1,j+1)所对应的周围四个像素的值决定,即:f(i+u,j+v)=(1-u)×(1-v)×f(i,j)+(1-u)×v×f(i,j+1)+u×(1-v)×f(i+l,j)+u×v×f(i+l,j+1),其中f(i,j)表示源图像(i,j)处的的像素值,以此类推,这就是双线性内插值法。 如下图所示,已知(0,0)、(0,1)、(1,0)、(1,1)四点的的灰度,可以由相邻像素的灰度值f(0,0)和f(1,0)在X方向上线性插值求出(x,0)的灰度f(x,0),由另外两个相邻像素f(0,1)和f(1,1)在X方向上线性插值可求出(x,1)的灰度f(x,1),最后由f(x,0),f(x,1)在Y 方向上进行线性插值就可以得到(x,y)的灰度f(x,y)。 四、实验代码

拉格朗日插值法_matlab

MATLAB结课作业 姓名:郭海阳 班级:机械093 学号:2009111006 成绩: 时间:2012/6/8

一.任务。用matlab编写拉格朗日插值算法的程序并且以 (x=-2.00,f(x)=17.00 x=0.00,f(x)=1.00 x=1.00,f(x)=2.00 x=2.00,f (x)=17.00)为数据基础,在整个插值区间上采用拉格朗日插值算法计算f(x=0.6),写出程序源代码,输出计算结果 二.算法。x0=-2.00;x1=0.00;x2=1.00;x3=2.00; y0=17.00;y1=1.00;y2=2.00;y3=17.00; x=0.6 y=(x-x1).*(x-x2).*(x-x3)/((x0-x1).*(x0-x2).*(x0-x3))*y0+(x-x0).*(x-x2 ).*(x-x3)/((x1-x0).*(x1-x2).*(x1-x3))*y1+(x-x0).*(x-x1).*(x-x3)/((x2-x0).*(x2-x1).*(x2-x3))*y2+(x-x0).*(x-x1).*(x-x2)/((x3-x0).*(x3-x1).*( x3-x2))*y3; disp('y=');disp(y); 结果为:x = 0.6000 y= 0.2560 三.程序。function s=Lagrange(x,y,x0) %lagrange插值,x,y为已知的插值点及其函数值 %x0为要求的插值点的x值 nx=length(x); ny=length(y); if nx~=ny warning('矢量x与y的长度应该相等') return end m=length(x0); %按照公式,对要求的插值点矢量x0的每个元素进行计算 for i=1:m t=0.0; for j=1:nx u=1.0; for k=1:nx if k~=j u=u*(x0(i)-x(k))/(x(j)-x(k)); end end t=t+u*y(j); end

matlab旋转+双线性插值

自己写的Matlab旋转+双线性插值图像函数效果图: 源码: clear all; I = imread('original.jpg');

[Height,Width,RGB] = size(I); II = I;%当角度为0时直接输出 %本程序是以左上角为坐标原点 %angle_j是旋转角度,正值是按顺时针旋转,负值时按逆时针旋转 angle_j = 181; %angle是弧度 angle = 2*pi*angle_j/360; %将angle转成正值 while(angle < 0) angle = 2 * pi + angle; end %约束在0-2π内 while(angle > 2 * pi) angle = angle - 2 * pi; end %tag是判断下面的while循环有没有执行过 tag = 0; while(angle > 0) %超过90度的旋转,都先旋转90度,直到角度在0°-90°之间 %原理是旋转90度整数倍时,信息是不丢失的 if angle >= pi/2 a = pi/2; angle = angle - pi/2; elseif0 < angle < pi/2 a = angle; angle = 0; end if tag == 0 tag = 1; else I = II; [Height,Width,RGB] = size(I);%在旋转后的图像上继续旋转,从而实现大于90° 的旋转 end %正向变换用 sina = sin(a); cosa = cos(a); %逆向变换用_m == _minus sina_m = sin(-a); cosa_m = cos(-a); %旋转后图像的长度和宽度 II_height = round(sina * Width + cosa * Height); II_width = round(sina * Height + cosa * Width); II = ones(II_height,II_width,3); %先转成unit8。或者下面赋值0-1规划一下。否则imshow全是白色。 II = im2uint8(II); %%%%%%%%%%%%%%%%%%%%正向映射%%%%%%%%%%%%%%%%%%%%%%%%

MATLAB实现拉格朗日插值

数值分析上机报告 题目:插值法 学号:201014924 姓名:靳会有

一、调用MATLAB内带函数插值 1、MATLAB内带插值函数列举如下: 2、取其中的一维数据内插函数()为例,程序如下:其调用格式为: yi=interp1(x, y, xi) yi=interp1(x, y, xi, method) 举例如下: x=0:10:100 y=[40 44 46 52 65 76 80 82 88 92 110]; xi=0:1:100 yi=interp1(x,y,xi,'spline') 3、其他内带函数调用格式为: Interpft函数: y=interpft(x,n) y=interpft(x,n,dim) interp2函数: ZI=interp2(X, Y, Z, XI, YI),ZI=imerp2(Z, ntimes)

ZI=interp2(Z, XI, YI) ,ZI=interp2(X, Y, Z, XI, YI, method) interp3函数: VI=interp3(X,Y,Z,V,XI,YI,ZI) VI=interp3(V, ntimes) VI=interp3(V,XI,YI,ZI) VI=interp3(…, method) Interpn函数: VI=interpn(X1, X2, X3, …, V, Y1, Y2, Y3, …) VI=interpn(V, ntimes) VI=interpn(V, Yl, Y2, Y3, …) VI=interpn(…, method) Spline函数: yi=spline(x,y,xi) pp=spline(x,y) meshgrid函数: [X,Y]=meshgrid(x,y) [X,Y]=meshgrid(x) [X,Y,Z]=meshgrid(x,y,z) Ndgrid函数: [X1, X2, X3, …]=ndgrid(x1, x2, x3, …) [X1, X2, X3, …]=ndgrid(x) Griddata函数: ZI=griddata(x, y, z, XI, YI) [XI, YI, ZI]=griddata(x, y, z, xi, yi) […]=griddata(… method) 二、自编函数插值 1、拉格朗日插值法: 建立M 文件: function f = Language(x,y,x0) syms t l; if(length(x) == length(y)) n = length(x); else disp('x和y的维数不相等!'); return; %检错

matlab实现Lagrange多项式插值观察龙格现象

Matlab进行Lagrange多项式插值 拉格朗日插值法对函数y=1./(1+25*x.^2)在区间[-1,1]进行5次、10次、15次插值观察龙格现象 主程序 1.拉格朗日 function [c,l]=lagran(x,y) %c为多项式函数输出的系数 %l为矩阵的系数多项式 %x为横坐标上的坐标向量 %y为纵坐标上的坐标向量 w=length(x); n=w-1; l=zeros(w,w); for k=1:n+1 v=1; for j=1:n+1 if k~=j v=conv(v,poly(x(j)))/(x(k)-x(j)) %对多项式做卷积运算 end end l(k,:)=v; end c=y*l; 2.在matlab窗口中输入: x=linspace(-1,1,6);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans = -0.0000 1.2019 -0.0000 -1.7308 -0.0000 0.5673 在matlab窗口中输入: x=linspace(-1,1,11);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans = -220.9417 0.0000 494.9095 -0.0000 -381.4338 -0.0000 123.3597 0.0000 -16.8552 0.0000 1.0000 在matlab窗口中输入: x=linspace(-1,1,16);y=1./(1+25*x.^2); lagran(x,y) 回车可得结果: ans =

1.0e+003 * Columns 1 through 14 0.0000 -1.5189 -0.0000 4.6511 -0.0000 -5.5700 0.0000 3.3477 0.0000 -1.0830 -0.0000 0.1901 -0.0000 -0.0180 Columns 15 through 16 0.0000 0.0010 3.由以上结果可定义一下函数: function y=f1(x) y=1./(1+25*x.^2); function y=f2(x) y=1.2019*x.^4 -1.7308*x.^2+0.5673; function y=f3(x) y=-220.9417*x.^10+494.9095*x.^8-381.4338*x.^6+123.3597*x.^4-16.8552*x.^2+1; function y=f4(x) y=1*10^3*(-1.5189*x.^14+4.6511*x.^12-5.5700*x.^10+3.3477*x.^8-1.0830*x.^6+0.1901*x.^4-0.0180*x.^2+0.0010) 4. 在matlab窗口中输入: s1=@f1;s2=@f2;s3=@f3;s4=@f4;fplot(s1,[-1 1],'r');hold on;fplot(s2,[-1 1],'k');hold on;fplot(s3,[-1 1],'g');hold on;fplot(s4,[-1 1],'b');xlabel('input');ylabel('output');title('龙格现象');legend('s1=f(x)','s2=L5(x)','s3=L10(x)','s4=L15(X)');grid on 可以得到下图:

拉格朗日插值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复习代码)

双线性插值法 I_=imread('test.jpg'); I=rgb2gray(I_); A=0.7;B=0.7;%失真像素坐标 [i,j]=size(I); m=round(i*A);n=round(j*B); temp=zeros(m,n);%产生m*n矩阵 G=[A0;0B]; for x=1:m for y=1:n ab=[x,y]/G;%取得x/A,y/B a=ab(1)-floor(ab(1));%权值 b=ab(2)-floor(ab(2)); %防溢出处理 if ab(1)<1 ab(1)=1; end if ab(1)>i ab(1)=i; end if ab(2)<1 ab(2)=1; end if ab(2)>j ab(2)=j; end %定义内插值坐标 ab11=[floor(ab(1))floor(ab(2))]; ab12=[floor(ab(1))ceil(ab(2))]; ab21=[ceil(ab(1))floor(ab(2))]; ab22=[ceil(ab(1))ceil(ab(2))]; temp(x,y)=(1-a)*(1-b)*I(ab11(1),ab11(2))+... a*(1-b)*I(ab12(1),ab12(2))+... (1-a)*b*I(ab21(1),ab21(2))+... a*b*I(ab22(1),ab22(2)); end end imshow(uint8(temp)),title('0.7倍双线性');最近邻法 I_=imread('test.jpg');%读入原始图像 I1=rgb2gray(I_); [i,j]=size(I1); m=round(i*1.5);n=round(j*1.5); m_=round(i*0.7);n_=round(j*0.7); %1.5倍最邻近 TEMP=zeros(m,n);%产生m*n矩阵 for i=1:m for j=1:n TEMP(i,j)=I1(round(i/1.5),round(j/1.5)); end end subplot(1,3,1),imshow(I1),title('原图') TEMP1_5=uint8(TEMP); subplot(1,3,2), imshow(TEMP1_5),title('1.5倍最邻近') 全局预测下的图像分割 I_=imread('test.jpg'); I=rgb2gray(I_); [m,n]=size(I); %统计直方图 zhifangtu=zeros(1,255);% for i=1:1:m for j=1:1:n zhifangtu(I(i,j)+1)= zhifangtu(I(i,j)+1)+1; end end plot(zhifangtu); %阈值处理 final=zeros(m,n); for x=1:1:m for y=1:1:n AA=I(x,y); if AA>120 final(x,y)=255; else final(x,y)=0; end end end imshow(uint8(final));

matlab插值法,迭代法程序

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

https://www.doczj.com/doc/0e11803693.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;

双线性插值

双线性插值,又称为双线性内插。在数学上,双线性插值是有两个变量的插值函数的线性插值扩展,其核心思想是在两个方向分别进行一次线性插值。例如已知的红色数据点与待插值得到的绿色点如图1所示: 图1 假如我们想得到未知函数在点的值,假设我们已知函数 在, , , 及四个点的值。首先在 x 方向进行线性插值,得到 然后在 y 方向进行线性插值,得到 这样就得到所要的结果, 如果选择一个坐标系统使得的四个已知点坐标分别为(0, 0)、(0, 1)、(1, 0) 和(1, 1),那么插值公式就可以化简为

或者用矩阵运算表示为 这就是双线性内插值法。双线性内插值法计算量大,但缩放后图像质量高,不会出现像素值 不连续的的情况。由于双线性插值具有低通滤波器的性质,使高频分量受损,所以可能会使 图像轮廓在一定程度上变得模糊。 双线性插值法的MATLAB源代码为: I=imread('lena.jpg'); %读入原图像 [nrows,ncols,z]=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,z)); widthScale = nrows/width; heightScale = ncols/height; for x = 5:width - 5 % 5是为了防止矩阵超出边界溢出 for y = 5:height - 5 for z=1:3 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,z) = I(int16(xx),int16(yy),z); %若xx,yy为整数,直接赋值 else a = double(uint16(xx)); b = double(uint16(yy)); x11 = double(I(a,b,z)); % x11 <- I(a,b) x12 = double(I(a,b+1,z)); % x12 <- I(a,b+1) x21 = double(I(a+1,b,z)); % x21 <- I(a+1,b) x22 = double(I(a+1,b+1,z));% x22 <- I(a+1,b+1) J(x,y,z) = uint8((b+1-yy)*((xx-a)*x21+(a+1-xx)*x11)+(yy-b)* ((xx-a)*x22+(a+1-xx)*x12)); %用双线性插值计算公式计算 end end end end

matlab实现数值分析报告插值及积分

Matlab实现数值分析插值及积分 摘要: 数值分析(numerical analysis)是研究分析用计算机求解数学计算问题的数值计算方法及其理论的学科,是数学的一个分支,它以数字计算机求解数学问题的理论和方法为研究对象。在实际生产实践中,常常将实际问题转化为数学模型来解决,这个过程就是数学建模。学习数值分析这门课程可以让我们学到很多的数学建模方法。 分别运用matlab数学软件编程来解决插值问题和数值积分问题。题目中的要求是计算差值和积分,对于问题一,可以分别利用朗格朗日插值公式,牛顿插值公式,埃特金逐次线性插值公式来进行编程求解,具体matlab代码见正文。编程求解出来的结果为:=+。 其中Aitken插值计算的结果图如下: 对于问题二,可以分别利用复化梯形公式,复化的辛卜生公式,复化的柯特斯公式编写程序来进行求解,具体matlab代码见正文。编程求解出来的结果为: 0.6932 其中复化梯形公式计算的结果图如下:

问题重述 问题一:已知列表函数 表格 1 分别用拉格朗日,牛顿,埃特金插值方法计算。 问题二:用复化的梯形公式,复化的辛卜生公式,复化的柯特斯公式计算积分,使精度小于5。 问题解决 问题一:插值方法 对于问题一,用三种差值方法:拉格朗日,牛顿,埃特金差值方法来解决。 一、拉格朗日插值法: 拉格朗日插值多项式如下: 首先构造1+n 个插值节点n x x x ,,,10 上的n 插值基函数,对任一点i x 所对应的插值基函数 )(x l i ,由于在所有),,1,1,,1,0(n i i j x j +-=取零值,因此)(x l i 有因子 )())(()(110n i i x x x x x x x x ----+- 。又因)(x l i 是一个次数不超过n 的多项式,所以只 可能相差一个常数因子,固)(x l i 可表示成: )())(()()(110n i i i x x x x x x x x A x l ----=+- 利用1)(=i i x l 得:

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旋转实现(最近邻值,双线性,三次卷积插值实现插值)

对图像进行旋转,使用最近邻插值法,双线性插值,三次卷积插值三种方法进行插值。 源码: clc;clear all;close all; Img=imread('test1.bmp'); Img=double(Img); [h w]=size(Img); alpha=pi/6; %逆时针旋转的角度 wnew=w*cos(alpha)+h*sin(alpha); %新图像的宽width hnew=w*sin(alpha)+h*cos(alpha); %新图像的高heighth wnew=ceil(wnew); %取整 hnew=ceil(hnew); u0=w*sin(alpha); %平移量 T=[cos(alpha),sin(alpha);-sin(alpha),cos(alpha)]; %变换矩阵 Imgnew1=zeros(hnew,wnew); Imgnew2=zeros(hnew,wnew); Imgnew3=zeros(hnew,wnew); for u=1:hnew %u和v是新图像坐标,变换到原图像坐标x和y中。 for v=1:wnew

tem=T*([u;v]-[u0;0]); x=tem(1); y=tem(2); if x>=1 & x<=h & y>=1 & y<=w %若变换出的x和y在原图像范围内 x_low=floor(x); x_up=ceil(x); y_low=floor(y); y_up=ceil(y); if (x-x_low)<=(x_up-x) %采用最近点法,选取距离最近点的像素赋给新图像x=x_low; else x=x_up; end if (y-y_low)<=(y_up-y) y=y_low; else y=y_up; end p1=Img(x_low,y_low); %双线性插值,p1到p4是(x,y)周围的四个点p2=Img(x_up,y_low); p3=Img(x_low,y_low); p4=Img(x_up,y_up); s=x-x_low; t=y-y_low; Imgnew1(u,v)=Img(x,y); Imgnew2(u,v)=(1-s)*(1-t)*p1+(1-s)*t*p3+(1-t)*s*p2+s*t*p4; end if x>=2 & x<=h-2 & y>=2 & y<=w-2 %若变换出的x和y在原图像范围内x_1=floor(x)-1; x_2=floor(x); x_3=floor(x)+1; x_4=floor(x)+2; y_1=floor(y)-1; y_2=floor(y); y_3=floor(y)+1; y_4=floor(y)+2; A=[sw(1+x-x_2),sw(x-x_2),sw(1-(x-x_2)),sw(2-(x-x_2))]; C=[sw(1+y-y_2),sw(y-y_2),sw(1-(y-y_2)),sw(2-(y-y_2))]; B=[ Img(x_1,y_1),Img(x_1,y_2),Img(x_1,y_3),Img(x_1,y_4); Img(x_2,y_1),Img(x_2,y_2),Img(x_2,y_3),Img(x_2,y_4); Img(x_3,y_1),Img(x_3,y_2),Img(x_3,y_3),Img(x_3,y_4); Img(x_4,y_1),Img(x_4,y_2),Img(x_4,y_3),Img(x_4,y_4)]; Imgnew3(u,v)=A*B*C'; end

matlab插值计算

插值方法 晚上做一个曲线拟合,结果才开始用最小二乘法拟合时,拟合出来的东西太难看了! 于是尝试用其他方法。 经过一番按图索骥,终于发现做曲线拟合的话,采用插值法是比较理想的方法。尤其是样条插值,插完后线条十分光滑。 方法付后,最关键的问题是求解时要积分,放这里想要的时候就可以直接过来拿,不用死去搜索啦。呵呵 插值方法的Matlab实现 一维数据插值 MATLAB中用函数interp1来拟合一维数据,语法是YI = INTERP1(X,Y,XI,方法) 其中(X,Y)是已给的数据点,XI 是插值点, 其中方法主要有 'linear' -线性插值,默认 'pchip' -逐段三次Hermite插值 'spline' -逐段三次样条函数插值 其中最后一种插值的曲线比较平滑 例: x=0:.12:1; x1=0:.02:1;%(其中x=0:.12:1表示显示的插值点,x1=0:.02:1表示插值的步长) y=(x.^2-3*x+5).*exp(-5*x).*sin(x);

plot(x,y,'o'); hold on; y1=interp1(x,y,x1,'spline'); plot(x1,y1,':') 如果要根据样本点求函数的定积分,而函数又是比较光滑的,则可以用样条函数进行插值后再积分,在MATLAB中可以编写如下程序: function y=quadspln(x0,y0,a,b) f=inline('interp1(x0,y0,x,''spline'')','x','x0','y0'); y=quadl(f,a,b,1e-8,[],x0,y0); 现求sin(x)在区间[0,pi]上的定积分,只取5点 x0=[0,0.4,1,2,pi]; y0=sin(x0); I=quadspln(x0,y0,0,pi) 结果得到的值为2.01905,精确值为2 求一段matlab插值程序 悬赏分:20 - 解决时间:2009-12-26 19:57 已知5个数据点:x=[0.25 0.5 0.75 1] y=[0 0.3104 0.6177 0.7886 1] ,求一段matlab插值程序,求过这5个数据点的插值多项式,并在x-y坐标中画出y=f(x)图形,并且求出f (x)与x轴围成图形的面积(积分),不胜感激! 使用Lagrange 插值多项式的方法: 首先把下面的代码复制到M文件中,保存成lagran function [C,L]=lagran(X,Y) % input - X is a vector that contains a list of abscissas % - Y is a vector that contains a list of ordinates

matlab牛顿插值法例题与程序

题目一:多项式插值 某气象观测站在8:00(AM )开始每隔10分钟对天气作如下观测,用三次多项式插值函数(Newton )逼近如下曲线,插值节点数据如上表,并求出9点30分该地区的温度(x=10)。 二、数学原理 假设有n+1个不同的节点及函数在节点上的值(x 0,y 0),……(x n ,y n ),插值多项式有如下形式: )() )(()()()(n 10n 102010n x -x )(x -x x -x x P x x x x x x -??-+??+-++=αααα (1) 其中系数i α(i=0,1,2……n )为特定系数,可由插值样条i i n y x P =) ((i=0,1,2……n )确定。 根据均差的定义,把x 看成[a,b]上的一点,可得 f(x)= f (0x )+f[10x x ,](0x -x ) f[x, 0x ]= f[10x x ,]+f[x,10x x ,] (1x -x ) …… f[x, 0x ,…x 1-n ]= f[x, 0x ,…x n ]+ f[x, 0x ,…x n ](x-x n ) 综合以上式子,把后一式代入前一式,可得到: f(x)= f[0x ]+f[10x x ,](0x -x )+ f[210x x x ,,](0x -x )(1x -x )+ …+ f[x, 0x ,…x n ](0x -x )…(x-x 1-n )+ f[x, 0x ,…x n ,x ]) (x 1n +ω= N n (x )+) (x n R 其中

N n (x )= f[0x ]+f[10x x ,](0x -x )+ f[210x x x ,,](0x -x )(1x -x )+ …+ f[x, 0x ,…x n ](0x -x )…(x-x 1-n ) (2) )(x n R = f(x)- N n (x )= f[x, 0x , (x) n ,x ]) (x 1n +ω (3) ) (x 1n +ω=(0x -x )…(x-x n ) Newton 插值的系数i α(i=0,1,2……n )可以用差商表示。一般有 f k =α[k 10x x x ??,] (k=0,1,2,……,n ) (4) 把(4)代入(1)得到满足插值条件N )() (i i n x f x =(i=0,1,2,……n )的n 次Newton 插值多项式 N n (x )=f (0x )+f[10x x ,](1x -x )+f[210x x x ,,](1x -x )(2x -x )+……+f[n 10x x x ??,](1x -x )(2x -x )…(1-n x -x ). 其中插值余项为: ) ()! () ()()()(x 1n f x N -x f x R 1n 1 n n +++==ωξ ξ介于k 10x x x ??,之间。 三、程序设计 function [y,A,C,L]=newdscg(X,Y,x,M) % y 为对应x 的值,A 为差商表,C 为多项式系数,L 为多项式 % X 为给定节点,Y 为节点值,x 为待求节点 n=length(X); m=length(x); % n 为X 的长度 for t=1:m

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