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

合集下载

(完整)matlab实现插值法和曲线拟合

(完整)matlab实现插值法和曲线拟合

插值法和曲线拟合电子科技大学摘要:理解拉格朗日多项式插值、分段线性插值、牛顿前插,曲线拟合,用matlab 编程求解函数,用插值法和分段线性插值求解同一函数,比较插值余项;用牛顿前插公式计算函数,计算函数值;对于曲线拟合,用不同曲线拟合数据。

关键字:拉格朗日插值多项式;分段线性插值;牛顿前插;曲线拟合引言:在数学物理方程中,当给定数据是不同散点时,无法确定函数表达式,求解函数就需要很大的计算量,我们有多种方法对给定的表格函数进行求解,我们这里,利用插值法和曲线拟合对函数进行求解,进一步了解函数性质,两种方法各有利弊,适合我们进行不同的散点函数求解。

正文:一、插值法和分段线性插值 1拉格朗日多项式原理对某个多项式函数,已知有给定的k + 1个取值点:其中对应着自变量的位置,而对应着函数在这个位置的取值。

假设任意两个不同的x j 都互不相同,那么应用拉格朗日插值公式所得到的拉格朗日插值多项式为:其中每个为拉格朗日基本多项式(或称插值基函数),其表达式为:[3]拉格朗日基本多项式的特点是在 上取值为1,在其它的点 上取值为0.2分段线性插值原理给定区间[a ,b ], 将其分割成a=x 0 <x 1 〈…〈x n =b, 已知函数y= f(x ) 在这些插值结点的函数值为 y k =f(x k )(k=0,1,…,n)求一个分段函数I h (x), 使其满足:(1) I h (x k )=y k ,(k=0,1,…,n) ;(2) 在每个区间[x k ,x k+1 ] 上,I h (x )是个一次函数。

