首页/文章/ 详情

数值计算&Matlab——Lagrange插值

1年前浏览208

今天给大家带来的是插值思想最经典的Lagrange插值,理论部分详见各种教科书,木木只负责提供代码,所演示的代码可直接拿走食用

例:列车从直道进入到半径为R的圆弧弯道时,为安全行驶,往往需要进行一段缓冲区(缓和曲线哦,木木本科就是道路方向的哈哈哈),如图所示:


我国铁路大部分采用三次抛物线型缓和曲线。现测得某缓和曲线上4点不同的坐标如下表所示:

x坐标(m)
0
60
120
180
y坐标(m)
00.45
3.6
12.15

是利用Lagrange多项式插值法求缓和曲线的方程,并求x=115m时y的坐标

代码1:


















function varargout = lagrange_interp(xdata,ydata,xi)%拉格朗日插值n=length(xdata);                        %求向量xdata的长度if length(unique(xdata))<n               %若输入的点出现相同时,给出错误提示    error('输入的点必须是互异的.')endL=zeros(n);    %存储插值基函数for i=1:n    px=poly(xdata([1:i-1,i+1:n]));%构造以x_j为根的多项式(j=1:i-1,i_1:n)    L(i,:)=px/polyval(px,xdata(i));%求插值基函数并存储endy=sum(bsxfun(@times,L,ydata(:)));%求插值多项式if nargin==3                     %若输入参数为3    y=polyval(y,xi);              %根据插值多项式求指定点处的值end[varargout{1:2}]=deal(y,...     %第一个输出参数为插值多项式或其在某点处的值                    L);         %第2个输出参数为插值基函数

命令行输入:










xdata=[0 60 120 180];ydata=[0 0.45 3.6 12.15];y=Lagrange_interp(xdata,ydata)x=linspace(0,180);f=polyval(y,x);   %返回多项式的值plot(x,f)hold onplot(xdata,ydata,'ko')title(['缓和曲线方程:f(x)=0',strtrim(poly2str(y,'x'))])

绘图:


代码2:

















function f=arui_lagrange(x0,y0,x)%x0为节点变量,y0为节点上的函数值,x为插值点,f为返回插值n=length(x0);m=length(x);format longs=0.0;for k=1:n    p=1.0;    for j=1:n        if j~=k            p=p*(x-x0(j))/(x0(k)-x0(j));        end     end    s=p*y0(k)+s;endf = s;end

命令行输入:






xdata=[0 60 120 180];ydata=[0 0.45 3.6 12.15];y=Lagrange_interp(xdata,ydata,115)f=arui_lagrange(xdata,ydata,115)

得出结果:

y= 3.168489583333333

f= 3.168489583333333

来源:易木木响叮当
理论
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-01
最近编辑:1年前
易木木响叮当
硕士 有限元爱好者
获赞 220粉丝 260文章 349课程 2
点赞
收藏
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