您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 工程监理 > 计算方法第一次上机作业
计算方法第一次上机作业姓名:gegebao学院:学号:摘要:程序代码基于MATLAB,包含问题表述、辅助插值的函数、插值函数、表达式、图像和文字说明、分析讨论几个部分一、问题表述对Runge函数R(x)(1/(1+x^2)),利用下列条件做插值逼近,并与R(x)的图像进行比较。1.用等距节点𝑥𝑖=−5+𝑖,𝑖=0,1,2…10,绘出它的10次New通插值多项式的图像;2.用节点𝑥𝑖=5cos(2𝑖+142𝜋),𝑖=0,1,2,3…20,绘出它的20次Lagrange插值多项式的图像;3.用等距节点𝑥𝑖=−5+𝑖,𝑖=0,1,2…10,绘出它的分段线性插值函数的图像;4.用等距节点𝑥𝑖=−5+𝑖,𝑖=0,1,2…10,,绘出它的分段三次Hermite插值函数的图像;5.用等距节点𝑥𝑖=−5+𝑖,𝑖=0,1,2…10,,绘出它的三次自然样条插值函数的图像。二、辅助插值的函数1.create(x0)输入一组插值节点,输出函数(1/(1+x0(i)^2))对应的一组函数值y0与导数值c0function[y0c0]=create(x0)l=length(x0);%获取节点个数y0=x0;fori=1:l%逐个求出函数值和导数y0(i)=1/(1+x0(i)^2);c0(i)=-2*x0(i)/(1+x0(i)^2)^2;endend2.output(y,c),输出关于x的多项式y在[-5,-5]上的图像,c表示图像颜色function[]=output(y,c)x1=-5:0.01:5;y1=subs(y,'x',x1);%根据多项式生成对应的大量坐标点plot(x1,y1,c);%根据这些坐标点生成图像,颜色由c决定end三,插值函数1.输出原函数R(x)的代码:x0=-5:0.001:5;y0=create(x0);plot(x0,y0,'b');2.牛顿插值法newton(x0,y0)的代码:输入插值节点和其函数值组成的两个数组(x0,y0)返回插值后多项式表达式function[L]=newton(x0,y0)l=length(x0)-1;%求差商系数,在一个二维的数组中,利用递推关系,生成后面的系数M=zeros(l+1,l+1);M(1:l+1,1)=y0';fork=2:l+1form=2:kM(k,m)=(M(k,m-1)-M(k-1,m-1))/(x0(k)-x0(k-m+1));endendsymsx;%代入系数,生成相应的表达式L=0;fork=1:l+1a=M(k,k);form=1:k-1a=a*(x-x0(m));endL=L+a;endL=expand(L);end3.拉格朗日插值法Lagtange(x0,y0)的代码:输入插值节点和其函数值组成的两个数组(x0,y0),返回插值后多项式表达式function[L]=Lagtange(x0,y0)symsx;l=length(x0);L=0;fori=1:l%依次生成每一项,最后得到其多项式表达式a=y0(i);forj=1:lifi~=ja=expand(a*(x-x0(j))/(x0(i)-x0(j)));endendL=L+a;endL=expand(L);end4.分段线性插值Runge(x0,y0)输入插值节点和其函数值组成的两个数组(x0,y0)。因为这个分段函数相对复杂,就将插值过程与作图过程结合起来。在每一个区间里进行线性插值的到表达式后,直接将绘图所需要的致密的坐标点记录到坐标数组(x1,y1)里,最后直接用plot函数输出图像。function[x1,y1]=Runge(x0,y0)l=length(x0);symsx;x1=x0(1);y1=y0(1);fori=1:l-1xc=x0(i)+0.01:0.01:x0(i+1)-0.01;%生成需要的节点y=y0(i)*(x-x0(i+1))/(x0(i)-x0(i+1))+y0(i+1)*(x-x0(i))/(x0(i+1)-x0(i));%每个区间内的y数表达式x1=[x1xc];y1=[y1subs(y,'x',xc)];%生成相应的坐标点endplot(x1,y1,'r');%一起输出end5.三次Hermite(x0,y0)插值函数输入插值节点和其函数值组成的两个数组(x0,y0),其中c0是在x0点上的函数导数,直接输出图像function[x0,y0]=Hermite(a0,b0,c0)l=length(a0);symsx;x1=a0(1);y1=b0(1);fori=1:l-1%a、b、c、d是其该区间的基函数a=(1+2*(x-a0(i))/(a0(i+1)-a0(i)))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2;b=(1+2*(x-a0(i+1))/(a0(i)-a0(i+1)))*(x-a0(i))^2/(a0(i+1)-a0(i))^2;c=(x-a0(i))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2;d=(x-a0(i+1))*(x-a0(i))^2/(a0(i+1)-a0(i))^2;y=b0(i)*a+b0(i+1)*b+c0(i)*c+c0(i+1)*d;%该区间内的函数表达式xc=a0(i)+0.01:0.01:a0(i+1)-0.01;x1=[x1xc];y1=[y1subs(y,'x',xc)];endplot(x1,y1,'r');end6.自然样条插值函数nature(a0,b0)输入插值节点和其函数值组成的两个数组(x0,y0)和起始与终点处的函数导数。在这个插值方法中,采用自然边界的假定。function[x1,y1]=nature(a0,b0)symsx;l=length(a0);%解出各点的导数mia1(1)=2;d1(1)=3*(b0(2)-b0(1))/(a0(2)-a0(1));h(1)=a0(2)-a0(1);c1(1)=0;a1(l)=2;d1(l)=3*(b0(l)-b0(l-1))/(a0(l)-a0(l-1));b1(l)=1;%采用自然边界条件的假定fori=2:l-1a1(i)=2;h(i)=a0(i+1)-a0(i);c1(i)=h(i-1)/(h(i-1)+h(i));b1(i)=1-c1(i);d1(i)=3*(b1(i)/h(i-1)*(b0(i)-b0(i-1))+c1(i)/h(i)*(b0(i+1)-b0(i)));endr(1)=c1(1)/a1(1);a2(1)=a1(1);fori=2:l-1a2(i)=a1(i)-b1(i)*r(i-1);r(i)=c1(i)/a2(i);enda2(l)=a1(l)-b1(l)*r(l-1);y2(1)=d1(1)/a2(1);fori=2:ly2(i)=(d1(i)-b1(i)*y2(i-1))/a2(i);endc0(l)=y2(l);fori=l-1:-1:1c0(i)=y2(i)-r(i)*y2(i+1);%解除了各点的导数,存在c0数组中endx1(1)=a0(1);y1(1)=b0(1);%代入,之后与Hermite算法类似fori=1:l-1a=(1+2*(x-a0(i))/(a0(i+1)-a0(i)))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2;b=(1+2*(x-a0(i+1))/(a0(i)-a0(i+1)))*(x-a0(i))^2/(a0(i+1)-a0(i))^2;c=(x-a0(i))*(x-a0(i+1))^2/(a0(i)-a0(i+1))^2;d=(x-a0(i+1))*(x-a0(i))^2/(a0(i+1)-a0(i))^2;y=b0(i)*a+b0(i+1)*b+c0(i)*c+c0(i+1)*d;xc=a0(i)+0.01:0.01:a0(i+1)-0.01;x1=[x1xc];y1=[y1subs(y,'x',xc)];endplot(x1,y1,'r');end四、表达式与图像1.原函数R(x)=1/(x*x+1)的图像2.牛顿插值法运行代码x0=-5:5;y0=create(x0);y=newton(x0,y0)output(y,'r');程序输出函数的表达式:y=-x^10/44200+(7*x^8)/5525-(83*x^6)/3400+(2181*x^4)/11050-(149*x^2)/221+1以及图像:将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)3.拉格朗日插值法运行代码:fori=0:20x0(i+1)=5*cos((2*i+1)*pi/42);endy0=create(x0);y=Lagtange(x0,y0);output(y,'r');程序输出函数图像:将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)4.分段线性插值法:运行代码:x0=-5:5;y0=create(x0);Runge(x0,y0);程序输出函数图像:将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)5.三次Hermite插值函数运行代码:x0=-5:5;[y0c0]=create(x0);Hermite(x0,y0,c0);程序输出函数图像:将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)6.自然样条法插值:运行代码:x0=-5:5;[y0c0]=create(x0);nature(x0,y0);程序输出函数图像:将之与R(X)图像放在一起(蓝色代表原函数,红色代表插值结果)五、分析与讨论与原函数的吻合程度由高到低分别是:三次Hermite插值、自然样条插值、20次拉格朗日插值、分段线性插值、10次牛顿插值法。而函数的平滑性上讲只有10次牛顿插值法和分段线性法比较差。下面是我的分析和讨论:1.在10次牛顿插值法中,插值出来的结果与原函数相差甚远,特别是区间边界附近误差非常大。但是在二十次的拉格朗日插值中,虽然在边界上波动仍然存在,其结果在很大的区间里却与原函数拟合得比较好。考虑到两种插值方法在相同插值节点下结果应该是一样的,那结果的差异就来自选取插值节点的选取有关。在拉格朗日插值方法中,选取的节点在边界处较密,而牛顿方法的选点在区间上则是均匀分布,所以两种结果的差异就比较大。这样看来,似乎是只要选点适宜就可以期望得到与原函数比较接近的插值结果。但在实际操作上这却很困难。一方面,对于不同函数,所适宜的选点方法是不一样,另一方面,多数情况下原函数是未知的,而我们所拥有的插值节点的数据也受制于测量条件。总的来说,牛顿插值法和拉格朗日插值法在处理插值问题上还是有局限性和不稳定性的。2.分段线性插值、Hermite插值、自然样条插值得到的结果与原函数都比较接近。相对而言,Hermite吻合得最好,自然样条插值次之,分段线性插值最差。从线条的光滑程度上来讲,Hermite插值和自然样条插值都非常好。从获得信息量的角度上讲,分段线性插值和自然样条法都只得到插值节点的函数值,而Hermite算法则还知道了插值节点的导数,所以Hermite方法和自然样条的插值方法的结果不具有可比性。在相对信息量比较少的情况下,采用自然样条法也是有一种比较好的方法。3.在自然科学的实地测量中,很难保证观测对象的高阶导数连续,或者高阶连续但其收敛性不适用于高阶的牛顿插值和拉格朗日,这个时候采用分段的插值方法往往更接近真实结果。
本文标题:计算方法第一次上机作业
链接地址:https://www.777doc.com/doc-2041778 .html