易知,I h (x)是个折线函数, 在每个区间[x k ,x k+1 ]上,(k=0,1,…,n)k 1k k1k 1k k 1k k k ,1)()()(x x x x x f x x x x x f x L --+--=++++,于是, I h (x )在[a,b ]上是连续的,但其一阶导数是不连续的.3拉格朗日插值多项式算法 ○1输入,(0,1,2,,)i i x y i n =,令0)(=x L n .错误!对0,1,2,,i n =,计算0,()()/()ni j i j j j il x x x x x -≠=--∏()()()n n i i L x L x l x y ←−−+4分段线性插值算法错误!输入(x k ,y k ),k=0,1,…,n;○2计算k 1k k1k 1k k 1k k k ,1)()()(x x x x x f x x x x x f x L --+--=++++5插值法和分段线性插值程序按下列数据分别作五次插值和分段线性插值,画出两条插值曲线以及给定数据点。

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

用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:nl(i) = 1;endfor i = 1:mfor j = 1:nfor k = 1:nif j == kcontinue;endl(j) = ( x(i) -x0(k))/( x0(j) - x0(k) )*l(j);endendendy = 0;for i = 1:ny = y0(i) * l(i) + y;end3)修坐尝试步调,保存正在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);figureplot(x,y,‘r',plot_x,f1)输进n=6,出现底下的图形:通过上图不妨瞅到当n=6是不很佳的模拟.于是沉新运止text.M并采用n=11由此可睹n=11时的图像是不妨很佳的真止模拟(2)分段线性插值:修坐div_linear.m文献.简直编程如下/*分段线性插值函数:div_linear.m 文献*/function y = div_linear(x0,y0,x,n)%for j = 1:length(x)for i = 1:n-1if (x >= x0(i)) && (x <= x0(i+1))y = (x - x0(i+1))/(x0(i) - x0(i+1))*y0(i) + ( x - x0(i))/(x0(i+1) - x0(i))*y0(i+1);elsecontinue;endend%end尝试步调(text2.m):n = input(‘输进n =:’);x0 = linspace( -5,5,n);for x = -5:0.01:5y = div_linear(x0,f(x0),x,n);hold on;plot(x,y,'r');plot(x,f(x),'b');end2)运止尝试步调,那是会出现:输进n=:2)输进n=6,并按Enter键,出现:4)闭掉图形界里后,沉新运止步调,输进n=11,并按enter键后出现:5)再次闭掉图形界里,输进n=100,并按enter键,出现:此时.图形将于本函数图形基础符合,证明分隔区间越多,图像交近真正在的图像.(3)用lagrange插值瞅察y = |si n(k*π*x)|的缺点分解:1)编写函数文献,保存正在f2.m 中x=0:0.01:1;k= input('输进k:')n= input('输进n:');y=abs(sin(k*pi*x));p=polyfit(x,y,n-1);py=vpa(poly2sym(p),8);plot_x=0:0.01:1;f1=polyval(p,plot_x);plot(x,y,plot_x,f1);2)运止该步调:输进k=:1输进n=:2出现如下图形界里:闭掉图形界里后沉新运止f2.m,输进k=:1,n=:3出现如下界里:再次闭掉图形界里,输进k=:1,n=:6 后出现:此时图形基础符合.类推,输进k=2,n=3后出现:k =2, n =11,出现如下图形:k =2,n =15,那时出现:k =2,n =19,出现:当k=2,n=21时,图形如下:此时基础符合.5、真验归纳:通过本次课程安排,尔发端掌握了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:5a=(x1-floor(x1));%请读者认真逐一带入推导if x1==floor(x1)f1=[f1,y(floor(x1)+6)];elsef1=[f1,y(floor(x1)+6)+a*(y(floor(x1)+7)-y(floor(x1)+6))]; endendm=-5:0.1:5plot(m,f1,'-r',x,y,'+')axis([-5 5 0 10])legend('liner插值','原函数');xlabel('X');ylabel('Y');title('liner插值与原函数的对比');grid2、多项式插值x0=-5:1:-3;y0=10*exp(-abs(x0));x=-5:0.1:-3;n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endaxis([-5 5 0 10])plot(x,y,'m',x0,y0,'+')legend('三次多项式插值','原函数');xlabel('X');ylabel('Y');title('三次多项式插值与原函数的对比');gridhold onx0=-3:1:-1;y0=10*exp(-abs(x0));x=-3:0.1:-1;n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endaxis([-5 5 0 10])plot(x,y,'m',x0,y0,'+')legend('三次多项式插值','原函数');xlabel('X');ylabel('Y');title('三次多项式插值与原函数的对比');gridhold onx0=-1:1:1;y0=10*exp(-abs(x0));x=-1:0.1:1;n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endaxis([-5 5 0 10])plot(x,y,'m',x0,y0,'+')legend('三次多项式插值','原函数');xlabel('X');ylabel('Y');title('三次多项式插值与原函数的对比');gridhold onx0=1:1:3;y0=10*exp(-abs(x0));x=1:0.1:3;n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endaxis([-5 5 0 10])plot(x,y,'m',x0,y0,'+')legend('三次多项式插值','原函数');xlabel('X');ylabel('Y');title('三次多项式插值与原函数的对比');gridhold onx0=3:1:5;y0=10*exp(-abs(x0));x=3:0.1:5;n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endaxis([-5 5 0 10])plot(x,y,'m',x0,y0,'+')legend('三次多项式插值','原函数');xlabel('X');ylabel('Y');title('三次多项式插值与原函数的对比');grid3、最邻近插值function pushbutton3_Callback(hObject, eventdata, handles) x=-5:5;y=10*exp(-abs(x));f2=[];for x1=-5:0.1:5if abs(x1-floor(x1))<0.5f2=[f2,y(floor(x1)+6)];elsef2=[f2,y(floor(x1)+7)];endendm=[-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插值

Matlab插值
(1)画出散点图;
(2)由图形可见,若可由 散点图得到时间和温度 的函数关系(一元函 数),则问题得解!
35
30

25

20

15
10
5
0
2
4
6
8 10 12
显然,找时间和温度间的函数关系是很难的!
那我们是否可以找到一条经过每一个点的简单函数 作为它的近似呢?
3
插值
在离散数据的基础上补插连续函数,使得 这条连续曲线通过全部给定的离散数据点。插 值是离散函数逼近的重要方法,利用它可通过 函数在有限个点处的取值状况,估算出函数在 其他点处的近似值。
返回 17
三次样条插值 是一种分段插值,比分段线性插值更光滑!
y






a
xi-1 xi
bx
在数学上,光滑程度的定量描述是:函数(曲线) 的k阶可导且连续,则称该曲线具有k阶光滑性。
光滑性的阶次越高,则越光滑。为了得到具有
较高阶光滑性的分段低次插值多项式,我们介绍三 次样条插值。
18
1、了解插值的基本内容。 2、掌握用Matlab软件包求解插值问题。
[1] 问题的提出 [2] 一维插值 [3] 二维插值
2
问题1
在1-12的11小时内,每隔1小时测量一次温度,测得的温度 依次为:5,8,9,15,25,29,31,30,22,25,27,24 试估计每隔1/10小时的温度值。
分析:
y0

x x1

x0 x0



x x2 x1 x2
y1

x x2

x0 x0

数值计算-matlab内置函数-插值

数值计算-matlab内置函数-插值
18
分两片的函数表达式如下: 若插值点在下三角形区域:即 (x, y)满足
插值函数为: z = f (x, y) = z1 + (z2 z1)(x x1) + (z3 z2 )( y y1) 若插值点在上三角形区域):即(x, y)满足 y2 y2 y> (x x2 ) + y1 x2 x2 插值函数为:
要求cx取行向量,cy取为列向量。 要求cx取行向量,cy取为列向量。 cx取行向量 取为列向量
24
5
拉格朗日(Lagrange)插值
特别地: 特别地 两点一次(线性 插值多项式: 线性)插值多项式 两点一次 线性 插值多项式
x x0 x x1 L1 ( x ) = y0 + y1 x0 x1 x1 x0
三点二次(抛物 插值多项式 三点二次 抛物)插值多项式 抛物 插值多项式:
(x x1)(x x2 ) y + (x x0 )(x x2 ) y + (x x0 )(x x1) y L2(x) = 0 1 2 (x0 x1)(x0 x2 ) (x1 x0 )(x1 x2 ) (x2 x0 )(x2 x1)
10
能够超过x的范围。 能够超过 的范围。 的范围
12的11小时内 每隔1 小时内, 例:在1-12的11小时内,每隔1小时测量一次温 测得的温度依次为: 15,25,29,31, 度,测得的温度依次为:5,8,9,15,25,29,31, 30,22,25,27,24。试估计每隔1/10 1/10小时的温度 30,22,25,27,24。试估计每隔1/10小时的温度 值。
si ( xi ) = si+1 ( xi ), si′( xi ) = si′+1 ( xi ), si′′( xi ) = si′′+1 ( xi ) (i = 1, L, n 1)

