2016春计算方法实验指导-作业_第1页
2016春计算方法实验指导-作业_第2页
2016春计算方法实验指导-作业_第3页
2016春计算方法实验指导-作业_第4页
2016春计算方法实验指导-作业_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/计算方法实验指导材料目录TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc451616010”第1次解线性方程组的直接解法ﻩPAGEREF_Toc451616010\h—2-HYPERLINK1.1例题 PAGEREF_Toc451616011\h—2-HYPERLINK\l”_Toc451616012"1.2Matlab解线性方程组常用命令介绍 PAGEREF_Toc451616012\h-6-HYPERLINK\l"_Toc451616013”1。3实验作业 PAGEREF_Toc451616013\h—7-HYPERLINK\l”_Toc451616014"第2次解线性方程组的迭代解法ﻩPAGEREF_Toc451616014\h-8—HYPERLINK\l"_Toc451616015"2。1例题ﻩPAGEREF_Toc451616015\h-8—HYPERLINK\l"_Toc451616016"2.2Matlab迭代解法常用函数介绍 PAGEREF_Toc451616016\h-12—HYPERLINK\l"_Toc451616017"2.3实验作业ﻩPAGEREF_Toc451616017\h-12-HYPERLINK\l”_Toc451616018”第3次非线性方程求根 PAGEREF_Toc451616018\h—13-HYPERLINK\l"_Toc451616019”3.1例题ﻩPAGEREF_Toc451616019\h-13-HYPERLINK\l”_Toc451616020”3。2Matlab非线性方程求根的命令ﻩPAGEREF_Toc451616020\h-22-HYPERLINK\l"_Toc451616021"3。3实验作业 PAGEREF_Toc451616021\h—22-HYPERLINK\l"_Toc451616022"第4次插值法ﻩPAGEREF_Toc451616022\h23HYPERLINK\l"_Toc451616023”4。1例题ﻩPAGEREF_Toc451616023\h23HYPERLINK\l"_Toc451616024"4。2Matlab插值函数介绍 PAGEREF_Toc451616024\h29HYPERLINK\l”_Toc451616025"4。3实验作业ﻩPAGEREF_Toc451616025\h30HYPERLINK\l"_Toc451616026"第5次利用最小2乘法进行曲线拟合ﻩPAGEREF_Toc451616026\h31HYPERLINK\l"_Toc451616027”5.1例题ﻩPAGEREF_Toc451616027\h31HYPERLINK\l"_Toc451616028"5。2Matlab数据拟合命令介绍ﻩPAGEREF_Toc451616028\h34HYPERLINK\l”_Toc451616029"5.3实验作业 PAGEREF_Toc451616029\h35HYPERLINK\l"_Toc451616030"第6次数值积分与数值微分 PAGEREF_Toc451616030\h36HYPERLINK\l"_Toc451616031”6.1例题ﻩPAGEREF_Toc451616031\h36HYPERLINK\l”_Toc451616032”6。2Matlab数值积分函数介绍 PAGEREF_Toc451616032\h42HYPERLINK\l"_Toc451616033"6.3实验作业ﻩPAGEREF_Toc451616033\h43第1次解线性方程组的直接解法Gauss消元法算法如下:Gauss列主元消元法算法:在以上的算法中,增加调换行的步骤即可。在每步消元之前要按列选出主元。1。1例题例1.1用Gauss消元法解方程组:解:直接建立求解该方程组的M文件Gauss.m如下%求解例题1.1%高斯法求解线性方程组Ax=b%A为输入矩阵系数,b为方程组右端系数%方程组的解保存在x变量中%先输入方程系数A=[123;275;149];b=[16—3]’;[m,n]=size(A);%检查系数正确性ifm~=nerror('矩阵A的行数和列数必须相同');return;endifm~=size(b)error('b的大小必须和A的行数或A的列数相同’);return;end%再检查方程是否存在唯一解ifrank(A)~=rank([A,b])error('A矩阵的秩和增广矩阵的秩不相同,方程不存在唯一解');return;end%这里采用增广矩阵行变换的方式求解c=n+1;A(:,c)=b;%%消元过程fork=1:n-1A(k+1:n,k:c)=A(k+1:n,k:c)-(A(k+1:n,k)/A(k,k))*A(k,k:c);End%%回代结果x=zeros(length(b),1);x(n)=A(n,c)/A(n,n);fork=n-1:-1:1x(k)=(A(k,c)-A(k,k+1:n)*x(k+1:n))/A(k,k);end%显示计算结果disp('x=');disp(x);直接运行上面的M文件或在Matlab命令窗口中直接输入Gauss即可得出结果。在Matlab命令窗口中输入Gauss得出结果如下:〉〉Gaussx=2.00001.0000-1。0000扩展:Matlab求解线性方程的几种命令如下(方程组的一般形式可用矩阵和向量表示成,但运用下列方法的前提必须保证所求解的方程为恰定方程,即方程组存在唯一解)。运用求逆思想::或;左除法:原理上是运用高斯消元法求解,但Matlab在实际执行过程中是通过分解法进行的(即先将矩阵A作分解,再回代计算):;符号矩阵法:这种计算方法最接近精确值,但计算速度最慢:;将矩阵施行初等行变换化成行简化阶梯形的办法:可以这样实现之:;.上面四种常用的办法示例如下:>>A=[123;275;149]%上面示例方程组系数A=123275149〉〉b=[16-3]'%方程组右端的系数b=16-3>>x1_1=inv(A)*b,x1_2=A^(—1)*b%方法一,求逆思想x1_1=2.00001.0000—1.0000x1_2=2.00001。0000-1.0000>>x2=A\b%方法二,左除思想x2=21-1〉〉x3=sym(A)\sym(b)%方法三,符号法x3=21—1>〉C=[A,b],rref(C)%方法四,行简化阶梯形思想,最后输出结果的一列为解C=12312756149-3ans=10020101001-1例1。2,求.解:输入矩阵:>>x=[10。5-0。3]x=1.00000。5000-0。3000计算其1-范数〉>norm_1=norm(x,1)norm_1=1。8000计算其2—范数>〉norm_2=norm(x)norm_2=1.1576计算其无穷大范数>>norm_inf=norm(x,inf)norm_inf=1还可以计算其无穷小范数(即各分量绝对值中的最小值)>〉norm_minusInf=norm(x,-inf)norm_minusInf=0.3000例1。3设矩阵,求。解:先输入矩阵:〉〉A=[-210;1-21;01—2]A=-2101-2101-2求A的1-范数(列和范数):〉>norm_1=norm(A,1)norm_1=4求解A的无穷大范数(行和范数):>>norm_inf=norm(A,inf)norm_inf=4求A的2-范数(最大特征值):>〉norm_2=norm(A,2)norm_2=3。4142还可以求解A的F—范数:>〉norm_F=norm(A,'fro’)norm_F=4谱半径可以通过按其概念进行计算:对其特征值的绝对值取最大值即可:〉>R_A=max(abs(eig(A)))R_A=3.41421。2Matlab解线性方程组常用命令介绍1.求秩命令rank在解线性方程组时,为了判断是否存在解,我们应先判断矩阵的秩。调用格式为:c=rank(A)2.矩阵零空间向量null当线性方程组的秩时,方程组有无穷多个解,使用x=null(A)可得到满足的一个解向量,可为符号矩阵或数值矩阵:x=null(A)或x=null(sym(A))3.方阵的LU分解命令lu调用格式为:[L,U]=lu(A)L为准下三角矩阵,U为上三角矩阵,满足A=LU.[L,U,P]=lu(A)L为下三角矩阵,U为上三角矩阵,P为变换方阵元素位置的换位阵,满足PA=PL.其它调用格式请用helplu获得更多信息.4.Cholsky分解cholL=chol(A)其中L为一个下三角矩阵,满足.必须为正定矩阵.5。条件数condc=cond(A,p)A可为向量或矩阵,P取值为下列之一:1——向量或矩阵的返回1—条件数.2——返回向量或矩阵的2—条件数。inf——返回向量或矩阵的—条件数.’fro'--返回向量或矩阵的F—条件数。6。奇异值分解svd[U,S,V]=svd(A)将A分解为正交矩阵U,对角矩阵S和正交矩阵V的乘积,使得A=USVT.7.线性方程组的符号解linsolveX=linsolve(A,b)它等价于X=sym(A)\sym(b)。返回方程组的符号解。1。3实验作业实验名称:解线性方程组的列主元素高斯消去法.实验目的:通过数值实验,从中体会解线性方程组选主元的必要性,以及方程组系数矩阵和右端向量的微小变化对解向量的影响.实验内容:解线性方程组:。实验要求:(1)用Matlab语言编写程序,用列主元高斯消去法求解上述方程组,输出Ax=b中矩阵A、b、解向量x及detA.(2)将方程组中系数3.01改为3.00,0。987改为0.990,用列主元高斯消去法求解系数变换后的方程组,输出列主元行交换次序、解向量x及detA,并与=1\*GB2(1)中结果比较.(3)用MATLAB的内部函数inv求出系数矩阵的逆矩阵,再输入命令x=inv(A)*b,即可求出上述各个方程组的解,并与列主元高斯消去法求出的解进行比较,体会选主元的方法具有良好的数值稳定性.用MATLAB的内部函数det求出系数行列式的值,并与(1)、(2)、中输出的系数行列式的值进行比较.

