拉格朗日插值在MATLAB的实现

一、实验内容

已给sin0.32=0.314567,sin0.34=0.333487,sin0.36=0.352274,用线性插值及抛物插值计算sin0.3367的值并估计截断误差。


二、程序清单与运行结果

1. 线性插值

M文件代码如下:

function y=sin_L(x0,y0,x1,y1,x)
% sin_L输出sin(x)使用线性插值计算得到的函数值
% 例如: y=sin_L(0.32,0.314567,0.34,0.333487,0.3367)
%       y = 
%           0.3304
%       R = 
%           9.1892e-06
 
% 以下为判断输入值是否合法的代码
if nargin~=5
    error('请输入线性插值的插值节点和插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x) )
    error('输入参数必须是数')
end
 
% 核心计算的代码
y=y0+(y1-y0)*(x-x0)/(x1-x0);
 
% 以下为求解截断误差的代码
syms M2; % 因为sin(x)的二阶导数是本身,所以只需要挑出最大的y值,即可的到M2
if y0>y1
    M2=y0; 
else
    M2=y1;
end
R=M2*abs((x-x0)*(x-x1))/2
end

运行结果如下:

2. 抛物插值

M文件代码如下:

function y=sin_T(x0,y0,x1,y1,x2,y2,x)
% sin_T输出sin(x)使用抛物插值计算得到的函数值
% 例如: y=sin_T(0.32,0.314567,0.34,0.333487,0.36,0.352274,0.3367)
%       y = 
%           0.3304
%       R = 
%           2.0315e-07
 
% 以下为判断输入值是否合法的代码
if nargin~=7
    error('请输入线性插值的插值节点和插值点')
end
if ~( isnumeric(x0)&&isnumeric(y0)&&isnumeric(x1)&&isnumeric(y1)&&isnumeric(x2)&&isnumeric(y2)&&isnumeric(x) )
    error('输入参数必须是数')
end
 
% 核心计算的代码
y=y0*(x-x1)*(x-x2)/((x0-x1)*(x0-x2))+y1*(x-x0)*(x-x2)/((x1-x0)*(x1-x2))+y2*(x-x0)*(x-x1)/((x2-x0)*(x2-x1));
 
% 以下为求解截断误差的代码
y_0=cos(x0); % 因为sin(x)的三阶导数是cos(x),那么只要求出x0,x1,x2的cos值,然后去最大即可得到M3
y_1=cos(x1);
y_2=cos(x2);
syms M3;
if y_0>y_1
    M3=y_0;
else
    M3=y_1;
end
if y_2>M3
    M3=y_2;
end
R=M3*abs((x-x0)*(x-x1)*(x-x2))/6
end

运行结果如下


三、实验总结

在本次实验中,在实现了sin函数的两个插值程序以后,我尝试把程序的适用范围扩大,甚至可以直接在调用插值程序时输入插值函数直接处理,而不需要再去修改M文件,但由于时间和能力限制,暂时未能实现。
  • 15
    点赞
  • 113
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值