计算方法-插值方法实验

计算方法-插值方法实验

实验一插值方法一. 实验目的(1)熟悉数值插值方法的基本思想,解决某些实际插值问题,加深对数值插值方法的理解。

(2)熟悉Matlab 编程环境,利用Matlab 实现具体的插值算法,并进行可视化显示。

二. 实验要求用Matlab 软件实现Lagrange 插值、分段线性插值、三次Hermite 插值、Aitken 逐步插值算法,并用实例在计算机上计算和作图。

三. 实验内容1. 实验题目 (1)已知概率积分dxe y xx ⎰-=22π的数据表构造适合该数据表的一次、二次和三次Lagrange 插值公式,输出公式及其图形,并计算x =0.472时的积分值。

答:①一次插值公式:输入下面内容就可以得到一次插值结果 >> X=[0.47,0.48];Y=[0.4937452,0.5027498]; >> x=0.472;>> (x-X(2))/(X(1)-X(2))*Y(1)+(x-X(1))/(X(2)-X(1))*Y(2)ans =0.495546120000000>>②两次插值公式为:输入下面内容就可以得到两次插值结果>> X=[0.46,0.47,0.48];Y=[0.4846555,0.4937452,0.5027498]; >> x=0.472;>>(x-X(2))*(x-X(3))/((X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(1))*(x-X(3))/((X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(2))*(x-X(1))/((X(3)-X(2))*(X(3)-X(1)))*Y(3)i 0123x 0.46 047 0.48 0.49 y0.4846555 0.4937452 0.5027498 0.5116683ans =0.495552928000000>>③三次插值公式为:输入下面内容就可以得到三次插值结果>> X=[0.46,0.47,0.48,0.49];Y=[0.4846555,0.4937452,0.5027498,0.5116683];>> x=0.472;>>(x-X(2))*(x-X(3))*(x-X(4))/((X(1)-X(4))*(X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(4))*( x-X(1))*(x-X(3))/((X(2)-X(4))*(X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(4))*(x-X(2))*( x-X(1))/((X(3)-X(4))*(X(3)-X(2))*(X(3)-X(1)))*Y(3)+(x-X(3))*(x-X(2))*(x-X(1))/(( X(4)-X(1))*(X(4)-X(2))*(X(4)-X(3)))*Y(4)ans =0.495552960000000输入下面内容,绘出三点插值的图:>> X=[0.46,0.47,0.48,0.49];Y=[0.4846555,0.4937452,0.5027498,0.5116683];>> x=linspace(0.46,0.49);>>y=(x-X(2)).*(x-X(3)).*(x-X(4))/((X(1)-X(4))*(X(1)-X(2))*(X(1)-X(3)))*Y(1)+(x-X(4) ).*(x-X(1)).*(x-X(3))/((X(2)-X(4))*(X(2)-X(1))*(X(2)-X(3)))*Y(2)+(x-X(4)).*(x-X(2) ).*(x-X(1))/((X(3)-X(4))*(X(3)-X(2))*(X(3)-X(1)))*Y(3)+(x-X(3)).*(x-X(2)).*(x-X(1) )/((X(4)-X(1))*(X(4)-X(2))*(X(4)-X(3)))*Y(4);>>plot(x,y)(注意上面的“.*”不能用“*”替代);(2)将区间[-5,5]分为10等份,求作211)(x x f +=的分段线性插值函数,输出函数表达式及其图形,并计算x =3.3152时的函数值。

lagrange插值分段线性插值matlab代码

lagrange插值分段线性插值matlab代码

Lagrange插值:x=0:3;y=[-5,-6,-1,16];n=length(x);syms q;for k=1:nfenmu=1;p=1;for j=1:nif(j~=k)fenmu=fenmu*(x(k)-x(j))p=conv(p,poly(x(j)))endendc(k,:)=p*y(k)/fenmuenda=zeros(1,n);for i=1:nfor j=1:na(i)=a(i)+c(j,i)endend输出结果:fenmu =-1p =1 -1fenmu =2p =1 -3 2fenmu =-6p =1 -6 11 -6c =0.8333 -5.0000 9.1667 -5.0000 fenmu =1p =1 0fenmu =-1p =1 -2 0fenmu =2p =1 -5 6 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 0 fenmu =2p =1 0fenmu =2p =1 -1 0fenmu =-2p =1 -4 3 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 00.5000 -2.0000 1.5000 0 fenmu =3p =1 0fenmu =6p =1 -1 0fenmu =6p =1 -32 0c =0.8333 -5.0000 9.1667 -5.0000-3.0000 15.0000 -18.0000 00.5000 -2.0000 1.5000 02.6667 -8.0000 5.3333 0a =0.8333 0 0 0a =-2.1667 0 0 0 a =-1.6667 0 0 0a =1 0 0 0a =1 -5 0 0a =1 10 0 0a =1 8 0 0a =1 0 0 0a =1.0000 0 9.1667 0a =1.0000 0 -8.8333 0a =1.0000 0 -7.3333 0a =1.0000 0 -2.0000 0a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000a =1.0000 0 -2.0000 -5.0000 分段线性插值:先保存M文件:x=1:6;y=[7 16 8 25 12 24];u=5.3;delta=diff(y)./diff(x);n=length(x);for j=2:(n-1)if x(j)<uk=j;endend在command window中输入:s=u-x(k);v=y(k)+s.*delta(k)输出结果:v =15.6000解:第一种做法,用spline,共55个点,其中,54个有效首先保存你一个M文件:figure('position',get(0,'screensize'))axes('position',[0 0 1 1])[x,y] = ginput;然后在command window里输入以下内容:n = length(x);s = (1:n)';t = (1:.05:n)';u = spline(s,x,t);v = spline(s,y,t);clf resetplot(x,y,'.',u,v,'-');对应的x、y值:0.3572917 0.25361450.3572917 0.29096390.3503472 0.34036140.3461806 0.42590360.3427083 0.52710840.3253472 0.61626510.3065972 0.68734940.290625 0.75240960.2892361 0.79337350.2954861 0.7969880.3225694 0.75481930.340625 0.68493980.3690972 0.6150602 0.3864583 0.6126506 0.3899306 0.7259036 0.3927083 0.8066265 0.3920139 0.8993976 0.4024306 0.9295181 0.4239583 0.8933735 0.4239583 0.8078313 0.4295139 0.7343373 0.4315972 0.6451807 0.4440972 0.6439759 0.4565972 0.7439759 0.4704861 0.8451807 0.4767361 0.9054217 0.4961806 0.9463855 0.5086806 0.876506 0.5045139 0.8186747 0.5010417 0.7524096 0.4892361 0.6403614 0.503125 0.6295181 0.5052083 0.6271084 0.5322917 0.7090361 0.5510417 0.763253 0.5739583 0.8355422 0.5961806 0.8572289 0.5947917 0.7837349 0.5753472 0.7090361 0.5579861 0.6391566 0.5357639 0.5668675 0.5322917 0.5283133 0.5350694 0.4789157 0.565625 0.536747 0.5947917 0.5933735 0.6253472 0.610241 0.6322917 0.5728916 0.615625 0.5331325 0.6003472 0.4993976 0.5788194 0.4415663 0.559375 0.3716867 0.5295139 0.2957831 0.4975694 0.2403614 0.4711806 0.2018072 0.6607639 0.3090361第二种做法,用pchip,共52个点,全部有效首先保存一个M文件:figure('position',get(0,'screensize'))axes('position',[0 0 1 1])[x,y] = ginput;然后在command window里输入以下内容:n = length(x);s = (1:n)';t = (1:.05:n)';u = pchip (s,x,t);v = pchip (s,y,t);clf resetplot(x,y,'.',u,v,'-');对应的x、y值:0.5190972 0.84879520.5052083 0.75120480.4947917 0.67891570.5100694 0.66927710.5399306 0.73554220.5753472 0.81746990.596875 0.86204820.6190972 0.87771080.6149306 0.81385540.5878472 0.74277110.5878472 0.74277110.5635417 0.67168670.5350694 0.6030120.528125 0.5632530.528125 0.52590360.565625 0.58012050.6052083 0.62710840.634375 0.61867470.6190972 0.57168670.5878472 0.5234940.5364583 0.41265060.4961806 0.32108430.459375 0.2753012我更喜欢第一种,用spline的,这个能将之间画出弧度,而pchip更像是直接用线段将点依次连接得到的。

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序

用matlab编写拉格朗日插值算法的程序10[ 标签:matlab,插值算法,程序 ]用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果x -2.15 -1.00 0.01 1.02 2.03 3.25y 17.03 7.24 1.05 2.03 17.06 23.05匿名回答:1 人气:6 解决时间:2011-05-24 19:58满意答案好评率:83%做了一个测试,希望有所帮助。

代码:% 用matlab编写拉格朗日插值算法的程序,并以下面给出的函数表为数据基础,% 在整个插值区间上采用拉格朗日插值法计算f(0.6),写出程序源代码,输出计算结果% x -2.15 -1.00 0.01 1.02 2.03 3.25% y 17.03 7.24 1.05 2.03 17.06 23.05function main()clc;x = [-2.15 -1.00 0.01 1.02 2.03 3.25]; y = [17.03 7.24 1.05 2.03 17.06 23.05 ]; x0 = 0.6;f = Language(x,y,x0)function f = Language(x,y,x0)%求已知数据点的拉格朗日插值多项式%已知数据点的x坐标向量: x%已知数据点的y坐标向量: y%插值点的x坐标: x0%求得的拉格朗日插值多项式或在x0处的插值: f syms t l;if(length(x) == length(y))n = length(x);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for (i=1:n)l=sym(y(i));for(j=1:i-1)l=l*(t-x(j))/(x(i)-x(j));end;for(j=i+1:n)l=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if(nargin == 3)f = subs (h,'t',x0); %计算插值点的函数值elsef=collect(h);f = vpa(f,6); %将插值多项式的系数化成6位精度的小数end结果:f =0.0201>>如何用MATLAB编写的拉格朗日插值算法的程序、二阶龙格-库塔方法的程序和SOR迭代法的程序,要能运行的∮初夏戀雨¢回答:2 人气:29 解决时间:2009-12-08 19:04满意答案好评率:100%拉格朗日function y=lagrange(x0,y0,x)n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;endSOR迭代法的Matlab程序function [x]=SOR_iterative(A,b)% 用SOR迭代求解线性方程组,矩阵A是方阵x0=zeros(1,length(b)); % 赋初值tol=10^(-2); % 给定误差界N=1000; % 给定最大迭代次数[n,n]=size(A); % 确定矩阵A的阶w=1; % 给定松弛因子k=1;% 迭代过程while k<=Nx(1)=(b(1)-A(1,2:n)*x0(2:n)')/A(1,1);for i=2:nx(i)=(1-w)*x0(i)+w*(b(i)-A(i,1:i-1)*x(1:i-1)'-A(i,i+1:n)*x0(i+1:n)')/A(i,i); endif max(abs(x-x0))<=tolfid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n'); fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'x的值\n\n');fprintf(fid, '%12.8f \n', x);break;endk=k+1;x0=x;endif k==N+1fid = fopen('SOR_iter_result.txt', 'wt');fprintf(fid,'\n********用SOR迭代求解线性方程组的输出结果********\n\n'); fprintf(fid,'迭代次数: %d次\n\n',k);fprintf(fid,'超过最大迭代次数,求解失败!');fclose(fid);endMatlab中龙格-库塔(Runge-Kutta)方法原理及实现龙格-库塔(Runge-Kutta)方法是一种在工程上应用广泛的高精度单步算法。

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

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

用MATLAB实现拉格朗日插值和分段线性插值1、实验内容:用MATLAB实现拉格朗日插值和分段线性插值。

2、实验目的:1学会使用MATLAB软件;2会使用MATLAB软件进行拉格朗日插值算法和分段线性差值算法;3、实验原理:利用拉格朗日插值方法进行多项式插值,并将图形显式出来。

4、实验步骤及运行结果(1实现lagrange插值1定义函数:f = 1/(x^2+1 将其保存在 f.m 文件中,具体程序如下:function y = f1(xy = 1./(x.^2+1;2定义拉格朗日插值函数:将其保存在lagrange.m 文件中,具体实现程序编程如下:function y = lagrange(x0,y0,xm = length(x; /区间长度/n = length(x0;for i = 1:nl(i = 1;endfor i = 1:mfor j = 1:nfor k = 1:nif j == kcontinue;endl(j = ( x(i -x0(k/( x0(j - x0(k *l(j;endendendy = 0;for i = 1:ny = y0(i * l(i + y;end3建立测试程序,保存在text.m文件中,实现画图:x=-5:0.001:5;y=(1+x.^2.^-1;p=polyfit(x,y,n;py=vpa(poly2sym(p,10plot_x=-5:0.001:5;f1=polyval(p,plot_x;figureplo t(x,y,‘r',plot_x,f1输入n=6,出现下面的图形:通过上图可以看到当n=6是没有很好的模拟。

于是重新运行text.M并选择n=11由此可见n=11时的图像是可以很好的实现模拟(2分段线性插值:建立div_linear.m文件。

具体编程如下/*分段线性插值函数:div_linear.m 文件*/ function y = div_linear(x0,y0,x,n%for j = 1:length(xfor i = 1:n-1if (x >= x0(i && (x <= x0(i+1y = (x - x0(i+1/(x0(i - x0(i+1*y0(i + ( x - x0(i/(x0(i+1 - x0(i*y0(i+1;elsecontinue;endend%end测试程序(text2.m:输入n =:’;n = input(‘x0 = linspace( -5,5,n;for x = -5:0.01:5y = div_linear(x0,f(x0,x,n;hold on;plot(x,y,'r';plot(x,f(x,'b';end2运行测试程序,这是会出现:输入n=:2输入n=6,并按Enter键,出现:4关掉图形界面后,重新运行程序,输入n=11,并按enter键后出现:5再次关掉图形界面,输入n=100,并按enter键,出现:此时。

拉格朗日插值法matlab程序代码

拉格朗日插值法matlab程序代码

拉格朗日插值法matlab程序代码
使用拉格朗日插值法进行数据拟合是一种常见的数值计算方法。

在matlab中,我们可以使用polyfit函数来实现拉格朗日插值法。

下面是一个简单的matlab程序代码示例:
```matlab
% 定义原始数据
x = [1, 2, 3, 4, 5];
y = [2, 4, 6, 8, 10];
% 定义插值点
xi = 2.5;
% 使用拉格朗日插值法进行拟合
p = polyfit(x, y, length(x)-1);
yi = polyval(p, xi);
% 输出结果
fprintf('插值点 %f 的函数值为 %f\n', xi, yi);
```
在这个示例中,我们首先定义了原始数据x和y,然后定义了插值点xi。

接着,我们使用polyfit函数进行拉格朗日插值法拟合,其中length(x)-1表示使用n-1次多项式进行拟合,n为原始数据的长度。

最后,我们使用polyval函数计算插值点的函数值yi,并输出结果。

需要注意的是,拉格朗日插值法虽然可以很好地拟合数据,但在插值点附近的函数值可能会出现较大误差。

因此,在实际应用中,我们需要根据具体情况选择合适的插值方法。

MATLAB实现拉格朗日插值

MATLAB实现拉格朗日插值

数值分析上机报告题目:插值法学号:201014924姓名:靳会有一、调用MATLAB内带函数插值1、MATLAB内带插值函数列举如下:2、取其中的一维数据内插函数(interp1)为例,程序如下:其调用格式为:yi=interp1(x, y, xi)yi=interp1(x, y, xi, method)举例如下:x=0:10:100y=[40 44 46 52 65 76 80 82 88 92 110];xi=0:1:100yi=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);elsedisp('x和y的维数不相等!');return; %检错endh=sym(0);for (i=1:n)l=sym(y(i));for(j=1:i-1)l=l*(t-x(j))/(x(i)-x(j));end;for(j=i+1:n)l=l*(t-x(j))/(x(i)-x(j));end;h=h+l;endsimplify(h);if(nargin == 3)f = subs (h,'t',x0); %计算插值点的函数值elsef=collect(h);f = vpa(f,6); %将插值多项式的系数化成6位精度的小数end在MATLAB中输入:x=[18 31 66 68 70 72 70;]y=[23 33 52 51 43 40 46];f=Language(x,y)plot(x,y)结果为:f =Inf + (-t)*Inf - 54329.8*t^2 + 1503.75*t^3 - 22.2065*t^4 + 0.16789*t^5 - 0.000512106*t^6图形如下:MATLAB实现拉格朗日插值建立如下拉格朗日插值函数:function y=lagrange(x0,y0,x);n=length(x0);m=length(x);for i=1:mz=x(i);s=0.0;for k=1:np=1.0;for j=1:nif j~=kp=p*(z-x0(j))/(x0(k)-x0(j));endends=p*y0(k)+s;endy(i)=s;end画图程序如下:x=[-5:1:5];y=1./(1+x.^2);x0=[-5:0.001:5];y0=lagrange(x,y,x0);y1=1./(1+x0.^2);plot(x0,y0,'r')hold onplot(x0,y1,'g')注:画出的图形为n =10的图形得到图形如下:n=10的图像牛顿K次插值多项式一、实验目的:1、掌握牛顿插值法的基本思路和步骤。

实验一 拉格朗日插值Matlab实验报告

实验一 拉格朗日插值Matlab实验报告

北京理工大学珠海学院实验报告
ZHUHAI CAMPAUS OF BEIJING INSTITUTE OF TECHNOLOGY
班级2012电气2班学号xxxxxxxxx姓名陈冲指导教师张凯成绩
实验题目(实验一)拉格朗日插值实验地点及时间JD501 2013/12/26(6-7节)
一、实验目的
1.掌握用程序语言来编辑函数。

2.学会用MATLAB编写Lagrange.m函数。

二、实验环境
Matlab软件
三、实验内容
1、以书中第55页题目13为例编辑程序来实现计算结果。

2、使用MATLAB进行编写:
第一步:编写Lagrange.m函数,代码如下
第二步:利用这个函数来编辑命令:(可见实验结果中的截图)
x=[0.32,0.34,0.36];
y=[sin(0.32),sin(0.34),sin(0.36)];
x0=0.3367;
yt=Lagrange(x,y,x0)
得出抛物线插值为:0.3304
以及
x=[0.32,0.34];
y=[sin(0.32),sin(0.34)];
x0=0.3367;
yt=Lagrange(x,y,x0)
得出线性插值为:0.3304
的近似值并估计误差。

五、实验结果。

六、总结
通过这次实验我学会用MATLAB软件编辑口令进行计算,实验结果是正确的,我相信在以后的实验中,我可以做好每一步,练习好每一次的上机。

实验难度不是很大,主要要注意标点符号的正确性。

………。

2、拉格朗日插值的matlab实现

2、拉格朗日插值的matlab实现
%x0处的插值:f0
syms t;
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*(t-x(j))/(x(i)-x(j));
end;
[f,f0]=Language(x,y,1.6)%计算输出的拉格朗日插值多项式
%计算x=1.6时的插值输出值f0
运行结果
f =
-799/3125*t*(t-1)*(t-3/2)*(t-2)*(t-5/2)*(t-3)+561/500*t*(t-1/2)*(t-3/2)*(t-2)*(t-5/2)*(t-3)-133/75*t*(t-1/2)*(t-1)*(t-2)*(t-5/2)*(t-3)+3031/2500*t*(t-1/2)*(t-1)*(t-3/2)*(t-5/2)*(t-3)-399/1250*t*(t-1/2)*(t-1)*(t-3/2)*(t-2)*(t-3)+1411/112500*t*(t-1/2)*(t-1)*(t-3/2)*(t-2)*(t-5/2)
for(j=i+1:n)
l=l*(t-x(j))/(x(i)-x(j));%计算拉格朗日基函数
end;
f=f+l;%计算拉格朗日插值函数
simplify(f);%化简
end
f0=subs(f,'t',x0);%计算插值点的函数值
运行程序;
x=0:0.5:3;
y=[0 0.4794 0.8415 0.9975 0.9093 0.5985 0.1411];

matlab实现拉格朗日函数,拉格朗日插值多项式

matlab实现拉格朗日函数,拉格朗日插值多项式
请求出错错误代码503请尝试刷新页面重试
matlab实 现 拉 格 朗 日 函 数 , 拉 格 朗 日 插 值 多 项 式
%拉格朗日插值多项式 利用矩阵求解 x=1:0.2:3;%已知数据点x坐标向量:x y=sin(x);%已知数据点x坐标向量:y x1=1.1:0.2:3.1;%插值点的x坐标:x1 L=zeros(11,11);%另L矩阵为0
for i=1:11 A=ones(10,1);%另A矩阵为10行1列的矩阵 x2=x; x2(i)=[]; x2';%10行一列 B=ones(1,11);%另B矩阵为1行11列的矩阵 A*x1;%10行11列 (x2')*B;%10行11列 A*x1-(x2')*B;%11行11列 ones(10,11); x(i);%提取x的第i个元素 ones(10,11)*x(i);%10行11列的矩阵 prod(A*x1-(x2')*B);%基函数的分子 ones(10,11)*(x(i))-(x2')*B;%基函数的分母 C=prod(A*x1-(x2')*B)./prod(ones(10,11)*(x(i))-(x2')*B);%对x2进行转置%C矩阵是一个1行11列的矩阵 L(i,:)=C; %将A的第一行元素全部变为10 %将得到的矩阵赋值基函数的1,2,3。。。。11行
end L;%11行11列 y;%1行11列 y1=y*L
结.9636 0.9975 0.9917 0.9463 0.8632 0.7457
8 至 11 列
0.5985 0.4274 0.2392 0.0416

matlab实现lagrange插值和分段线性插值

matlab实现lagrange插值和分段线性插值

数值分析作业
姓名:虞驰程
题目:
在[-5,5]上,取n=10,对其进行分段线性插值和拉格朗日插值,在函数:f(x)=1
1+x2
Matlab中实现且绘图。

Matlab实现:
首先定义函数f,在Matlab中用function.m文件编写,具体代码如图1所示:
图1 f(x)函数
定义分段线性插值的基本函数,用function.m文件编写,具体代码如图2所示:
图2 分段线性插值基本函数
定义拉格朗日插值的基本函数,用function.m文件编写,具体代码如图3所示:
图3 拉格朗日插值的基本函数
进行分段线性插值并绘图和原函数进行对比的Matlab实现代码如图4所示:
图4 分段线性插值函数绘制
其结果如图5所示,其中红色代表分段线性插值结果,蓝色代表原函数:
图5 分段线性插值和原函数对比
同理可以进行拉格朗日插值并绘图,其Matlab实现代码如图6所示,其结果如图7所示:
图6 拉格朗日插值函数绘制
图7 拉格朗日插值和原函数对比
最后我们可以将分段线性插值、拉格朗日插值和原函数进行对比,其实现代码如图8所示,最终结果如图9所示(黑色代表原函数,蓝色是分段线性插值,红色是拉格朗日插值):
图8 两种插值方法和原函数对比实现
图9 两种插值方法和原函数对比。

matlab曲线插值方法

matlab曲线插值方法

matlab曲线插值方法
在MATLAB中,有多种方法可以进行曲线插值。

以下是一些
常用的方法:
1. 线性插值:使用线性函数将给定数据点之间的空白区域填充。

在MATLAB中,可以使用`interp1`函数实现线性插值。

2. 多项式插值:使用一个多项式函数来逼近数据点。

在MATLAB中,可以使用`polyfit`函数拟合数据点,并使用
`polyval`函数计算插值点。

3. 样条插值:使用分段多项式来逼近数据点,形成平滑的曲线。

在MATLAB中,可以使用`interp1`函数的`'spline'`选项进行样
条插值。

4. Lagrange插值:使用Lagrange插值多项式逼近数据点。

在MATLAB中,可以使用`polyfit`函数的第三个参数指定插值多
项式的次数。

5. 三次样条插值:使用三次多项式来逼近数据点,并确保曲线在数据点之间是连续且光滑的。

在MATLAB中,可以使用
`csape`函数进行三次样条插值。

这些方法在MATLAB中都有相应的函数可以直接调用,并提
供了灵活的参数选项来满足不同的插值需求。

matlab计算拉格朗日牛顿及分段线性插值的程序

matlab计算拉格朗日牛顿及分段线性插值的程序

end %检错 for k=1:n-1 if (x(k)<=x0&x0<=x(k+1)) temp=x(k)-x(k+1); f=(x0-x(k+1))/temp*y(k)+(x0x(k))/(-temp)*y(k+1); end; end
return;
四.程序运行结果 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.0 1.6]; >> xi=0.5:0.5:14.5; >> yi=lang(x,y,xi) yi = Columns 1 through 8 -15.4117 -15.9238 -10.9898 -5.4272 -1.2253 1.2000 2.1765 2.2666 Columns 9 through 16 1.9894 1.7000 1.5703 1.6249 1.7995 2.0000 2.1477 2.2040 Columns 17 through 24 2.1752 2.1000 2.0269 1.9904 1.9928 2.0000 1.9537 1.8000 Columns 25 through 29 1.5272 1.2000 0.9656 1.0000 1.3480 >> plot(x,y,'b:',xi,yi) 2.牛顿插值法 >> yi=newdun(x,y,xi) yi = Columns 1 through 8 -15.4117 -15.9238 -10.9898 -1.2253 1.2000 2.1765 Columns 9 through 16 1.9894 1.7000 1.5703 1.7995 2.0000 2.1477 Columns 17 through 24 2.1752 2.1000 2.0269 1.9928 2.0000 1.9537 Columns 25 through 29 1.5272 1.2000 0.9656 1.3480 >> plot(x,y,xi,yi,'g+')
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用M A T L A B实现拉格朗
日插值和分段线性插值 The Standardization Office was revised on the afternoon of December 13, 2020
用MATLAB实现拉格朗日插值和分段线性插值
1、实验内容:
用MATLAB实现拉格朗日插值和分段线性插值。

2、实验目的:
1)学会使用MATLAB软件;
2)会使用MATLAB软件进行拉格朗日插值算法和分段线性
差值算法;
3、实验原理:
利用拉格朗日插值方法进行多项式插值,并将图形显式出来。

4、实验步骤及运行结果
(1)实现lagrange插值
1)定义函数: f = 1/(x^2+1) 将其保存在文件中,具体程序如
下:
function y = f1(x)
y = 1./(x.^2+1);
2)定义拉格朗日插值函数:将其保存在文件中,具体实现程序
编程如下:
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)建立测试程序,保存在文件中,实现画图:
x=-5::5;
y=(1+x.^2).^-1;
p=polyfit(x,y,n);
py=vpa(poly2sym(p),10)
plot_x=-5::5;
f1=polyval(p,plot_x);
figure
pl ot(x,y,‘r',plot_x,f1)
输入n=6,出现下面的图形:
通过上图可以看到当n=6是没有很好的模拟。

于是重新运行并选择n=11
由此可见n=11时的图像是可以很好的实现模拟
(2)分段线性插值:
建立文件。

具体编程如下
/*分段线性插值函数:文件*/
function y = div_linear(x0,y0,x,n)
%for j = 1:length(x)
for i = 1:n-1
if (x >= x0(i)) && (x <= x0(i+1))
y = (x - x0(i+1))/(x0(i) - x0(i+1))*y0(i) + ( x - x0(i))/(x0(i+1) -
x0(i))*y0(i+1);
else
continue;
end
end
%end
测试程序():
n = input(‘输入n =:’);
x0 = linspace( -5,5,n);
for x = -5::5
y = div_linear(x0,f(x0),x,n);
hold on;
plot(x,y,'r');
plot(x,f(x),'b');
end
2)运行测试程序,这是会出现:
输入n=:
2)输入n=6,并按Enter键,出现:
4)关掉图形界面后,重新运行程序,输入n=11,并按enter键
后出现:
5)再次关掉图形界面,输入n=100,并按enter键,出现:此时。

图形将于原函数图形基本吻合,说明分割区间越多,图像接
近真实的图像。

(3)用lagrange插值观察y = |sin(k*π*x)|的误差分析:
1)编写函数文件,保存在中
x=0::1;
k= input('输入k:')
n= input('输入n:');
y=abs(sin(k*pi*x));
p=polyfit(x,y,n-1);
py=vpa(poly2sym(p),8);
plot_x=0::1;
f1=polyval(p,plot_x);
plot(x,y,plot_x,f1);
2)运行该程序:
输入k=:1
输入n=:2
出现如下图形界面:
关掉图形界面后重新运行,输入k=:1,n=:3
出现如下界面:
再次关掉图形界面,
输入k=:1,n=:6 后出现:此时图形基本吻合。

类推,
输入k=2, n=3后出现:k =2, n =11,出现如下图形:k =2,n =15,这时出现:
k =2,n =19,出现:
当k=2,n=21时,图形如下:此时基本吻合。

5、实验总结:
通过本次课程设计,我初步掌握了MATLAB运用,加深了对于各种线性插值的理解;培养了独立工作能力和创造力;综合运用专业及基础知识,解决实际数学问题的能力;在本次课程设计中,在老师的精心指导下,收益匪浅。

同时对数学的研究有了更深入的认识。

相关文档
最新文档