MATLAB牛顿和拉格朗日插值实验报告

合集下载

牛顿插值_拉格朗日插值1

牛顿插值_拉格朗日插值1

实验一 插值与拟合1 实验目的(1) 明确插值多项式和三次样条插值多项式各自的优缺点;(2) 编程实现拉格朗日插值算法,分析实验结果体会高次插值产生的龙格现象;(3) 理解最小二乘拟合,并编程实现线性拟合,掌握非线性拟合转化为线性拟合的方法 (4) 运用常用的插值和拟合方法解决实际问题。

2 实验内容(1) 对于55,11)(2≤≤-+=x x x f 要求选取11个等距插值节点,分别采用拉格朗日插值和三次样条插值,计算x 为0.5, 4.5处的函数值并将结果与精确值进行比较。

输入:区间长度,n(即n+1个节点),预测点 输出:预测点的近似函数值,精确值,及误差(2) 对下表求出拟合直线 i 1 2 3 4 5 xi 165 123 150 123 141 yi 1871261721251483 算法基本原理当精确函数 y = f(x) 非常复杂或未知,在一系列节点 x 0 … x n 处测得函数值 y 0 = f(x 0), … y n = f(x n ), 希望由此构造一个简单易算的近似函数 g(x) ≈ f(x),满足条件g(x i ) = f(x i ) (i = 0, … n)。

这里的 g(x) 称为f(x) 的插值函数,由插值函数可以去近似估计f(x)在一些未知点处的函数值。

最常用的插值函数是多项式插值。

所谓多项式插值即求 n 次多项式x a x a a x P n n +++= 10)(使得)()(i i n x f x P = 基于基函数的拉格朗日插值是构造多项式插值最基本方法。

也是推导数值微积分和微分方程数值解的公式的理论基础。

拉格朗日插值公式为:∑==nk kk n x ly x p 0)()( 其中∏≠=--=nkj j jk j k x x x x x l 0)(当结点比较多,次数较高的插值多项式往往发生Runge 现象,分段低次插值是避免Runge 现象的重要手段。

分段一次插值将整个区间分段,在每个小区间上,用一次多项式逼近 f (x),直观上即用折线代替曲线,只要区间足够小就可以保证很好的逼近效果,但曲线缺乏光滑性。

上交Newton,拉格朗日插值MATLAB大作业编程

上交Newton,拉格朗日插值MATLAB大作业编程

作业报告使用MATLAB编程2.1Newton插值:clearclcx=[0.2 0.4 0.6 0.8 1];n=length(x);y=zeros(n);y(:,1)=[0.98 0.92 0.81 0.64 0.38]; a=x(1);b=x(end);for j=1:n-1for k=j:n-1temp=y(k+1,j)-y(k,j);y(k+1,j+1)=temp/(x(k+1)-x(k+1-j)); endc(j)=y(j,j);c(j+1)=y(j+1,j+1);endp=c(1);q=1;syms Xfor i=2:nq=q*(X-x(i-1));p=p+c(i)*q;endp=simple(p)for i=1:301t(i)=a+(b-a)/300*(i-1);Nn(i)=eval(subs(p,'X','t(i)')); endplot(t,Nn,'b')hold ongrid onlegend('Newton')title('Newton')xlabel('x')ylabel('f(x)')图像:三次样条插值:M文件spline33.mfunction [yy b c d]=spline3(x,y,xx,flag,vl,vr)if length(x)~=length(y)error('输入数据应成对');endn=length(x);a=zeros(n-1,1);b=a;d=a;dx=a;dy=a;A=zeros(n);B=zeros(n,1);fori=1:n-1a(i)=y(i);dx(i)=x(i+1)-x(i);dy(i)=y(i+1)-y(i);endfori=2:n-1A(i,i-1)=dx(i-1);A(i,i)=2*(dx(i-1)+dx(i));A(i,i+1)=dx(i);B(i,1)=3*(dy(i)/dx(i)-dy(i-1)/dx(i-1)); endif flag==0A(1,1)=1;A(n,n)=1;end% --------------------------------- %% 端点一阶导数条件%if flag==1A(1,1)=2*dx(1);A(1,2)=dx(1);A(n,n-1)=dx(n-1);A(n,n)=2*dx(n-1);B(1,1)=3*(dy(1)/dx(1)-vl);B(n,1)=3*(vr-dy(n-1)/dx(n-1));end% --------------- %% 端点二阶导数条件%if flag==2A(1,1)=2;A(n,n)=2;B(1,1)=vl;B(n,1)=vr;end% --------------- %c=A\B;fori=1:n-1d(i)=(c(i+1)-c(i))/(3*dx(i));b(i)=dy(i)/dx(i)-dx(i)*(2*c(i)+c(i+1))/3; end[mmnn]=size(xx);yy=zeros(mm,nn);fori=1:mm*nnfor ii=1:n-1if xx(i)>=x(ii)&xx(i)<x(ii+1)j=ii;break;elseif xx(i)==x(n)j=n-1;endendyy(i)=a(j)+b(j)*(xx(i)-x(j))+c(j)*(xx(i)-x(j))^2+d(j)*(xx(i)-x(j))^3; endend主程序:clear;clc;format short g;x1=[0.2 0.4 0.6 0.8 1.0]';y1=[0.98 0.92 0.81 0.64 0.38]';u1=0;un=0;xx1=[x1(1):0.001:x1(end)]';[yy1 b1 c1 d1]=spline33(x1,y1,xx1,0,u1,un);fprintf('\t\tb1\t\tc1\t\td1\n');disp([b1 c1(1:end-1,1) d1]);plot(x1,y1,'bo',xx1,yy1,'--k');legend('spline')title('spline')grid on;2.3(1)8次拉格朗日插值M文件language1.mfunction f=language(x,y,x0) syms t l;if (length(x)==length(y))n=length(x);elsedisp('x和y的维数不相等!') return;endh=sym(0);fori=1:nl=sym(y(i));for j=1:i-1l=l*(t-x(j))/(x(i)-x(j)); end;for j=i+1:nl=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);end主程序:x=[0 1 4 9 16 25 36 49 64];y=[0 1 2 3 4 5 6 7 8];f=language1(x,y)plot(x,y)legend('language')title('language')grid on;(2)三次样条差值:M文件spline33.mfunction [yy b c d]=spline3(x,y,xx,flag,vl,vr) if length(x)~=length(y)error('输入数据应成对');endn=length(x);a=zeros(n-1,1);b=a;d=a;dx=a;dy=a;A=zeros(n);B=zeros(n,1);fori=1:n-1a(i)=y(i);dx(i)=x(i+1)-x(i);dy(i)=y(i+1)-y(i);endfori=2:n-1A(i,i-1)=dx(i-1);A(i,i)=2*(dx(i-1)+dx(i));A(i,i+1)=dx(i);B(i,1)=3*(dy(i)/dx(i)-dy(i-1)/dx(i-1));endif flag==0A(1,1)=1;A(n,n)=1;end% --------------------------------- %% 端点一阶导数条件%if flag==1A(1,1)=2*dx(1);A(1,2)=dx(1);A(n,n-1)=dx(n-1);A(n,n)=2*dx(n-1);B(1,1)=3*(dy(1)/dx(1)-vl);B(n,1)=3*(vr-dy(n-1)/dx(n-1));end% --------------- %% 端点二阶导数条件%if flag==2A(1,1)=2;A(n,n)=2;B(1,1)=vl;B(n,1)=vr;end% --------------- %c=A\B;fori=1:n-1d(i)=(c(i+1)-c(i))/(3*dx(i));b(i)=dy(i)/dx(i)-dx(i)*(2*c(i)+c(i+1))/3;end[mmnn]=size(xx);yy=zeros(mm,nn);fori=1:mm*nnfor ii=1:n-1if xx(i)>=x(ii)&xx(i)<x(ii+1)j=ii;break;elseif xx(i)==x(n)j=n-1;endendyy(i)=a(j)+b(j)*(xx(i)-x(j))+c(j)*(xx(i)-x(j))^2+d(j)*(xx(i)-x(j))^3;endend主程序:clear;clc;format short g;x1=[0 1 4 9 16 25 36 49 64 ]';y1=[0 1 2 3 4 5 6 7 8]';u1=0;un=0;xx1=[x1(1):0.001:x1(end)]';[yy1 b1 c1 d1]=spline33(x1,y1,xx1,1,u1,un); fprintf('\t\tb1\t\tc1\t\td1\n');disp([b1 c1(1:end-1,1) d1]);plot(x1,y1,'bo',xx1,yy1,'--k');legend('spline')title('spline')grid on;4-1(1)M文件function.m:Function y=fun(x);y=sqrt(x)*log(x);主程序Clear;clc;h=0.001;n=1/h;t=0;s1=0;s2=0;fori=1:n-1t=t+function(i*h);endT=h/2*(0+2*t+f(1));T=vpa(T,7)For i=0:n-1s1=s1+function(h/2+i*h);endfori=1:n-1s2=s2+function(i*h);endS=h/6*(0+4*s1+2*s2+f(1));S=vpa(S,7) 综上,得解。

拉格朗日插值多项式matlab

拉格朗日插值多项式matlab

实验报告:拉格朗日插值多项式实验目的与要求:熟练掌握拉格朗日插值的基本思想与插值公式实验内容:对于给定的一元函数)(x f y =的n+1个节点值(),0,1,,j j y f x j n ==。

试用Lagrange 公式求其插值多项式Lagrange 插值多项式。

数据如下: (1)求五次Lagrange 多项式5L ()x ,计算(0.596)f ,(0.99)f 的值。

(试构造Lagrange 多项式6L ()x ,计算的(1.8)f ,(6.15)f 值。

实验环境与器材:Matlab7.0实验过程(步骤)或程序代码: (1)fid=fopen('l3.txt','wt');fprintf(fid,'试用Lagrange 公式求其插值多项式Lagrange 插值多项式,求f(0.596),f(0.99)\n');A=[0.4,0.55,0.65,0.80,0.95,1.05];B=[0.41075,0.57815,0.69675,0.9,1,1.25382]; For p=1:2x=input('输入x=') a=1; for i=1:6a=a*(x-A(i));endl=0;for i=1:6b=1;for j=1:6if i~=jb=b*(A(i)-A(j));endendl=l+B(i)*a/((x-A(i))*b);endfprintf(fid,'x f(x)\n');fprintf(fid,'%2f %f\n',x,L);end(2)fid=fopen('l3.txt','wt');fprintf(fid,'试用Lagrange公式求其插值多项式Lagrange插值多项式,求f(1.8),f(6.15)\n');for p=1:2x=input('输入x=')A=[1,2,3,4,5,6,7];B=[0.368,0.135,0.050,0.018,0.007,0.002,0.001];a=1;for i=1:7a=a*(x-A(i));endl=0;for i=1:7b=1;for j=1:7if i~=jb=b*(A(i)-A(j));endendl=l+B(i)*a/((x-A(i))*b);endfprintf(fid,'x f(x)\n');fprintf(fid,'%2f %f\n',x,L);end实验结果与分析:(1)试用Lagrange公式求其插值多项式Lagrange插值多项式,求f(0.596),f(0.99) x f(x)0.596000 0.625732x f(x)0.990000 1.054230(2)试用Lagrange公式求其插值多项式Lagrange插值多项式,求f(1.8),f(6.15) x f(x)1.800000 0.165093x f(x)6.150000 0.001231成绩:教师签名:月日。

牛顿插值法实验报告

牛顿插值法实验报告

牛顿插值法实验报告
1. 什么是牛顿插值法?
牛顿插值法是一种多项式插值的方法,利用差商的概念,通过给定的点求出一个n 次多项式,使得该多项式经过这些点并尽可能接近给定的函数。

2. 实验步骤是什么?
(1)利用MATLAB 编写程序,输入插值节点和函数值;
(2)求解差商表及插值多项式;
(3)将插值多项式绘制成图像,并与实际函数进行比较;
(4)通过调整插值节点的个数,观察插值多项式的变化情况。

3. 实验中遇到的主要问题是什么?
在实验过程中,需要注意细节问题,如插值节点的选择、差商的计算及程序的调试等。

此外,如果插值多项式的次数太高,可能会出现插值误差过大的情况。

4. 实验的结果有哪些?
实验结果表明,随着插值节点数的增加,插值多项式的精度会提高,并且能够较好地拟合原函数。

但是如果节点过于密集,可能出现龙格现象,插值多项式的误差反而会增大。

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(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键,出现:此时。

插值数值实验报告(3篇)

插值数值实验报告(3篇)

第1篇一、实验目的1. 理解并掌握插值法的基本原理和常用方法。

2. 学习使用拉格朗日插值法、牛顿插值法等数值插值方法进行函数逼近。

3. 分析不同插值方法的优缺点,并比较其精度和效率。

4. 通过实验加深对数值分析理论的理解和应用。

二、实验原理插值法是一种通过已知数据点来构造近似函数的方法。

它广泛应用于科学计算、工程设计和数据分析等领域。

常用的插值方法包括拉格朗日插值法、牛顿插值法、样条插值法等。

1. 拉格朗日插值法拉格朗日插值法是一种基于多项式的插值方法。

其基本思想是:给定一组数据点,构造一个次数不超过n的多项式,使得该多项式在这些数据点上的函数值与已知数据点的函数值相等。

2. 牛顿插值法牛顿插值法是一种基于插值多项式的差商的插值方法。

其基本思想是:给定一组数据点,构造一个次数不超过n的多项式,使得该多项式在这些数据点上的函数值与已知数据点的函数值相等,并且满足一定的差商条件。

三、实验内容1. 拉格朗日插值法(1)给定一组数据点,如:$$\begin{align}x_0 &= 0, & y_0 &= 1, \\x_1 &= 1, & y_1 &= 4, \\x_2 &= 2, & y_2 &= 9, \\x_3 &= 3, & y_3 &= 16.\end{align}$$(2)根据拉格朗日插值公式,构造插值多项式:$$P(x) = \frac{(x-x_1)(x-x_2)(x-x_3)}{(x_0-x_1)(x_0-x_2)(x_0-x_3)}y_0 + \frac{(x-x_0)(x-x_2)(x-x_3)}{(x_1-x_0)(x_1-x_2)(x_1-x_3)}y_1 + \frac{(x-x_0)(x-x_1)(x-x_3)}{(x_2-x_0)(x_2-x_1)(x_2-x_3)}y_2 + \frac{(x-x_0)(x-x_1)(x-x_2)}{(x_3-x_0)(x_3-x_1)(x_3-x_2)}y_3.$$(3)计算插值多项式在不同点的函数值,并与实际值进行比较。

牛顿插值法matlab程序

牛顿插值法matlab程序
(1)算法原理或计算公式
算法原理:根据均差定义,把x看成[a,b]上一点,可得

只要把后一式代入前一式,就得到
其中
由式(1-1)确定的多项式 显然满足插值条件,且次数不超过n次的多项式,其系数为
称 为牛顿(Newton)均差插值多项式。系数 就是书本表5-1中第一条斜线上对应的数值。
式(1-2)为插值余项,由插值多项式唯一性可知,它与书本式(5.1.19)是等价的,事实上,利用均差与导数关系式可由式(1-2)推出书本式(5.1.19)。但式(1-2)更有一般性,它对f是由离散点给出的情形或f导数不存在时均适用。
g=subs(f,'t',x0)
g1=subs(f,'t',x1)
A=zeros(n,n-1);
A=[y',A];
for j=2:n
for i=j:n
A(i,j)=(A(i,j-1)-A(i-1,j-1))/(x(i)-x(i+1-j));
end
end
disp('差商表为');
disp(A);
(4)运行结果
f =
1-2*t^2+3*t^3
4、实验小结体会:
1)通过本次实验让我从实践验证了理论-------插值多项式的基本思想;
2)牛顿插值法建立过程中用到了插商计算,这是有别于拉格朗日插值法的一部分,在已知点数较少的情况下用牛顿插值法较为准确;
3)通过编程,加深了matlab的熟悉特别是一些函数语句,进一步体会到了函数逼近的思想。
根据均差定义把x看成ab上一点可得显然满足插值条件且次数不超过n次的多项式其系数为就是书本表51中第一条斜线上对应的数值
《计算方法》数值实验报告

实验二、拉格朗日插值法

实验二、拉格朗日插值法

‘linear’ : 线性插值; ‘spline’ : 三次样条插值; ‘cubic’ : 立方插值。 缺省时: 分段线性插值。
9
例:在1-12的11小时内,每隔1小时测量一次温度,测 得的温度依次为:5,8,9,15,25,29,31,30,22,25, 27,24。试估计每隔1/10小时的温度值。
15
例:测得平板表面3*5网格点处的温度分别为: 82 81 80 82 84 79 63 61 65 81 84 84 82 85 86 试作出平板表面的温度分布曲面z=f(x,y)的图形。 1.先在三维坐标画出原始数据,画出粗糙的温度分布曲图. 输入以下命令: x=1:5; y=1:3; [x,y]=meshgrid(x,y); t=[82 81 80 82 84;79 63 61 65 81;84 84 82 85 86]; mesh(x,y,t) 2.以平滑数据,在x、y方向上每隔0.2个单位的地方进行插值.
课堂任务:
1、用MATLAB实现拉格朗日插值法; 2、用MATLAB分析龙格现象,绘制教材40页图2-5; 3、用自己编写的程序做课后题: 48页:2题. 50页:3题 (1).
用MATLAB作插值计算
一维插值函数:
yi=interp1(x,y,xi,'method')
xi处的插 值结果 插值节点 被插值点 插值方法
h=1:12; t=[5 8 9 15 25 29 31 30 22 25 27 24]; h1=1:0.1:12;
t1=interp1(h,t,h1,'spline')
plot(h1,t1)
10
例 已知飞机机翼下轮廓线上数据如下,求x每改变0.1时的y 值。
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
matlab拉格朗日插值matlab牛顿插值matlab拉格朗日差值拉格朗日插值拉格朗日插值公式matlab拉格朗日拉格朗日插值法拉格朗日插值法程序拉格朗日插值c语言拉格朗日插值定理
数值分析课程实验报告
2012—2013学年度第二学期
系别:数学与计算机科学学院
实验课程
数值分析
班级
10级数学与应用数学2班
fori =1:n
y =y0(i) * l(i) + y;
end
牛顿插值
function[c, d]=newpoly(x, y)
n=length(x);
d=zeros(n, n);
d(:,1)=y';
forj=2 : n
fork=j : n
d(k, j)=(d(k, j-1) - d(k-1, j-1)) / (x(k)-x(k-j+1));
学号
39姓名Biblioteka 指导教师实验题目拉格朗日和牛顿插值
日期
2013年3月27日
实验原理
实验内容及具体步骤:
一、试验环境
计算机MATLAB软件
二、实验目的
1.熟悉启动和退出MATLAB的方法。
2.熟悉MATLAB命令窗口的组成。
3.掌握函数文件的建立及调用。
三、实验内容
四、试验步骤
functiony = lagrange(x0,y0,x)
end
end
c =d(n, n);
fork=(n-1) : - 1 : 1
c =conv(c, poly(x(k)));
m=length(c);
c(m)=c(m)+d(k, k);
end
五、练习
x0=[1 -1 2];
y0=[0 -3 4];
lagrange(x0,y0,1.5)
ans =
1.7917
m = length(x);
n = length(x0);
fori=1:n
l(i)=1;
end
fori = 1:m
forj = 1:n
fork = 1:n
ifj == k
continue;
end
l(j) = (x(i) -x0(k))/(x0(j) - x0(k))*l(j);
end
end
end
y = 0;
相关文档
最新文档