拉格朗日插值的matlab实现
- 格式:doc
- 大小:14.50 KB
- 文档页数:2
题 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。
2、拉格朗日插值实例:根据下面的数据点求出其拉格朗日插值格式,并计算当x=1.6时y的值。
x 0 0.5 1.0 1.5 2.0 2.5 3.0y 0 0.4794 0.8145 0.9975 0.9093 0.5985 0.1411function[f,f0]=Language(x,y,x0)%求已知数据点的拉格朗日插值多项式%已知数据点的x坐标向量:x%已知数据点的y坐标向量:y%插值点的x坐标:x0%求得的拉格朗日插值多项式:f%x0处的插值:f0symst;if(length(x)==length(y))n=length(x);elsedisp('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;for(j=i+1:n)l=l*(t-x(j))/(x(i)-x(j));%计算拉格朗日基函数end;f=f+l;%计算拉格朗日插值函数simplify(f);%化简endf0=subs(f,'t',x0);%计算插值点的函数值运行程序;x=0:0.5:3;y=[00.47940.84150.99750.90930.59850.1411];[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)f0=仅供个人学习参考0.9996仅供个人学习参考。
例题matlab拉格朗日插值拉格朗日插值是一种常用的数值插值方法,它可以通过已知的数据点来估计未知点的函数值。
在MATLAB中,我们可以使用拉格朗日插值函数polyfit和polyval来实现。
假设我们有一组已知的数据点(x1, y1), (x2, y2), ..., (xn, yn),我们想要通过这些数据点来估计一个未知点的函数值。
首先,我们需要使用polyfit函数来计算拉格朗日插值多项式的系数。
```matlabx = [x1, x2, ..., xn];y = [y1, y2, ..., yn];n = length(x) - 1; % 多项式的次数coefficients = polyfit(x, y, n);```polyfit函数返回的coefficients是一个包含多项式系数的向量,从高次到低次排列。
接下来,我们可以使用polyval函数来计算未知点的函数值。
```matlabunknown_x = ...; % 未知点的x坐标unknown_y = polyval(coefficients, unknown_x);```polyval函数接受一个多项式系数向量和一个x值作为输入,返回对应的函数值。
通过这种方式,我们可以使用拉格朗日插值来估计未知点的函数值。
下面我们来看一个具体的例子。
假设我们有一组已知的数据点(0, 1), (1, 2), (2, 3),我们想要通过这些数据点来估计未知点(1.5, ?)的函数值。
```matlabx = [0, 1, 2];y = [1, 2, 3];n = length(x) - 1;coefficients = polyfit(x, y, n);unknown_x = 1.5;unknown_y = polyval(coefficients, unknown_x);```在这个例子中,我们得到的未知点的函数值为2.5。
这意味着在x坐标为1.5的位置,我们估计的函数值为2.5。
用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实现拉格朗日插值1、作业内容:用MATLAB实现拉格朗日插值2、作业目的:1)学会使用MATLAB软件;2)会使用MATLAB软件进行拉格朗日插值算法3、作业原理:利用拉格朗日插值方法进行多项式插值,并将图形显式出来。
4、实验步骤及运行结果(1)实现lagrange插值1)定义函数: f = 1./(25*x^2+1)将其保存在f.m 文件中,具体程序如下:function y = f1(x)y = 1./(25x.^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=-1:0.001:1;y=(1+25.*x.^2).^-1;p=polyfit(x,y,n);py=vpa(poly2sym(p),10)plot_x=-1:0.001:1;f1=polyval(p,plot_x);figureplot(x,y,‘r',plot_x,f1)输入n=6,出现下面的图形:通过上图可以看到当n=6是没有很好的模拟。
于是重新运行text.M并选择n=15,运行,显示图形如下:由此可见n=15时的图像是可以很好的实现模拟5、总结:通过本次课程作业,我初步掌握了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、掌握牛顿插值法的基本思路和步骤。
数值分析作业
姓名:虞驰程
题目:
在[-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编写拉格朗日插值法案例拉格朗日插值法是一种常用的插值方法,可以通过已知的离散数据点,构造一个多项式函数来逼近这些数据点。
这种方法的最大优点是能够通过任意多个数据点来构造插值函数,因此适用于各种数据分布情况。
下面将列举10个使用Matlab编写拉格朗日插值法的案例,展示该方法在不同领域的应用。
1. 温度插值:假设我们有几个气象站的测温数据,但是某个地点的测温数据缺失。
可以使用拉格朗日插值法来估计该地点的温度值,从而填补数据缺失的空白。
2. 人口预测:根据已有的人口数据,可以使用拉格朗日插值法来预测未来某个时间点的人口数量。
这对城市规划和资源分配具有重要意义。
3. 股票价格预测:根据过去的股票价格数据,可以使用拉格朗日插值法来预测未来某个时间点的股票价格。
这有助于投资者做出合理的投资决策。
4. 图像处理:在图像处理中,可以使用拉格朗日插值法来放大或缩小图像。
通过对图像中的像素点进行插值,可以得到更高分辨率的图像。
5. 数字信号处理:在数字信号处理中,可以使用拉格朗日插值法来重构缺失的信号样本。
这有助于恢复被噪声污染或丢失的信号。
6. 机器学习:在机器学习中,拉格朗日插值法可以用于处理缺失数据。
通过对已有数据进行插值,可以构造更完整的数据集,提高模型的准确性。
7. 地理信息系统:在地理信息系统中,可以使用拉格朗日插值法来生成等高线图。
通过对不同高度的离散数据点进行插值,可以得到连续的等高线分布。
8. 数值积分:在数值积分中,可以使用拉格朗日插值法来近似计算定积分。
通过将被积函数进行插值,可以将积分转化为对插值多项式的求和。
9. 电力系统分析:在电力系统分析中,可以使用拉格朗日插值法来估计电力负荷曲线。
通过对已知的电力负荷数据进行插值,可以预测未来的负荷变化趋势。
10. 信号滤波:在信号滤波中,可以使用拉格朗日插值法来对信号进行平滑处理。
通过对信号进行插值,可以去除噪声和异常值,得到更干净的信号。
matlab拉格朗日插值函数Matlab拉格朗日插值函数Matlab是一种流行的数学软件,用于数据分析、数值计算和可视化。
其中插值函数是一项常见的数学任务,可以用来发现数据点之间的趋势和模式,同时也可以预测未知数据点的值。
拉格朗日插值函数是一种常用的插值函数,本文将对其进行介绍。
一、拉格朗日插值函数的基本原理拉格朗日插值函数可以将给定的数据点(x1,y1),(x2,y2),......(xn,yn)拟合成一个多项式函数P(x),使得P(xi)=yi。
拟合出的多项式函数可以用来推断在数据点之间的任何x值所对应的y值。
这种方法称为插值,因为拟合出的多项式函数是数据点之间的拉格朗日插值多项式。
二、Matlab中的拉格朗日插值函数Matlab中有一个内置的插值函数interp1,可以用来插值实验数据。
但是,interp1是一种线性插值方法,当数据散布很广或存在噪声时,线性插值可能会产生不准确的结果。
因此,更好的选择是使用拉格朗日插值函数。
Matlab中的拉格朗日插值多项式可以利用polyfit和polyval函数实现。
给定数据点xi和yi,可以使用polyfit函数计算N-1阶多项式系数p,其中N是数据点的数量。
然后可以使用polyval函数将新的x值带入多项式中,以计算y值。
三、实例演示下面我们通过一个简单的示例来说明如何使用Matlab中的拉格朗日插值函数。
假设有这样一组数据:x = [1, 3, 5, 7];y = [2, 3, 1, 3];现在我们想要在x=2和x=6处进行插值,以求得y值。
首先,我们可以使用polyfit函数计算多项式系数:p = polyfit(x,y,3);其中,第一个参数是x值,第二个参数是y值,第三个参数是多项式的阶数。
接下来,我们使用polyval函数将新的x值代入多项式:y_interp = polyval(p,[2,6]);这将得到插值结果:y_interp = [2.2222, 1.2222]。