Matlab(R2009a版)-第8讲 计算方法的MATLAB实现

  • 格式:pps
  • 大小:2.18 MB
  • 文档页数:169

MATLAB2009从入门到精通2013-7-222课程主要内容•第1章MATLAB简介•第2章数值运算•第3章单元数组和结构•第4章字符串•第5章符号运算•第6章MATLAB绘图基础•第7章程序设计•第8章计算方法的MATLAB实现•第9章优化设计•第10章SIMULINK仿真初探2013-7-223第8章计算方法的MATLAB实现•随着计算机的迅速发展与广泛运用,在众多的领域,科学计算方法的应用越来越广泛了,而MATLAB在进行科学计算方面有着无与伦比的优势。本章介绍MATLAB在计算方法中的运用。2013-7-2248.1 方程求根•roots见多项式求根;roots(多项式系数矩阵)•fzero可求解非线性方程,它的格式为:•fzero(‘function’,x0)•其中function为求解的方程,x0为估计的根,x0可为标量或长度为2的向量,为向量时函数的两端的值应该符号相反,此时求区间上的解。只能求解x0附近的一个解。即使在某个区间内有多个解,但是区间端点符号相同的话仍然出错。2013-7-225程序实例•>> fzero('x^3-3*x-1',2)•ans =•1.8794•>> fzero('x^3-3*x-1',[1,4])•ans =•1.8794•>> fzero('x^3-3*x-1',[2,4])•??? Error using ==> fzero•The function values at the interval endpoints must differ in sign.2013-7-226程序实例•>> fzero('x^2-3*x+2',0)•ans =•1.0000•>> fzero('x^2-3*x+2',3)•ans =•2.0000•>> fzero('x^2-3*x+2',[0,4])•??? Error using ==> fzero•The function values at the interval endpoints must differ in sign.2013-7-2278.2 线性方程组数值解法•线性方程组的求解不仅在工程技术领域涉及到,而且在其他的许多领域也经常碰到,因此这是一个应用相当广泛的课题。•关于线性方程组的数值解法一般分为两类:一类是直接法,就是在没有舍入误差的情况下,通过有限步四则运算求得方程组准确解的方法。另一类是迭代法,就是先给定一个解的初始值,然后按一定的法则逐步求出解的各个更准确的近似值的方法。2013-7-2288.2.1 直接解法•关于线性方程组的直接解法有许多种,比如Gauss消去法、列主元消去法、平方根法等。而在MATLAB中,线性方程组的直接解法只需用符号“/”或“\”就解决问题。还可以使用逆阵函数来求解:x=inv(A)*B。2013-7-229程序实例•求解下列方程组615318153312321321321xxxxxxxxx2013-7-2210程序实例•>> a=[12 -3 3;-18 3 -1;1 1 1];•>> b=[15;-15;6];•>> x1=a\b•x1 =•1.0000•2.0000•3.0000•>> x2=inv(a)*b•x2 =•1•2•32013-7-22118.2.2 线性方程组求解中的变换•上三角变换•U=triu(x)返回矩阵x的上三角部分;•U=triu(x,k)返回第k条对角线以上部分的元素。2013-7-2212程序实例•>> a=[12 -3 3;-18 3 -1;1 1 1];•>> triu(a)•ans =•12 -3 3•0 3 -1•0 0 12013-7-2213•>> triu(a,1)•ans =•0 -3 3•0 0 -1•0 0 0•>> triu(a,-1)•ans =•12 -3 3•-18 3 -1•0 1 1程序实例2013-7-2214•下三角变换•U=tril(x)返回矩阵x的下三角部分;•U=tril(x,k)返回第k条对角线以上下部分的元素。2013-7-2215程序实例•>> a=[12 -3 3;-18 3 -1;1 1 1];•>> tril(a)•ans =•12 0 0•-18 3 0•1 1 12013-7-2216程序实例•>> tril(a,1)•ans =•12 -3 0•-18 3 -1•1 1 1•>> tril(a,-1)•ans =•0 0 0•-18 0 0•1 1 02013-7-2217•对角变换•U=diag(x)返回矩阵x主对角线上的元素,返回结果是一列向量形式;•U=diag(x,k)返回第k条对角线上的元素值。•当x为向量时生成矩阵。2013-7-2218程序实例•>> a=[12 -3 3;-18 3 -1;1 1 1];•>> diag(a)•ans =•12•3•12013-7-2219程序实例•>> a=[12 -3 3;-18 3 -1;1 1 1];•>> diag(a,1)•ans =•-3•-1•>> diag(a,-1)•ans =•-18•12013-7-22208.2.3 迭代解法•迭代解法非常适用于求解大型稀疏系数矩阵的方程组,在线性方程组常用的迭代解法主要有Jacobi迭代法、Gauss-Seidel迭代法。2013-7-2221Jacobi迭代法2013-7-2222Jacobi.m•function s=jacobi(a,b,x0,eps)•%jacobi迭代法皆线性方程组•%a为系数矩阵,b为方程组ax=b中的右边的矩阵b,x0为迭代初值•if nargin==3•eps=1.0e-6;•elseif nargin<3•error•return•end2013-7-2223•D=diag(diag(a));%求出对角矩阵•D=inv(D);%求出对角矩阵的逆•L=tril(a,-1);%求出严格下三角矩阵•U=triu(a,1);%求出严格上三角矩阵•B=-D*(L+U);•f=D*b;•s=B*x0+f;•while norm(s-x0)>=eps•x0=s;•s=B*x0+f;•end•return2013-7-2224程序实例•用上面编写的jacobi函数求解下列方程组1052151023210321321321xxxxxxxxx2013-7-2225程序实例•>> a=[10 -2 -1;-2 10 -1;-1 -2 5];•>> b=[3 15 10]';•>> x=jacobi(a,b,[0 0 0]',eps)•x =•1•2•32013-7-2226Gauss-Saidel迭代法2013-7-2227gauss.m•function s=gauss(a,b,x0,eps)•%gauss-seidel迭代法皆线性方程组•%a为系数矩阵,b为方程组ax=b中的右边的矩阵b,x0为迭代初值•if nargin==3•eps=1.0e-6;•elseif nargin<3•error•return•end2013-7-2228•L=tril(a,-1);%求出严格下三角矩阵•D=diag(diag(a));%求出对角矩阵•U=triu(a,1);%求出严格上三角矩阵•C=inv(D+L);•B=-C*U;•f=C*b;•s=B*x0+f;•while norm(s-x0)>=eps•x0=s;•s=B*x0+f;•end•return2013-7-2229程序实例•用上面编写的gauss函数求解下列方程组105210226210321321321xxxxxxxxx2013-7-2230程序实例•>> a=[10 -2 -1;-2 2 -1;-1 -2 5];•>> b=[6;10;10];•>> x=gauss(a,b,[0 0 0]',eps)•x =•4•13•82013-7-22318.3 非线性方程组数值解法•与线性方程组的求解一样,非线性方程组的求解也是应用很广泛的课题。一般情况,非线性方程组的数据值解法主要采用迭代法来求解。比较常用的迭代法主要有不动点迭代法、Newton迭代法、拟Newton迭代法等几种方法。2013-7-2232不动点迭代法2013-7-2233staticiterate.m•function s=staticiterate(x,eps)•%不动点迭代法解非线性方程组,x为迭代初值,eps为允许误差•if nargin==1•eps=1.0e-6;•elseif nargin<1•error•return•end2013-7-2234•xx=fx(x);%第一次迭代•while norm(xx-x)>=eps•x=xx;•xx=fx(x);•end•s=xx;•return2013-7-2235程序实例•用不动点迭代法求解下面的方程组081008102122122121xxxxxxx2013-7-2236fx.m•首先编写上述非线性方程组的M文件fx.m•function y=fx(x)•y(1)=0.1*(x(1)*x(1)+x(2)*x(2)+8);•y(2)=0.1*(x(1)*x(2)*x(2)+x(1)+8);•y=[y(1) y(2)];2013-7-2237程序实例•>> x=staticiterate([0 0])•x =•1.0000 1.00002013-7-2238Newton迭代法2013-7-2239newtoniterate.m•function s=newtoniterate(x,eps)•%newton迭代法解非线性方程组,x为迭代初值,eps为允许误差•if nargin==1•eps=1.0e-6;•elseif nargin<1•error•return•end2013-7-2240•x1=fx1(x);%非线性方程组•x2=-dfx1(x);%非线性方程组导数•x3=inv(x2);•x0=x3*x1';•while norm(x0)>=eps•x=x0'+x;•x1=fx1(x);•x2=-dfx1(x);•x3=inv(x2);•x0=x3*x1';•end•s=x0'+x;•return2013-7-2241程序实例•用上面编写的newton迭代函数求解下列方程组081008102122122121xxxxxxx2013-7-2242fx1.m和dfx1.m•首先,编写上述非线性方程组的M文件fx1.m•function y=fx1(x)•y(1)=x(1)*x(1)-10*x(1)+x(2)*x(2)+8;•y(2)=x(1)*x(2)*x(2)-10*x(2)+x(1)+8;•y=[y(1) y(2)];•然后,编写上述非线性方程组导数的M文件dfx1.m•function y=dfx1(x)•y(1)=2*x(1)-10;•y(2)=2*x(2);•y(3)=x(2)*x(2)+1;•y(4)=2*x(1)*x(2)-10;•y=[y(1) y(2);y(3) y(4)];2013-7-2243程序实例•>> x=newtoniterate([0 0])•x =•1 12013-7-22448.4 插值与拟合•在生产实践及科学实验中,插值与拟合的应用非常广泛。下面,就对如何用MATLAB来处理插值与拟合作一介绍。2013-7-22458.4.1 一维插值•yi=interp1(x,y,xi)返回在插值向量xi处的函数向量yi,它是根据向量x和y插值而来。如y是矩阵,则对y每一列进行插值,如xi中元素不在x内,返回NaN。•yi=interp1(y,xi)省略x,表示x=1:N,此时N为向量y的长度或为矩阵y的行数。•yi=interp1(x,y,xi,’method’)表示用method指定的插值方法进行插值。