第2次解线性方程组的迭代解法2。1例题Jacobi迭代法算法:流程图如下。高斯-塞德尔迭代算法:计算步骤与流程图与雅可比迭代法大致相同,只是一旦求出变元的某个新值后,就改用新值替代老值进行这一步剩下的计算。例2.1用Jacobi迭代法解以下方程:解:编制迭代计算的M文件程序如下:%Jacobi迭代法求解例3.1%A为方程组的增广矩阵clc;A=[10-2-13;-210—115;-1-2510]MAXTIME=50;%最多进行50次迭代eps=1e-5;%迭代误差[n,m]=size(A);x=zeros(n,1);%迭代初值y=zeros(n,1);k=0;%进入迭代计算disp(’迭代过程X的值情况如下:')disp(’X=');while1disp(x');fori=1:1:ns=0.0;forj=1:1:nifj~=is=s+A(i,j)*x(j);endy(i)=(A(i,n+1)—s)/A(i,i);endendfori=1:1:nmaxeps=max(0,abs(x(i)-y(i)));%检查是否满足迭代精度要求endifmaxeps<=eps%小于迭代精度退出迭代fori=1:1:nx(i)=y(i);%将结果赋给xendreturn;endfori=1:1:n%若不满足迭代精度要求继续进行迭代x(i)=y(i);y(i)=0.0;endk=k+1;ifk〉MAXTIME%超过最大迭代次数退出error(’超过最大迭代次数,退出');return;endend运行该程序结果如下:A=10—2-13-210-115—1-2510迭代过程X的值情况如下:X=0000.30001.50002。00000.80001。76002。66000。91801。92602。86400。97161。97002.95400.98941。98972。98230。99621.99612。99380。99861。99862.99770.99951。99952。99920。99981.99982.99970.99991.99992.99991.00002.00003。00001.00002.00003.0000容易看出迭代计算最后结果为:.例2。2用Gauss-Seidel迭代法计算例2。1并作比较.解:编制求解程序Gauss_Seidel。m如下:%Gauss_Seidel。m%Gauss_Seidel迭代法求解例2。2%A为方程组的增广矩阵clc;formatlong;A=[10—2-13;-210-115;—1-2510][n,m]=size(A);%最多进行50次迭代Maxtime=50;%控制误差Eps=10E—5;%初始迭代值x=zeros(1,n);disp(’x=’);%迭代次数小于最大迭代次数,进入迭代fork=1:Maxtimedisp(x);fori=1:ns=0.0;forj=1:nifi~=js=s+A(i,j)*x(j);%计算和endendx(i)=(A(i,n+1)—s)/A(i,i);%求出此时迭代的值end%因为方程的精确解为整数,所以这里将迭代结果向整数靠近的误差作为判断迭代是否停止的条件ifsum((x—floor(x))。^2)<Epsbreak;end;end;X=x;disp('迭代结果:');Xformatshort;完成后直接在Matlab命令窗口中输入Gauss_Seidel回车后可得到如下结果:〉>Gauss_SeidelA=10—2-13—210-115-1—2510x=0000.30001.56002。68400.88001.9444800000000002.9538720000000000。9842832000000001.9922438400000002。9937541760000000。9978241856000001.9989402547200002。9991409390080000.99971.9998545228697602.9998822381168640.9999591283856381。9999800494888142。9999838454726540。9999943944450281.9999972634362712。9999977842635140.9999992311136061.9999996246490722。9999996960823500。9999998945380491.9999999485158452。9999999583139480。9999999855345641.9999999929383082.9999999942822360.9999999980158851.9999999990314012.9999999992157370。9999999997278541。9999999998671452。9999999998924290。9999999999626721.9999999999817782。9999999999852460。9999999999948801.9999999999975012。9999999999979760.9999999999992981.9999999999996572.9999999999997220。9999999999999041。9999999999999532.9999999999999620.9999999999999871。9999999999999942.9999999999999950.9999999999999981.9999999999999992.9999999999999991。00002。00003.0000迭代结果:X=123可见对此题Gauss_Seidel法的收敛速度还是很快的.2。2Matlab迭代解法常用函数介绍1.计算范数命令normnorm(A,option)当A为向量V时:norm(V,1)为A的1—范数.norm(V,2)或norm(A)为A的1—范数。notm(V,P)=sum(abs(V).^P)^(1/P).norm(V,inf)=max(abs(V))为A的无穷范数.norm(V,—inf)=min(abs(V))为A的最小范数.当A为矩阵A时:norm(A,1)为A的列和范数。norm(A,2)或norm(A)为A的谱范数.norm(A,inf)为A的行和范数。norm(A,'fro')时为A的F—范数.2.计算矩阵的谱半径r=max(abs(eig(A)))2.3实验作业实验名称:解线性方程组的迭代法.实验目的:1.掌握解线性方程组的雅可比迭代和高斯—塞德尔迭代算法;2.培养编程与上机调试能力.实验内容:应用雅可比迭代和高斯—塞德尔迭代算法解线性方程组:实验要求:(1)用Matlab语言编写雅可比(Jacobi)迭代法程序,并且选择不同的迭代次数,观察输出结果;(2)用Matlab语言编写高斯-塞德尔(Gauss—Seidel)迭代法程序,并且选择不同的迭代次数,观察输出结果.ﻬ第3次非线性方程求根二分法:算法流程图迭代法:算法流程图牛顿迭代法:算法流程图3。1例题例3。1判别方程的实根存在区间,要求区间长度不大于1,并求出最小正根的近似值,精度.解:先用画图的方法来粗略估计其根的范围.>>ezplot('x^3-3*x+1');%亦可用fplot命令>〉gridon;观察图可知其根分布区间大概分布在(-2,-1),(0,1)和(1,2)中.编写二分法求解最小正根的近似值程序如下:formatlong;f=inline('x^3-3*x+1’);a=0;b=1;Eps=1E-5;fork=1:50A(k)=a;B(k)=b;ya=feval(f,a);yb=feval(f,b);temp=(a+b)/2;X(k)=temp;yt=feval(f,temp);F(k)=yt;ifabs(yt)〈Epsbreak;endifyt*ya〈0a=a;b=temp;elseifyt*yb<0a=temp;b=b;endend;disp('ka(k)b(k)x(k)f(x)');H=[[1:k]',A’,B',X',F'];disp(H);disp('x=');disp(X(k));disp('y=');disp(yt);formatshort以下为运行结果:ka(k)b(k)x(k)101.00000。5000200.50000。250030.25000.50000。375040。25000。37500.312550。31250。37500.34375000000000060.3437500000000000.37500.35937500000000070。3437500000000000。3593750000000000.350080.3437500000000000.35000.34765625000000090。3437500000000000。3476562500000000.3457100.34570.3476562500000000.346679687500000110.3466796875000000.3476562500000000。347167968750000120。3471679687500000.3476562500000000。347412109375000130.3471679687500000.3474121093750000.347290039062500140。3472900390625000。3474121093750000。347351074218750150.3472900390625000.3473510742187500.347320556640625160。3472900390625000.3473205566406250.3473170。3472900390625000.34730。347297668457031f(x)—0.37500.265625000000000-0。00000。50000.4375-0。9141—0.8740-0.73380。52220.04000。2650—0.44700。9015—0.9678-0.5734-0.0949-0.1613x=0.347297668457031y=—3.464221613125318e-006从结果中分析可得到二分法求解该方程的根为x=0。347297668457031.例3.2采用不同的迭代法,求方程在(1,2)内的近似根.解:构造迭代格式如下:(1)对应求解程序程序编制如下:f=inline(’x-x^3-4*x^2+10')%作内联函数disp('x=');x=feval(f,1.5);%迭代初始值disp(x);i=1;while1%进入迭代i=i+1;x=feval(f,x);disp(x);ifx>1E10;%此为x发散break;end;end;i,x运行结果如下:f=Inlinefunction:f(x)=x—x^3-4*x^2+10x=-0。87506.7324-469。72001.0275e+008—1.0849e+0241.2771e+072i=6x=1.2771e+072迭代6次后x的值大得令人吃惊,表明构造的式子并不收敛.(2):求解程序如下:f=inline(’(10/x-4*x)^(1/2)’)disp(’x=’);x=feval(f,1。5);disp(x);Eps=1E-5;i=1;while1x0=x;i=i+1;x=feval(f,x);disp(x);if~isreal(x)%不是实数不进行迭代break;endifx>1E10;%发散不进行迭代break;end;ifabs(x-x0)〈Epsbreak;endend;i,x运行结果如下:f=Inlinefunction:f(x)=(10/x-4*x)^(1/2)x=0。81652。99690。0000+2。9412ii=3x=0.0000+2。9412i由以上结果可知当进入第三次迭代时,出现了复数,这并不是我们期望的,因此该式并不收敛.(3)程序如下,这里将精度提高至1E-10:formatlong;f=inline('1/2*(10-x^3)^(1/2)')disp('x=');x=feval(f,1.5);disp(x);Eps=1E—10;i=1;while1x0=x;i=i+1;x=feval(f,x);disp(x);if~isreal(x)break;endifx>1E10;break;end;ifabs(x-x0)〈Epsbreak;endend;i,xformatshort;运行上述程序得到如下结果:f=Inlinefunction:f(x)=1/2*(10-x^3)^(1/2)x=1.2869537676233751。45781.3454583740232941.3751702528160381.36331。3678469675921331。3638870038840211.3659167333900401.3648782171936771.3654100611699571.36531。3652772085244791。36521.3652423837188391.3652236802252821。3652332557425001。3652283534626271.3652308632436371。3652295783339591.3652302361581811.3652298993777331.3652300717962911.3652299835246741.3652300287163231。3652300055799501。3652300174248771。3652300113607331.3652300144653401.3652300128759011.3652300136896321.3652300132730341.3652300134863161.3652300133771241。365230013433026i=34x=1.365230013433026从结果可知该式子收敛但速度较慢.(4)程序将上例中的内联函数改为f=inline('(10/(4+x))^(1/2)’)即可,运行结果如下:f=Inlinefunction:f(x)=(10/(4+x))^(1/2)x=1.3483997249264841.3673763719912831.3649570154024871.3652647481134421.3652255941605251.3652305756734341.3652299418781831。3652300225155691.3652300122561221。3652300135614251。3652300133953521.365230013416482i=12x=1。365230013416482从结果中可知该式子收敛很快,只需12次迭代即可达到(3)的精度.(5)仍将(3)中的内联函数替换成f=inline(’x—(x^3+4*x^2-10)/(3*x^2+8*x)'),运行后得到结果如下:f=Inlinefunction:f(x)=x-(x^3+4*x^2—10)/(3*x^2+8*x)x=1。3733333333333331。3652620148746271。3652300139161471.3652300134140971。365230013414097i=5x=1.365230013414097该式子收敛相对(4)式更快,结果也很准确.例3.4用Newton法求在0。7附近的根,计算结果保留6位有效数字。解:构造符号函数:〉〉x=sym('x')〉>f=sym('x*sin(x)-0.5')求符号函数导数>>df=diff(f,x)构造Newton迭代公式>>FX=x-f/df%以下为输入结果x=xf=x*sin(x)-0.5df=sin(x)+x*cos(x)FX=x-(x*sin(x)-.5)/(sin(x)+x*cos(x))进入迭代计算,计算前10次迭代值:formatlong;Fx=inline(FX);x0=0.7;fori=1:10disp(x0);x0=feval(Fx,x0);endx0formatshort;输出x的中间结果为:0。70000.74830。74560。74100。74910.74910.74910.74910.74910.7491x0=0.7491可见法迭代5次即趋于稳定.3。2Matlab非线性方程求根的命令1。代数方程组的求根rootsr=roots(P)P为代数方程的系数向量,从高次到低次排列,该命令只能求出一个一元多项式的根,返回所有复数和实数根.2。求零点fzerox=fzero(F,x0,option)F为函数和字符表达式、内联函数或M文件的函数形式,x0为零点的大概位置,option为可选项,可参阅其他资料得到详细说明。使用该命令前,前配合plot、ezplot和fplot先画出函数图形,再猜测x0的大概值。3求方程组数值解的命令fsolvex=fsolve(’fun’,x0,options)fun为M函数文件名,,它是探索方程的起点,输出为与x0同维的向量或矩阵,是方程组的数值解。对于更详细的设置option,可用helpfsolve获得详细说明。4.非线性方程组的解析解solvesolve('eqn1',’eqn2',…,'eqnN')对N个方程采用默认变量求解.solve('eqn1’,eqn2’,…,'eqnN',’var1,var2,.。,varN')对N个方程的var1,var2,..,varN变量求解.S=solve('eqn1',eqn2',…,'eqnN',’var1','var2',。.,'varN’)对N个方程的var1,var2,..,varN变量求解.[x1,x2,…,xn]=solve('eqn1’,eqn2’,…,'eqnN','var1’,'var2',..,’varN')将求解分别赋给变量x1,x2,…,xn。3.3实验作业实验名称:解非线性方程的迭代法.实验目的:掌握解非线性方程的迭代法;实验内容:求方程的根。实验要求:用牛顿迭代,同样计算到为止.输出迭代初值及各次迭代值和迭代次数.第4次插值法拉格朗日插值:算法流程图4。1例题例4.1已知,用线性插值法求的近似值.解:Matlab中有直接进行线性插值计算的命令interp1,直接使用interp1命令即可.〉>x=[49];>〉y=[23];>〉f=interp1(x,y,7,’linear')%选项使用线性插值f=2.6000故插值计算结果为例4。2,用二次Lagrange插值求的近似值。解:求解过程描述如下:formatlong;%显示15位%输入初始数据x0=[4916];y0=[234];x=7;%插值点n=length(x0);%取长度%初始计算s=0;%进入公式计算forj=0:(n-1)t=1;fori=0:(n—1)ifi~=jt=t*(x—x0(i+1))/(x0(j+1)—x0(i+1));endends=s+t*y0(j+1);ends%显示输出结果formatshort;程序输出结果:s=例4.3设有函数在[-5,5]上取等距节点上进行Lagrange插值.解:采用n次进行插值,为使计算结果可视化,画图显示插值结果,编制如下程序:%输入初始数据clc;x0=—5:5;y0=1./(1+x0.^2);x=-5:0。05:5;%插值计算点m=length(x);fork=1:m%分别对每一点进行插值tx=x(k);%插值点n=length(x0);s=0;%进入迭代计算过程forj=0:(n-1)t=1;fori=0:(n-1)ifi~=jt=t*(tx-x0(i+1))/(x0(j+1)-x0(i+1));endends=s+t*y0(j+1);endyx(k)=s;end%画图显示结果figure;plot(x,yx,':m','LineWidth’,2);holdon;plot(x0,y0,’-r','LineWidth',0。5);gridon;title('Lagrange插值时的Runge振荡现象');xlabel('x轴’);ylabel(’y轴’);legend(’插值曲线’,'原曲线');运行程序输出结果如下:由图可知确实在附近发生了振荡,误差很大。例4。4.设有函数在[—5,5]上取等距节点上进行分段线性插值并且绘制图像。Matlab程序如下Functiony=div_linear(x0,y0,x,n)forj=1:length(x);fori=1:n-1if(x〉=x0(i))&&(x〈=x0(i+1))y=(x—x0(i+1))/(x0(i)-x0(i+1))*y0(i)+(x-x0(i))/(x0(i+1)—x0(i))*y0(i+1);elsecontinue;end%endconditionalstatementendfunctiony=f(x)%原来的函数y=5。/(x。^2+1);x0=—5:1:5;%插值节点w=length(x0);%插值区间长度n=w-1;%节点个数forx=-5:0.01:5%加密了的插值节点y=div_linear(x0,f(x0),x,n);%分段插值后的点的纵坐标holdon;plot(x,y,‘r’);plot(x,f(x),‘b');end运行节点画图如下例4.5设有函数在[-5,5]上取等距节点上进行三次样条插值,并且绘制图像。注解:我没有理解此程序。上实验课程的时候可以选择使用Matlab已经封装了的函数y=spline(x0,y0,x)直接进行计算并且画图.解:%X为1阶导数横坐标向量%Y为1阶导数纵坐标向量%dx0和dxn导数边界条件functionS=csfit(X,Y,dx0,dxn)%3次样条插值函数?N=length(X)—1;H=diff(X);D=diff(Y)./H;A=H(2:N-1);%边界约束B=2*(H(1:N-1)+H(2:N))C=H(2:N);U=6*diff(D);B(1)=B(1)-H(1)/2;U(1)=U(1)-3*(D(1));B(N—1)=B(N-1)—H(N)/2;U(N—1)=U(N—1)—3*(-D(N));fork=2:N-1temp=A(k-1)/B(k—1);B(k)=B(k)-temp*C(k-1);U(k)=U(k)-temp*U(k—1);endM(N)=U(N-1)/B(N-1);fork=N-2:—1:1M(k+1)=(U(k)-C(k)*M(k+2))/B(k);endM(1)=3*(D(1)-dx0)/H(1)—M(2)/2;M(N+1)=3*(dxn—D(N))/H(N)-M(N)/2;fork=0:N—1S(k+1,1)=(M(k+2)-M(k+1))/6*H(k+1);S(k+1,2)=M(k+1)/2;S(k+1,3)=D(k+1)-H(k+1)*(2*M(k+1)+M(k+2))/6;S(k+1,4)=Y(k+1);endclearallclcclfx=-5:1:5;y=5./(x。^2+1);X=-5:1:5;Y=y;dx0=0。142;dxn=-0.142;S=csfit(X,Y,dx0,dxn);x1=-5:0。01:-4;y1=polyval(S(1,:),x1-X(1));x2=-4:0。01:—3;y2=polyval(S(2,:),x2-X(2));x3=-3:0.01:-2;y3=polyval(S(3,:),x3-X(3));x4=—2:0.01:-1;y4=polyval(S(4,:),x4-X(4));x5=-1:0。01:0;y5=polyval(S(5,:),x5—X(5));x6=0:0.01:1;y6=polyval(S(6,:),x6—X(6));x7=1:0.01:2;y7=polyval(S(7,:),x7-X(7));x8=2:0。01:3;y8=polyval(S(8,:),x8-X(8));x9=3:0。01:4;y9=polyval(S(9,:),x9-X(9));x10=4:0。01:5;y10=polyval(S(10,:),x10-X(10));subplot(2,1,1);plot(x1,y1,x2,y2,x3,y3,x4,y4,x5,y5,x6,y6,x7,y7,x8,y8,x9,y9,x10,y10,X,Y,‘*')gridonlegend(‘样条插值');x=-5:1:5;y=1./(x.^2+1);subplot(2,1,2);plot(x,y,‘r’)gridonlegend(‘原来的函数’);4。2Matlab插值函数介绍1.一元函数插值interp1y=interp1(x0,y0,x,'method’)x0和y0为已知的两个同维向量,x为插值点,可为向量和数值或者矩阵,'method'含义如下:’nearest’——最近插值,即用直角折线连接各样本点.’linear'——线性插值,依次边接各样本点,为默认选项。’pchip'(或’cubic’)——分段一次多项式Hermite插值曲线,具有一阶导数连续性.’spline'-—三次样条插值.2。三次插值pchipy=pchip(x0,y0,x)与y=interp1(x0,y0,x,’pchip’)等价。3.三次样条插值spliney=spline(x0,y0,x)它与y=interp1(x0,y0,x,'spline’)等价.4.二维插值interp2z=interp2(x0,y0,z0,x,y,'method')(x0,y0,z0)为原始数据点,x和y为独立变量,'method’的参数与interp1中的相同.本函数主要用于曲面插值.5.其它插值函数三维插值interp3:三维插值函数.interpft():利用FFT(快速傅里叶变换)的一维插值函数。interpn():高维插值函数.csape():可输入边界条件进行插值.4.3实验作业实验名称:插值实验目的:1.学会利用Matlab实现拉格朗日插值;2。学会利用Matlab实现分段线性插值;3.学会比较拉格朗日插值与分段线性插值.实验内容1:已知函数在下列各点的值为试用次拉格朗日插值插值多项式及分段线性插值函数对数据进行插值.用图给出,及.实验内容2:设有函数将[-5,5]4等分,6等分,8等分,10等分(即取等距节点)进行三次样条插值(直接使用4.2中所列的Matlab函数),并且绘制图像。解释插值结果

第5次利用最小2乘法进行曲线拟合5.1例题例5。1设有如下数据:13456789101054211234利用最小二乘法求该组数据的多项式拟合曲线.解:先输入数据并画图判断曲线的大致形状:〉〉x0=1:10;x0(2)=[]x0=1345678910>〉y0=[1054211234]y0=1054211234>>figure,plot(x0,y0,'—r’,’LineWidth',3),gridon,title(’数据观察图');holdon,plot(x0,y0,'og');axis([011011]);观察到图形大概为一条抛物线,因此它的最高次数为2.构造其正规方程的程序如下:x0=1:10;x0(2)=[];%初始数据%x为数据点的横坐标,y为数据点的纵坐标x=x0;y0=[1054211234];y=y0;m=2;%最高次数为2n=length(x);b=zeros(1,m+1);f=zeros(n,m+1);%f为正规方程的系数,初始为0fork=1:m+1f(:,k)=x’.^(k-1);enda=f'*f;b=f’*y';%解方程,得到多项式由高到低的系数所构成的向量cc=a\b;c=flipud(c);disp(c);运行上述程序得到数据的系数如下(从高次到低次排列):0.267570664629484-3.681913。459663865546098至此,得到了二次多项式。画出该2次多项式的图:〉>c=c’;〉〉x=0:0.1:11;〉>F=c(1)*x.^2+c(2)*x+c(3);>〉plot(x0,y0,'ok','LineWidth’,2),gridon;〉〉holdon;>>plot(x,F,'—r',’LineWidth',1);>>title(’拟合后的效果图’);〉〉axis([011011]);拟合后的效果如下(带点的是原始数据,红色的是拟合2次曲线):例5.2设如下数据:00.250。500.751。001.00001.28401.64872.11702.7183求其拟合多项式.解:按解题步骤,先求其一次多项式,由于以下很多拟合都要用到拟合系数,我们把例5。1中的主要部分抽取出来作为函数使用,以节省代码编写量.functionc=mypolyfit(x,y,m)%mypolyfit。m%x为数据点的横坐标%y为数据点的纵坐标%最高次数为m次%返回结果为c,c按次数从高至低排列成向量形式n=length(x);b=zeros(1,m+1);f=zeros(n,m+1);%f为正规方程的系数,初始为0fork=1:m+1f(:,k)=x'.^(k-1);enda=f'*f;b=f'*y';%解方程,得到多项式由高到低的系数所构成的向量cc=a\b;c=flipud(c);%翻转另存为mypolyfit.m后,以下进入拟合阶段:>〉x=0:0。25:1;%输入初始数据〉>y=[11.2841。64872.11702。7183];>>m=1;%先作最高拟合次数为1>〉C=mypolyfit(x,y,m)%得到拟合多项式系数C=1.70010.899680000000000>>plot(x,y,'ok’,’LineWidth’,2);%画出拟合的效果图〉〉gridon;>〉title('最小二乘一次拟合效果图');〉>x0=0:0.1:1;〉>y0=C(1).*x0+C(2);>〉holdon,plot(x0,y0,’-r');最小二乘的一次拟合效果如下:>>m=2;%改为拟合二次多项式>>C=mypolyfit(x,y,m)%求出拟合系数C=0.8436571428571340.86471。0052>〉figure;%画图得到拟合的效果图>〉plot(x,y,’ok','LineWidth',2);〉>gridon;>>title(’最小二乘二次拟合效果图');>>x0=0:0.1:1;>〉y0=C(1).*x0。^2+C(2).*x0+C(3);〉>holdon,plot(x0,y0,’-r');最小二乘的二次拟合效果如下:5.2Matlab数据拟合命令介绍1.数据的多项式曲线拟合polyfitp=polyfit(x,y,m)x,y为样本点数据,m为拟合的最高次数,p为拟合的多项式.求出拟合系数后,可配合polyval(p,x0)计算多项式在x0的值,x0可为向量或数值.另外还可用poly2str(p)将表达式的形式显示出来。以下再介绍几个与多项式有关的命令.2.多项式创建polyp=poly(A)将向量A转化为多项式.3.多项式转换poly2strpoly2str(p,'t')将多项式的数学形式恢复出来.4.多项式运算conv(p1,p2)返回p1和p2的乘积.[q,r]=deconv(p1,p2)q为p1除以p2的商多项式系数,r为余数.k=polyder(p)多项式求导.polyval(p,x0)求多项式p在x0点的值,x0可为一个数值或向量。5。Matlab的非线性拟合命令isqcurvefit():该函数位于优化工具箱内.isqnolin():位于优化工具箱内.nlinfit():位于统计工具箱内.5。3实验作业实验名称:最小二乘法实验目的:学会利用Matlab实现最小二乘法.实验内容:设有观察数据-2.0-1.5-1.0—0。500.511。52.09。125.582.961。471.01.513.05.4969.19用最小二乘法求出合适的拟合曲线,并且画出图。第6次数值积分复化梯形公式:算法流程图复合辛普生公式:算法流程图变步长梯形公式:算法流程图6.1例题例6.1给定积分,分别用梯形公式、公式、公式作近似计算.解:先输入主要初始参数〉>a=0.5;〉>b=1;>>f=inline('x^(1/2)’);%梯形公式〉>I1=(b-a)/2*(feval(f,a)+feval(f,b))I1=0.426776695296637%simpson公式>〉I2=(b—a)/6*(feval(f,a)+4*feval(f,(a+b)/2)+feval(f,b))I2=0。4325%Cotes公式(n=4)〉>tc=0;>〉C0=[73212327];>>fori=0:4tc=tc+C0(i+1)*feval(f,a+i*(b—a)/4);end>>I3=(b—a)/90*tcI3=0.4376%准确值>>I=int(char(f),a,b)〉〉vpa(I)I=—1/6*2^(1/2)+2/3ans=0.4354596505例6.2对积分,为使其精度达到.若用复化梯形公式,应将[0,1]多少等分?若用复化公式,应将[0,1]多少等分?解:直接按余项计算即可。复化梯形公式的余项为::复化公式余项为:对于,在数学分析中,我们已证得以下不等式成立:.直接利用上述不等式关系解答本题.先输入误差精度:>〉Eps=1E-4Eps=1.0000e-004复化梯形公式>〉h1=sqrt(Eps/abs(—(1-0)/12*1/(2+1)))%先求出步长h1=0.0000>〉N1=ceil(1/h1)%向上取整,得到等分区间数N1=17故可将区间17等分即可达到所要求的精度.(2)复化公式〉>h2=power(Eps/abs(-(1-0)/180*1/(1+4)),1/4)%先求出步长h2=0。547722557505166>>N2=ceil(1/h2)%向上取整,得到等分区间数N2=2故可将区间2等分即可达到所要求的精度.扩展:Matlab中复化梯形公式命令为I=trapz(x,y),复化公式命令为quad().Matlab中有四个取整函数,分别为ceil(),floor(),fix(),round(),分别表示向正无穷大方向取整、向负无穷大方向取整、向靠近零方向舍入和四舍五入.例6。3对积分,利用变步长方法求其近似值,使其精度达到.解:利用变步长法前,先建立三种变步长复化积分公式的函数.注意在Matlab中直接用sin(0)/0得不到1,,因此解此题时,我们改用求极限的方法得到函数值,此函数名为limit()。先建立三种复化公式的函数文件,它们分别为复化梯形公式trap。m、复化公式为simpson。m、公式为cotes.m,三个函数的源程序如下:复化梯形公式trap。mfunctionT=trap(f,a,b,n)%复化梯形公式求积分值%f为积分函数%[a,b]为积分区间%n是等分区间份数h=(b-a)/n;%步长T=0;fork=1:(n-1)x0=a+h*k;T=T+limit(f,x0);endT=h*(limit(f,a)+limit(f,b))/2+h*T;T=double(T);(2)复化公式simpson。m:functionS=simpson(f,a,b,n)%Simpson公式求积分值%f为积分函数%[a,b]为积分区间%n是等分区间份数h=(b—a)/(2*n);%步长s1=0;s2=0;fork=1:nx0=a+h*(2*k—1);s1=s1+limit(f,x0);endfork=1:(n-1)x0=a+h*2*k;s2=s2+limit(f,x0);endS=h*(limit(f,a)+limit(f,b)+4*s1+2*s2)/3;S=double(S);(3)复化公式cotes。m:functionC=cote(f,a,b,n)%复化cotes公式求积分值%f为积分函数%[a,b]为积分区间%n是等分区间份数h=(b—a)/n;%步长C=0;fori=1:(n-1)x0=a+i*h;C=C+14*limit(f,x0);endfork=0:(n—1)x0=a+h*k;s=32*li

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论