-
2018-07-01 15:07:08
一、实验内容
已给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文件,但由于时间和能力限制,暂时未能实现。
更多相关内容 -
MATLAB实现拉格朗日插值(线性插值、二次插值、三次插值······)
2019-03-18 00:37:21已知 sin(0.32)=0.314567,sin(0.34)=0.333487,sin(0.36)=0.352274, sin(0.38)=0.370920。 请采用线性插值、二次插值、三次插值分别计算 sin(0.35)的值。 -
拉格朗日插值法(matlab)
2018-06-23 12:43:12数值分析中的拉格朗日插值法,牛顿插值法,三次样条插值法的matlab代码描述。 -
用matlab实现拉格朗日插值和分段线性插值.pdf
2020-11-02 18:37:49用 MATLAB 实现拉格朗日插值和分段线性插值 1 实验内容 用 MATLAB 实现拉格朗日插值和分段线性插值 2 实验目的 1 学会使用 MATLAB 软件 2 会使用 MATLAB 软件进行拉格朗日插值算法和分段线性 差值算法 3实验原理 ... -
Matlab实现线性插值、抛物插值、牛顿插值、拉格朗日插值、分段抛物插值、分段线性插值
2021-11-08 00:14:25线性插值 原理 流程图 代码 x0=0.2; y0=21; x1=0.4; y1=25; x=0.7; L0=(x-x1)/(x0-x1); L1=(x-x0)/(x1-x0); y=y0*L0+y1*L1; 抛物插值 原理 流程图 代码 x0=0.2; x1=0.4; x2=0.6; y0=21; y1...目录
线性插值
原理
流程图
单个点的线性插值代码
X=[0.2 0.4]; Y=[21 25]; x=0.7; x0=X(1) y0=Y(1); x1=X(2); y1=Y(2); L0=(x-x1)/(x0-x1); L1=(x-x0)/(x1-x0); y=y0*L0+y1*L1;
多个点的线性插值代码
time = [1 3 8 12 15 20 24]; tem = [8 9 16 23 22 18 10]; time_i = 1:0.01:24; tem_i = self_interp1(time,tem,time_i,'linear'); plot(time,tem,'o',time_i,tem_i); %自己写一个interp1类似功能的接口 %在这个接口中参数x需要从大到小排列,y随意 function [yi]=self_interp1(x,y,xi,method) % 初始化yi,给它xi对应的列 col_xi = size(xi,2); yi = zeros(1,col_xi); % 检测使用的插值方法 这里期望的是'linear' if strcmp(method,'linear') % 找到每个xi在x序列中的位置 col_x = size(x,2); for i = 1:col_xi, for j = 1:col_x-1, % 假如需要计算插值公式 if x(j+1) > xi(i), yi(i) = y(j)+(y(j+1)-y(j))/(x(j+1)-x(j))*(xi(i)-x(j)); break; end % 假如插值处的数据已经测得了,就直接把值给它,节约计算资源 if x(j) == xi(i), yi(i) = y(j); break; end end % 以上没有把最后一个数据点考虑进去,需要加上 yi(col_xi) = y(col_x); end else error('插值方法请选择(linear)\n'); end end
抛物插值
原理
流程图
代码
X=[0.2 0.4 0.6]; Y=[21 25 23]; x0=X(1); x1=X(2); x2=X(3); y0=Y(1); y1=Y(2); y2=Y(3); x=0.7; L0=(x-x1)*(x-x2)/(x0-x1)/(x0-x2); L1=(x-x0)*(x-x2)/(x1-x0)/(x1-x2); L2=(x-x0)*(x-x1)/(x2-x0)/(x2-x1); y=y0*L0+y1*L1+y2*L2
拉格朗日插值
代码
x=[0.2 0.4 0.6 0.8]; y=[21 25 23 20]; yh=lagrange(x,y,0.7) function yh=lagrange (x,y,xh) n = length(x); m = length(xh); yh = zeros(1,m); c1 = ones(n-1,1); c2 = ones(1,m); for i=1:n xp = x([1:i-1 i+1:n]); yh = yh + y(i)*prod((c1*xh-xp'*c2)./(x(i)-xp'*c2)); end end
牛顿插值
原理
代码
xi=[1 4 9]; yi=[1 2 3]; x=7; p= Newton_fun(x,xi,yi) function p= Newton_fun(x,xi,yi) n=length(xi); f=zeros(n,n); % 对差商表第一列赋值 for k=1:n f(k)=yi(k); end % 求差商表 for i=2:n % 差商表从0阶开始;但是矩阵是从1维开始存储!!!!!! for k=i:n f(k,i)=(f(k,i-1)-f(k-1,i-1))/(xi(k)-xi(k+1-i)); end end disp('差商表如下:'); disp(f); %求插值多项式 p=0; for k=2:n t=1; for j=1:k-1 t=t*(x-xi(j)); disp(t) end p=f(k,k)*t+p; disp(p) end p=f(1,1)+p; end
分段线性插值
原理
代码
x = [1 3 8 12 15 20 24]; y = [8 9 16 23 22 18 10]; yy=fdxx(x,y,7) function yy=fdxx(x,y,xx) n=size(x,2); for i=1:n-1 if x(i)<xx&&xx<x(i+1) L1=(xx-x(i+1))/(x(i)-x(i+1)); L2=(xx-x(i))/(x(i+1)-x(i)); yy=L1*y(i)+L2*y(i+1); break; elseif x(i)==xx yy=y(i); end end end
分段抛物插值
原理
代码
x = [1 3 8 12 15 20 24]; y = [8 9 16 23 22 18 10]; y=fenduanpaowu(x,y,7) function y=fenduanpaowu(xi,yi,x) n=size(xi,2); if x<xi(2) L1=(x-xi(1))*(x-xi(3))/(xi(1)-xi(2))/(xi(1)-xi(3)); L2=(x-xi(1))*(x-xi(3))/(xi(2)-xi(1))/(xi(2)-xi(3)); L3=(x-xi(1))*(x-xi(2))/(xi(3)-xi(1))/(xi(3)-xi(2)); y=L1*yi(1)+L2*yi(2)+L3*yi(3); elseif x>xi(end-1) L1=(x-xi(end-1))*(x-xi(end))/(xi(end-2)-xi(end-1))/(xi(end-2)-xi(end)); L2=(x-xi(end-2))*(x-xi(end))/(xi(end-1)-xi(end-2))/(xi(end-1)-xi(end)); L3=(x-xi(end-2))*(x-xi(end-1))/(xi(end)-xi(end-2))/(xi(end)-xi(end-1)); y=L1*yi(1)+L2*yi(2)+L3*yi(3); else for k=2:n-1 if xi(k+1)>x if abs(x-xi(k))<abs(x-xi(k+1)) i=k-1; else i=k; end L1=(x-xi(i+1))*(x-xi(i+2))/(xi(i)-xi(i+1))/(xi(i)-xi(i+2)); L2=(x-xi(i))*(x-xi(i+2))/(xi(i+1)-xi(i))/(xi(i+1)-xi(i+2)); L3=(x-xi(i))*(x-xi(i+1))/(xi(i+2)-xi(i))/(xi(i+2)-xi(i+1)); y=L1*yi(i)+L2*yi(i+1)+L3*yi(i+2); end end end end
-
实验四用MATLAB实现拉格朗日插值、分段线性插值x_3次拉格朗日插值多项式
2020-12-02 08:06:20实验四用MATLAB实现拉格朗日插值、分段线性插值.pptx -
matlab插值:拉格朗日插值
2022-02-04 20:36:33拉格朗日插值即对所要插值的函数进行拉格朗日多项式拟合 这是matlab插值系列的第二期,第一期:[数值分析拟合]Matlab三次样条插值拟合数据 (以后会有时间的时候再更新更多的插值方法) 这篇文章我推导过程参考过...拉格朗日插值即对所要插值的函数进行拉格朗日多项式拟合
这是matlab插值系列的第二期,第一期:[数值分析拟合]Matlab三次样条插值拟合数据
(以后会有时间的时候再更新更多的插值方法)
这篇文章我推导过程参考过了一些其他文章,代码是自己写的,如有不对或者公式打错了欢迎批评指正
首先,对于所需要插值的自变量x和所需插值的数据点y:
一、我们先来了解它的插值原理:
对于在一组数值散点中的任意一点进行插值,找到一个满足相应条件的n次多项式,我们希望能用所有点的函数值去表示它,并且每一点的函数值都与原来的函数值相符合。
因此,设原数据的每一个点的函数值为
,为了组成插值所得到的
,前面配凑的系数是
,那么则有:
记从0开始推导,则
那么由两个点的插值开始,所得的应当是线性插值
则有
那么显然有
对于中间的每一个点,都应当有
整理得到
那么从0开始,则其插值的系数为
, 有
这时,规律不够明显, 因此我们采用更多的点来进行相关的推导
当点的个数为n+1时,为了保证
依然成立
首先,为了保证下方条件,分子为
(图片来自参考文章
拉格朗日(Lagrange)插值多项式的基函数构造法(详细推导))
此时,根据
,可以有n+1个方程,那么由于有n+1个c(c0,c1,c2....cn),则可通过解方程唯一确定对应的c0,解出c0后,即可确定
,
通过以上的公式推导,下面使用MATLAB来实现上述的计算内容
先加上我在里面调用的len.m
%返回一维数组长度(行数或列数其中大的一个,必须是一位数组) function [length]=len(A) s=size(A); if s(2)==1 length=s(1); %取行 end if s(1)==1 length=s(2); end if s(1)~=1 && s(2)~=1 disp('必须是单行向量或单列向量') return end end
编写函数 Lagrange.m计算拉格朗日插值:
其中许多的注释我用英语写的看着别嫌麻烦哈,这段时间为了学英语我也在天天头皮发麻)
% *** Lagrange interpolation *** function L = Lagrange(x,y,x_2) % x --origional x vector % y --origional y vector need to be interpolated % x_2 --the vector x that you want to interpolate to % author:FriedParrot --2022-2-4 if len(x) ~= len(y) error('The length of x and y should be correspond'); end xi = x_2; % generate the vector that need to be interpolated % define the initial vectors L = zeros(1,len(xi)); for i = 1:1:len(xi) % This is the index of the xi(to be interpolated) l = ones(1,len(x)); % it is used every time for k = 1:1:len(x) for j= 1:1:len(x) if j ~= k % similar to prod but the denominator shouldn't be zero l(k) = l(k) * ( xi(i)-x(j)) / (x(k)-x(j)); % the index should be k --the first index of the iteration end end % cacultte the l_j L(i) = L(i) + l(k)*y(k); % just for every single loop of s end end if nargout == 0 figure('name','Lagrange Interpolation'); plot(xi,L); end end
下面加上测试代码以及效果:
(代码使用外插值,即公式中的范围比数据的范围更广)
x = [1,2,4,6,8,9]; y = cos(x); x_2 = 0:0.05:10; Lagrange(x,y,x_2);
插值效果:
参考文章:
拉格朗日(Lagrange)插值多项式的基函数构造法(详细推导)
-
实验四用matlab实现拉格朗日插值、分段线性插值.pdf
2020-10-31 21:53:20实验四 用 MATLAB 实现拉格朗日插值分段线性插值 一实验目的 1学会使用MATLAB 软件 2会使用MATLAB 软件进行拉格朗日插值算法和分段线性差值算法 二实验内容 1 用 MATLAB 实现 y = 1./(x^2+1; -1的拉格朗日插值分段... -
数值分析·学习 | 拉格朗日插值法matlab实现
2022-06-27 09:36:15数值分析·学习 | 拉格朗日插值法matlab实现目录
前言
本篇内容为个人所学知识分享
一、拉格朗日(Lagrange)插值是什么?
对于构造通过n+1个不同的节点
的n次插值多项式
,假定它满足条件
为了构造
,我们先定义n次插值基函数。
若n次多项式
在n+1个节点
上满足条件
则称这n+1个n次多项式
为节点
上的n次插值基函数。
且
使得插值多项式可以表示为
由
的定义,知
形如上式的插值多项式
便称为拉格朗日(Lagrange)插值多项式。线性插值和抛物线插值只是拉格朗日插值的特殊情况。
拉格朗日(Lagrange)插值多项式的另外一种表示形式如下:
其中
二、matlab实现代码
1.线性插值:
即n=1的时候,一次的插值函数,即已知条件为两个插值节点及其值
function y0=Linear_interpolation(x,y,x0) %功能:线性插值 %输入:x为插值节点,y为插值节点对应的值,x0为计算点 %输出:x0处的值 y0=y(1)+(y(2)-y(1))/(x(2)-x(1))*(x0-x(1));%点斜式 y0=y(1)*(x(2)-x0)/(x(2)-x(1))+y(2)*(x0-x(1))/(x(2)-x(1));%两点式 end
2.抛物线插值:
即n=2的时候,二次的插值函数,即已知条件为三个插值节点及其值
function y0=Parabolic_interpolation(x,y,x0) %功能:抛物线插值 %输入:x为插值节点,y为插值节点对应的值,x0为计算点 %输出:x0处的值 y0=y(1)*(x0-x(2))*(x-x(3))/(x(1)-x(2))/(x(1)-x(3))+y(2)*(x0-x(1))*(x0-x(3))... /(x(2)-x(1))/(x(2)-x(3))+y(3)*(x0-x(1))*(x0-x(2))/(x(3)-x(1))/(x(3)-x(2)); end
3.拉格朗日(Lagrange)插值:
(一般情况)即已知条件为一串插值节点及其值
function y0=Lagrange_interpolation(x,y,x0) %功能:拉格朗日插值多项式求解 %输入:x为插值节点,y为插值节点对应的值,x0为计算点 %输出:x0处的值 y0=0; for m=length(x)%循环作用:不同项作和 X=1; for n=length(x)%循环作用:构成每一项的插值基函数的形式 if x(m)~=x(n)%判断作用:排除分子为零的循环 X=X.*(x0-x(n))./(x(m)-x(n)); else continue; end end y0=y(m)*X./(x0-x(m))+y0; end end
总结
拉格朗日插值的插值对象为:一串不同的插值节点,且知道插值节点及其值。
代码部分由于线性插值和抛物线插值是拉格朗日的特殊情况,所以小编在编写的时候,为了让看起来没有重复,选择了直接按照运算形式编写代码。
-
实验四用MATLAB实现拉格朗日插值、分段线性插值.pdf
2020-07-24 19:08:23实验四 用 MATLAB实现拉格朗日插值分段线性插值 一实验目的 1学会使用 MATLAB软件 2 会使用 MATLAB软件进行拉格朗日插值算法和分段线性差值算法 二实验内容 1 用 MATLAB实现 y = 1./(x^2+1; -1的拉格朗日插值分段... -
matlab中的Lagrange插值法、分段线性插值法,以及利用Matlab进行插值的方法。
2017-12-29 12:42:34matlab中的Lagrange插值法、分段线性插值法,以及利用Matlab进行插值的方法。所需积分怎么自己变了 自己变了 自己变了 -
用MATLAB实现拉格朗日插值和分段线性插值
2021-01-30 18:35:19《用MATLAB实现拉格朗日插值和分段线性插值》由会员分享,可在线阅读,更多相关《用MATLAB实现拉格朗日插值和分段线性插值(6页珍藏版)》请在人人文库网上搜索。1、用MATLAB实现拉格朗日插值和分段线性插值1、 实验... -
数值分析10 - 数据插值方法之 拉格朗日插值法:线性插值、二次插值、 拉格朗日插值余项(误差)
2021-01-08 19:38:18一、 差值的意义和基本概念 . . 二、线性插值(2个已知点) 开关 = 累乘(X - X其他) ———————————— × Y本身 ... -
拉格朗日(lagrange)插值(MATLAB实现)
2021-11-06 16:51:40拉格朗日(Lagrange)插值(MATLAB实现) -
实验四 用MATLAB实现拉格朗日插值、分段线性插值.doc
2022-07-05 09:15:37实验四 用MATLAB实现拉格朗日插值、分段线性插值 -
用MATLAB实现拉格朗日插值和分段线性插值.pdf
2021-12-03 09:04:29用MATLAB实现拉格朗日插值和分段线性插值.pdf -
用MATLAB实现拉格朗日插值和分段线性插值[整理].pdf
2020-11-20 11:15:02用MATLAB 实现拉格朗日插值和分段线性插值 1 实验内容 用MATLAB 实现拉格朗日插值和分段线性插值 2 实验目的 1 学会使用MATLAB 软件 2 会使用MATLAB 软件进行拉格朗日插值算法和分段线 性差值算法 3实验原理 利用... -
用MATLAB实现拉格朗日插值和分段线性插值.doc
2021-10-10 20:36:59用MATLAB实现拉格朗日插值和分段线性插值.doc -
matlab分段线性插值
2021-04-20 06:42:20end end 7 结果分析与讨论:运用 MATLAB 分别对分段线性插值和三次样条插值进行编程的到数值均为 1.4664 说明实验结果准确无误,通过实验可以得出,在......中平均选取21个点作插值(xch13) 4.在[-6,6]中平均选取41个点... -
拉格朗日插值、分段线性插值、三次样条插值
2018-08-30 21:20:05本篇主要介绍在三种插值方法:拉格朗日插值、分段线性插值、三次样条插值,以及这三种方法在matlab中如何实现。 1.拉格朗日插值: 1.1基本原理:先构造一组基函数: 是次多项式,满足 令 上式称为... -
实验四用MATLAB实现拉格朗日插值、分段线性插值.docx
2020-03-21 07:46:26实验四 用 MATLAB 实现拉格朗日插值分段线性插值 一实验目的 学会使用 MATLAB 软件 会使用 MATLAB 软件进行拉格朗日插值算法和分段线性差值算法 二实验内容 1 用 MATLAB 实现 y = 1./(x^2+1;-1的拉格朗日插值分段... -
实验四用MATLAB实现拉格朗日插值、分段线性插值.doc
2021-10-11 08:21:50实验四用MATLAB实现拉格朗日插值、分段线性插值.doc -
用MATLAB实现拉格朗日插值
2021-04-20 09:27:39《用MATLAB实现拉格朗日插值》由会员分享,可在线阅读,更多相关《用MATLAB实现拉格朗日插值(3页珍藏版)》请在人人文库网上搜索。1、用MATLAB实现拉格朗日插值1、作业内容:用MATLAB实现拉格朗日插值2、作业目的:1)... -
2020年最新版实验四用MATLAB实现拉格朗日插值、分段线性插值.docx
2020-11-20 20:19:57实验四用MATLAE实现拉格朗日插值分段线性插值 一实验目的 )学会使用MATLAB软件 )会使用MATLAB软件进行拉格朗日插值算法和分段线性差值算法 二实验内容 1用MATLAB实现y二l./(x.A2+l; (-1二xUl )的拉格朗日插值分段... -
分段线性插值matlab
2021-04-23 05:53:59参考资 料等): 来源与意义: 本课题来源于教材第二章插值法,目的是从几何意义掌握分段线性插值的思 想,加深对其的理解以及掌握用计算机与 Matlab 解决相关问题的......(j))^3; end end 7 结果分析与讨论:运用 MATLAB ...