第七章微积分的数值计算精选PPT.ppt
第七章微积分的数值计算第1页,本讲稿共33页 7.1 数值微分数值微分 实际问题常需计算函数的导数或积分值。但很多情况下,函数关系难以准确表示;即使能使用解析式准确表示,表示式却很复杂,不能用于实际计算。本章介绍数值计算导数或积分的实用方法。第2页,本讲稿共33页7.1.1 差分和差商差分和差商 根据导数的定义其中,x和y分别称为自变量x和因变量y的增量,也称之为差分。可以用差分的商 作微商(导数)的近似。数值微分就是用函数值的线性组合近似函数在某点的导数值。自变量x的步长一般取定值。首先在xi处对函数进行泰勒展开,第3页,本讲稿共33页 根据不同的组合方式可以得到精度不同的差分公式。以函数的一阶导数为例:微分公式微分公式表达式表达式截断误差截断误差两点前向O(x)两点后向O(x)三点中心O(x2)三点前向O(x2)三点后向O(x2)五点中心O(x4)第4页,本讲稿共33页精度为O(X2)的高阶中心差分算法精度为O(X4)的高阶中心差分算法第5页,本讲稿共33页7.1.2 数值微分的实现数值微分的实现 在MATLAB中,没有直接提供求数值导数的函数,只有计算向前差分的函数diff和梯度函数gradient。diff调用格式为:调用格式为:Dy=diff(Y):计算向量Y的向前差分,并把结果赋值给向量Dy Dy(i)=Y(i+1)-Y(i),i=1,2,n-1。注意向量Dy元素个数比Y少Dy=diff(Y,n):计算向量Y的n阶向前差分。例如,diff(Y,2)=diff(diff(Y)=DX(i+1)-DX(i)=Y(i+2)-2Y(i+1)+Y(i),i=1,2 n-2。DX=diff(A,n,dim):计算矩阵A的n阶差分,dim=1时(缺省状态),按列计算差分;dim=2,按行计算差分。第6页,本讲稿共33页 A=pascal(4)A=1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 B=diff(A)B=0 1 2 3 0 1 3 6 0 1 4 10 C=diff(A,2)C=0 0 1 3 0 0 1 4 D=diff(A,1,1)D=0 1 2 3 0 1 3 6 0 1 4 10 E=diff(A,1,2)E=0 0 0 1 1 1 2 3 4 3 6 10第7页,本讲稿共33页7.1.3 近似梯度函数近似梯度函数gradient的调用格式为的调用格式为Fx,Fy=gradient(F,hx,hy)求矩阵F,求其x(行)方向的数值梯度Fx和y(列)方向的数值梯度Fy,x方向步长全为hx,y方向步长全为hy。Fx相当于偏导数F/x,Fy相当于偏导数F/y。Fx,Fy=gradient(F,h)求矩阵F,求其x(行)方向的数值梯度Fx和y(列)方向的数值梯度Fy,各个方向步长全为h。Fx=gradient(F)如果F是向量,直接求其数值梯度;如果F是矩阵,求其x(行)方向的数值梯度,步长为1。Fx,Fy=gradient(F)求矩阵F,求其x(行)方向的数值梯度Fx和y(列)方向的数值梯度Fy,步长为1第8页,本讲稿共33页 X=1 3 5 2 4;Y=gradient(X)Y=2.0000 2.0000 -0.5000 -0.5000 2.0000 Y=gradient(X,2)Y=1.0000 1.0000 -0.2500 -0.2500 1.0000即两边用前向和后向差分,中间用中心差两边用前向和后向差分,中间用中心差分分 A=pascal(4)A=1 1 1 1 1 2 3 4 1 3 6 10 1 4 10 20 Fx,Fy=gradient(A)Fx=0 0 0 0 1.0000 1.0000 1.0000 1.0000 2.0000 2.5000 3.5000 4.0000 3.0000 4.5000 8.0000 10.0000Fy=0 1.0000 2.0000 3.0000 0 1.0000 2.5000 4.5000 0 1.0000 3.5000 8.0000 0 1.0000 4.0000 10.0000第9页,本讲稿共33页7.1.4 拉普拉斯算子拉普拉斯算子4*del2由于内部算法的原因:U=4*del2(v,h),对1维向量v以步长h求拉普拉斯算子时,返回一相同维数的向量U,且默认的步长为1。U=4*del2(v,h1,h2),对矩阵v,横向(x方向)以步长h1,纵向(y方向)以步长 h2计算拉普拉斯算子。第10页,本讲稿共33页 4*del2(U)ans=4 4 4 4 4 4 4 4 4 4 4 4x,y=meshgrid(1:4,1:3);U=x.*x+y.*yU=2 5 10 17 5 8 13 20 10 13 18 25第11页,本讲稿共33页7.2 数值积分数值积分7.2.1 数值积分基本原理数值积分基本原理 我们知道,定积分是求和式的极限,即 。它的几何意义是曲边梯形的面积。从定义可知,定积分的基本分析方法是四步,即分割、近似、求和、取极限。分割就是把总量(整块曲边梯形面积)分成若干分量(小曲边梯形面积);近似就是在每个分量中用容易计算的量去代表;求和就是把分量加起来得到总近似值;最后取极限就得到积分精确值。第12页,本讲稿共33页把区间a,b分割成n等分,像这样取定步长算积分的方法,称为定步长积分法法。常见的低阶求积分公式常见的低阶求积分公式复化矩形公式复化的梯形公式 复化的辛普森(Simpson)公式 第13页,本讲稿共33页辛普森公式的几何意义辛普森公式的几何意义 第14页,本讲稿共33页7.2.2 变步长积分法变步长积分法 计算积分,可以采取逐步缩小步长h的办法。即先任取步长h进行计算,然后取较小步长 h 进行计算,如果两次计算结果相差较大,则取更小步长进行计算,如此下去,直到相邻两次计算结果相差不大为止,取最小步长算出的结果作为积分值。这种方法称为变步长积分法。利用两种步长计算积分时,通常取h=h/2。而每次改变步长后,只需计算新增节点处的函数值,将它们的和乘新步长。第15页,本讲稿共33页MATLAB常用的数值积分函数参数名参数名功能描述功能描述quad一元函数的数值积分,采用变步长辛普森Simpson法(低阶)quadl一元函数的数值积分,采用变步长洛巴托Lobatto法(高阶)qualv一元函数的矢量数值积分dbquad二重积分(默认值为Simpson法)triplequad三重积分(默认值为Simpson法)第16页,本讲稿共33页 7.2.3 一元函数的数值积分举例一元函数的数值积分举例求定积分1.建立匿名函数建立匿名函数 f=(x)x./(x.2+1);2.用用sum函数实现复化矩形法求积函数实现复化矩形法求积x=0:0.001:1;%步长提高到0.001 y=f(x);sum(y)*0.001ans=0.3468 x=0:0.01:1;%步长0.01 y=f(x);sum(y)*0.01ans=0.3491 第17页,本讲稿共33页3.用用trapz函数实现复化梯形法求积函数实现复化梯形法求积x=0:0.001:1;y=f(x);y=trapz(y)*0.001y=0.3466x=0:0.01:1;y=f(x);y=trapz(y)*0.01y=0.3466第18页,本讲稿共33页4.用用MATLAB函数求定积分函数求定积分用quad实现变步长辛普森法求定积分。调用格式为 quad(fun,a,b,tol)其中fun为积分函数,a,b为积分区间,tol为积分的误差阈值,默认值为1e-6quad(f,0,1)ans=0.3466用quadl实现变步长洛巴托求定积分。调用格式为 quadl(fun,a,b,tol)其中fun为积分函数,a,b为积分区间,tol为积分的误差阈值,默认值为1e-6 quadl(f,0,1)ans=0.3466第19页,本讲稿共33页7.2.4 矢量积分矢量积分相当于多个一元定积分。例如求y=(x,n)1./(sqrt(2*pi).*(1:n).*exp(-x.2./(2*(1:n).2);%归一化高斯函数quadv(x)y(x,5),-1,1)ans=0.6827 0.3829 0.2611 0.1974 0.1585矢量积分的结果是一个向量,每一个元素为一个一元函数定积分的值。第20页,本讲稿共33页7.2.5 二重定积分的数值求解二重定积分的数值求解 使用MATLAB提供的dblquad函数就可以直接求出上述二重定积分的数值解。该函数的调用格式为:dblquad(f,a,b,c,d,tol,method)该函数求f(x,y)在a,bc,d区域上的二重定积分。参数tol,可以采用method=quadl的方法使函数用高阶的洛巴托法计算定积分。第21页,本讲稿共33页例如计算 f=(x,y)exp(-x.2-y.2)/pi;%归一化高斯函数dblquad(f,-1,1,-1,1,1e-6,quadl)ans=0.7101三重积分函数triplequad用法与二重积分类似第22页,本讲稿共33页7.3 常微分方程的数值解法常微分方程的数值解法7.3.1 常微分方程初值问题的数值解法常微分方程初值问题的数值解法一般形式为所谓的数值解法就是求解y(x)在 区间的近似值yn的方法,yn(n=1,2,N)称为常微分方程的数值解。自变量x的步长一般为定值h。第23页,本讲稿共33页7.3.2 常见的数值方法常见的数值方法向前欧拉公式向后欧拉公式梯形公式改进的欧拉公式第24页,本讲稿共33页 7.3.3 龙格库塔法简介龙格库塔法简介 基本思想就是利用在某些点处的值的线性组合构造公式,使其按泰勒展开后与初值问题的解的泰勒展开式比较,有尽可能多的相同项,从而保证算式有较高的精度。常用的四阶经典的龙格-库塔公式第25页,本讲稿共33页7.3.4 龙格库塔法的实现龙格库塔法的实现求解器求解器ODE类型类型特点特点精度精度说明说明ode45非刚性一步算法(只需前一步的结果),4,5阶 Runge-Kutta方法。中大部分场合的首选算法ode23非刚性一步算法,2,3阶Runge-Kutta方法。低使用于精度较低的情形ode113非刚性多步法(需要前几布的结果),Adams算法。低高计算时间比ode45短ode23t适度刚性 采用梯形算法适度刚性情形ode15s刚性多步法,Gears反向数值积分。低中若ode45失效时,可尝试使用ode23s刚性一步法,2阶Rosebrock算法精度。低当精度较低时,计算时间比ode15s短第26页,本讲稿共33页 对于一个常微分方程组,如果其解相差十分悬殊,就称之为刚性方程组刚性方程组。对于刚性方程组,为了保持解法的稳定,步长选取十分困难,有些解法不再适用。ode函数调用格式:t,y=ode ij(odefun,tspan,y0)t,y=ode ij(odefun,tspan,y0,options)t,y=ode ij(odefun,tspan,y0,options,p1,p2,.)t,y,te,ye,ie=odeij(odefun,tspan,y0,options,p1,p2,.)odefun为显式常微分方程中的 f(xn,yn),tspan为求解区间,y0为初始条件。第27页,本讲稿共33页7.3.5 求解多变量一阶常微分方程组。求解多变量一阶常微分方程组。例:求解下面的混沌理论的洛仑兹方程。第28页,本讲稿共33页编写lorfun.m如下:function ydot=lorfun(t,y)ydot=-8/3*y(1)+y(2)*y(3);-10*y(2)+10*y(3);-y(2)*y(1)+35*y(2)-y(3);建立lor.m文件t,y=ode23(lorfun,0,20,0,0,eps);plot3(y(:,1),y(:,2),y(:,3)grid on书中第83页表4-6第29页,本讲稿共33页7.3.6 求解高阶常微分方程求解高阶常微分方程可以先把其转化为一阶常微分方程组第30页,本讲稿共33页例例令令则则第31页,本讲稿共33页首先编写首先编写vdp.m如下:如下:function fy=vdp(x,y)%注意表示一个微分方程组的函数必须有自变量和因变量两个输入变量注意表示一个微分方程组的函数必须有自变量和因变量两个输入变量(向量向量)。fy=y(2);7*(1-y(1).2).*y(2)-y(1);计算微方程组计算微方程组y0=1;0;x,y=ode45(vdp,0,40,y0);%x 为程序在计算过程中所取的步长,y(:,1)=y,y(:,2)=y,y(:,3)=y”y=y(:,1);dy=x(:,2);plot(x,y,x,dy,r)第32页,本讲稿共33页第33页,本讲稿共33页