1、第三章 微积分问题的计算机求解 微积分问题的解析解微积分问题的解析解 函数的级数展开与级数求和问题求解函数的级数展开与级数求和问题求解 数值微分数值微分 数值积分问题数值积分问题 曲线积分与曲面积分的计算曲线积分与曲面积分的计算3.1 微积分问题的解析解 3.1.1 极限问题的解析解 单变量函数的极限 格式1:L=limit(fun,x,x0)格式2:L=limit(fun,x,x0,left 或 right)例:试求解极限问题 syms x a b;f=x*(1+a/x)x*sin(b/x);L=limit(f,x,inf)L=exp(a)*b 例:求解单边极限问题 syms x;limit
2、(exp(x3)-1)/(1-cos(sqrt(x-sin(x),x,0,right)ans=12 在(-0.1,0.1)区间绘制出函数曲线:x=-0.1:0.001:0.1;y=(exp(x.3)-1)./(1-cos(sqrt(x-sin(x);Warning:Divide by zero.(Type warning off MATLAB:divideByZero to suppress this warning.)plot(x,y,-,0,12,o)多变量函数的极限:格式:L1=limit(limit(f,x,x0),y,y0)或 L1=limit(limit(f,y,y0),x,x0)
3、如果x0 或y0不是确定的值,而是另一个变量的函数,如x-g(y),则上述的极限求取顺序不能交换。例:求出二元函数极限值 syms x y a;f=exp(-1/(y2+x2)*sin(x)2/x2*(1+1/y2)(x+a2*y2);L=limit(limit(f,x,1/sqrt(y),y,inf)L=exp(a2)3.1.2 函数导数的解析解 函数的导数和高阶导数 格式:y=diff(fun,x)%求导数(默认为1阶)y=diff(fun,x,n)%求n阶导数 例:一阶导数:syms x;f=sin(x)/(x2+4*x+3);f1=diff(f);pretty(f1)cos(x)sin
4、(x)(2 x+4)-2 2 2 x +4 x+3 (x +4 x+3)原函数及一阶导数图:x1=0:.01:5;y=subs(f,x,x1);y1=subs(f1,x,x1);plot(x1,y,x1,y1,:)更高阶导数:tic,diff(f,x,100);tocelapsed_time=4.6860 原函数4阶导数 f4=diff(f,x,4);pretty(f4)2 sin(x)cos(x)(2 x+4)sin(x)(2 x+4)-+4-12-2 2 2 2 3 x +4 x+3 (x +4 x+3)(x +4 x+3)3 sin(x)cos(x)(2 x+4)cos(x)(2 x+4
5、)+12-24-+48-2 2 2 4 2 3 (x +4 x+3)(x +4 x+3)(x +4 x+3)4 2 sin(x)(2 x+4)sin(x)(2 x+4)sin(x)+24-72-+24-2 5 2 4 2 3 (x +4 x+3)(x +4 x+3)(x +4 x+3)多元函数的偏导:格式:f=diff(diff(f,x,m),y,n)或 f=diff(diff(f,y,n),x,m)例:求其偏导数并用图表示。syms x y z=(x2-2*x)*exp(-x2-y2-x*y);zx=simple(diff(z,x)zx=-exp(-x2-y2-x*y)*(-2*x+2+2*
6、x3+x2*y-4*x2-2*x*y)zy=diff(z,y)zy=(x2-2*x)*(-2*y-x)*exp(-x2-y2-x*y)直接绘制三维曲面 x,y=meshgrid(-3:.2:3,-2:.2:2);z=(x.2-2*x).*exp(-x.2-y.2-x.*y);surf(x,y,z),axis(-3 3-2 2-0.7 1.5)contour(x,y,z,30),hold on%绘制等值线 zx=-exp(-x.2-y.2-x.*y).*(-2*x+2+2*x.3+x.2.*y-4*x.2-2*x.*y);zy=-x.*(x-2).*(2*y+x).*exp(-x.2-y.2-x
7、.*y);%偏导的数值解 quiver(x,y,zx,zy)%绘制引力线 例 syms x y z;f=sin(x2*y)*exp(-x2*y-z2);df=diff(diff(diff(f,x,2),y),z);df=simple(df);pretty(df)2 2 2 2 2 -4 z exp(-x y-z)(cos(x y)-10 cos(x y)y x +4 2 4 2 2 4 2 2sin(x y)x y+4 cos(x y)x y -sin(x y)多元函数的Jacobi矩阵:格式:J=jacobian(Y,X)其中,X是自变量构成的向量,Y是由各个函数构成的向量。例:试推导其 J
8、acobi 矩阵 syms r theta phi;x=r*sin(theta)*cos(phi);y=r*sin(theta)*sin(phi);z=r*cos(theta);J=jacobian(x;y;z,r theta phi)J=sin(theta)*cos(phi),r*cos(theta)*cos(phi),-r*sin(theta)*sin(phi)sin(theta)*sin(phi),r*cos(theta)*sin(phi),r*sin(theta)*cos(phi)cos(theta),-r*sin(theta),0 隐函数的偏导数:格式:F=-diff(f,xj)/d
9、iff(f,xi)例:syms x y;f=(x2-2*x)*exp(-x2-y2-x*y);pretty(-simple(diff(f,x)/diff(f,y)3 2 2 -2 x+2+2 x +x y-4 x -2 x y -x(x-2)(2 y+x)3.1.3 积分问题的解析解 不定积分的推导:格式:F=int(fun,x)例:用diff()函数求其一阶导数,再积分,检验是否可以得出一致的结果。syms x;y=sin(x)/(x2+4*x+3);y1=diff(y);y0=int(y1);pretty(y0)%对导数积分 sin(x)sin(x)-1/2-+1/2-x+3 x+1 对原
10、函数求对原函数求4 4 阶导数,再对结果进行阶导数,再对结果进行4 4次积分次积分 y4=diff(y,4);y0=int(int(int(int(y4);pretty(simple(y0)sin(x)-2 x +4 x+3 例:证明 syms a x;f=simple(int(x3*cos(a*x)2,x)f=1/16*(4*a3*x3*sin(2*a*x)+2*a4*x4+6*a2*x2*cos(2*a*x)-6*a*x*sin(2*a*x)-3*cos(2*a*x)-3)/a4 f1=x4/8+(x3/(4*a)-3*x/(8*a3)*sin(2*a*x)+.(3*x2/(8*a2)-3
11、/(16*a4)*cos(2*a*x);simple(f-f1)%求两个结果的差ans=-3/16/a4 定积分与无穷积分计算:格式:I=int(f,x,a,b)格式:I=int(f,x,a,inf)例:syms x;I1=int(exp(-x2/2),x,0,1.5)无解I1=1/2*erf(3/4*2(1/2)*2(1/2)*pi(1/2)vpa(I1,70)ans=1.085853317666016569702419076542265042534236293532156326729917229308528 I2=int(exp(-x2/2),x,0,inf)I2=1/2*2(1/2)*p
12、i(1/2)2/2()xfxe202()xterf xe dt 多重积分问题的MATLAB求解 例:symssyms x y z;f0=-4 x y z;f0=-4*z z*exp(-x2exp(-x2*y-z2)y-z2)*(cos(x2(cos(x2*y)-y)-1010*cos(x2cos(x2*y)y)*y y*x2+.x2+.4 4*sin(x2sin(x2*y)y)*x4x4*y2+4y2+4*cos(x2cos(x2*y)y)*x4x4*y2-sin(x2y2-sin(x2*y);y);f1=int(f0,z);f1=int(f1,y);f1=int(f1,x);f1=int(f
13、0,z);f1=int(f1,y);f1=int(f1,x);f1=simple(int(f1,x)f1=simple(int(f1,x)f1=f1=exp(-x2 exp(-x2*y-z2)y-z2)*sin(x2sin(x2*y)y)f2=int(f0,z);f2=int(f2,x);f2=int(f2,x);f2=simple(int(f2,y)f2=2*exp(-x2*y-z2)*tan(1/2*x2*y)/(1+tan(1/2*x2*y)2)simple(f1-f2)ans=0 顺序的改变使化简结果不同于原函数,但其误差为0,表明二者实际完全一致。这是由于积分顺序不同,得不出实际的最
14、简形式。例:syms x y z int(int(int(4*x*z*exp(-x2*y-z2),x,0,1),y,0,pi),z,0,pi)ans=(Ei(1,4*pi)+log(pi)+eulergamma+2*log(2)*pi2*hypergeom(1,2,-pi2)Ei(n,z)为指数积分,无解析解,但可求其数值解:vpa(ans,60)ans=3.108079402085412722834614647671385210191423063170218634835883.2 函数的级数展开与 级数求和问题求解 3.2.1 Taylor 幂级数展开 3.2.2 Fourier 级数展开
15、3.2.3 级数求和的计算3.2.1 Taylor 幂级数展开 3.2.1.1 单变量函数的 Taylor 幂级数展开例:syms x;f=sin(x)/(x2+4*x+3);y1=taylor(f,x,9);pretty(y1)2 23 3 34 4 4087 5 3067 6 515273 7 386459 8 1/3 x-4/9 x +-x -x +-x -x +-x -x 54 81 9720 7290 1224720 918540 taylor(f,x,9,2)ans=1/15*sin(2)+(1/15*cos(2)-8/225*sin(2)*(x-2)+(-127/6750*sin
16、(2)-8/225*cos(2)*(x-2)2+(23/6750*cos(2)+628/50625*sin(2)*(x-2)3+(-15697/6075000*sin(2)+28/50625*cos(2)*(x-2)4+(203/6075000*cos(2)+6277/11390625*sin(2)*(x-2)5+(-585671/2733750000*sin(2)-623/11390625*cos(2)*(x-2)6+(262453/19136250000*cos(2)+397361/5125781250*sin(2)*(x-2)7+(-875225059/34445250000000*si
17、n(2)-131623/35880468750*cos(2)*(x-2)8 syms a;taylor(f,x,5,a)%结果较冗长,显示从略ans=sin(a)/(a2+3+4*a)+(cos(a)-sin(a)/(a2+3+4*a)*(4+2*a)/(a2+3+4*a)*(x-a)+(-sin(a)/(a2+3+4*a)-1/2*sin(a)-(cos(a)*a2+3*cos(a)+4*cos(a)*a-4*sin(a)-2*sin(a)*a)/(a2+3+4*a)2*(4+2*a)/(a2+3+4*a)*(x-a)2+例:对y=sinx进行Taylor幂级数展开,并观察不同阶次的近似效果
18、。x0=-2*pi:0.01:2*pi;y0=sin(x0);syms x;y=sin(x);plot(x0,y0,r-.),axis(-2*pi,2*pi,-1.5,1.5);hold on for n=8:2:16 p=taylor(y,x,n),y1=subs(p,x,x0);line(x0,y1)endp=x-1/6*x3+1/120*x5-1/5040*x7p=x-1/6*x3+1/120*x5-1/5040*x7+1/362880*x9p=x-1/6*x3+1/120*x5-1/5040*x7+1/362880*x9-1/39916800*x11p=x-1/6*x3+1/120*x
19、5-1/5040*x7+1/362880*x9-1/39916800*x11+1/6227020800*x13 p=x-1/6*x3+1/120*x5-1/5040*x7+1/362880*x9-1/39916800*x11+1/6227020800*x13-1/1307674368000*x153.2.1.2 多变量函数的Taylor 幂级数展开 多变量函数 在的Taylor幂级数的展开12(,)nf x xx12(,)na aa 例:?syms x y;f=(x2-2*x)*exp(-x2-y2-x*y);F=maple(mtaylor,f,x,y,8)F=mtaylor(x2-2*x)*
20、exp(-x2-y2-x*y),x,y,8)maple(readlib(mtaylor);读库,把函数调入内存 F=maple(mtaylor,f,x,y,8)F=-2*x+x2+2*x3-x4-x5+1/2*x6+1/3*x7+2*y*x2+2*y2*x-y*x3-y2*x2-2*y*x4-3*y2*x3-2*y3*x2-y4*x+y*x5+3/2*y2*x4+y3*x3+1/2*y4*x2+y*x6+2*y2*x5+7/3*y3*x4+2*y4*x3+y5*x2+1/3*y6*x syms a;F=maple(mtaylor,f,x=1,y=a,3);F=maple(mtaylor,f,x
21、=a,3)F=(a2-2*a)*exp(-a2-y2-a*y)+(a2-2*a)*exp(-a2-y2-a*y)*(-2*a-y)+(2*a-2)*exp(-a2-y2-a*y)*(x-a)+(a2-2*a)*exp(-a2-y2-a*y)*(-1+2*a2+2*a*y+1/2*y2)+exp(-a2-y2-a*y)+(2*a-2)*exp(-a2-y2-a*y)*(-2*a-y)*(x-a)23.2.2 Fourier 级数展开function A,B,F=fseries(f,x,n,a,b)if nargin=3,a=-pi;b=pi;endL=(b-a)/2;if a+b,f=subs(
22、f,x,x+L+a);end变量区域互换A=int(f,x,-L,L)/L;B=;F=A/2;for i=1:n an=int(f*cos(i*pi*x/L),x,-L,L)/L;bn=int(f*sin(i*pi*x/L),x,-L,L)/L;A=A,an;B=B,bn;F=F+an*cos(i*pi*x/L)+bn*sin(i*pi*x/L);endif a+b,F=subs(F,x,x-L-a);end 换回变量区域例:syms x;f=x*(x-pi)*(x-2*pi);A,B,F=fseries(f,x,6,0,2*pi)A=0,0,0,0,0,0,0 B=-12,3/2,-4/9,
23、3/16,-12/125,1/18 F=12*sin(x)+3/2*sin(2*x)+4/9*sin(3*x)+3/16*sin(4*x)+12/125*sin(5*x)+1/18*sin(6*x)例:syms x;f=abs(x)/x;%定义方波信号 xx=-pi:pi/200:pi;xx=xx(xx=0);xx=sort(xx,-eps,eps);%剔除零点 yy=subs(f,x,xx);plot(xx,yy,r-.),hold on%绘制出理论值并保持坐标系 for n=2:20 a,b,f1=fseries(f,x,n),y1=subs(f1,x,xx);plot(xx,y1)end
24、a=0,0,0b=4/pi,0f1=4/pi*sin(x)a=0,0,0,0 b=4/pi,0,4/3/pif1=4/pi*sin(x)+4/3/pi*sin(3*x)3.2.3 级数求和的计算 是在符号工具箱中提供的例:计算 format long;sum(2.0:63)%数值计算ans=1.844674407370955e+019 sum(sym(2).0:200)%或 syms k;symsum(2k,0,200)把2定义为符号量可使计算更精确ans=3213876088517980551083924184682325205044405987565585670602751 syms k;
25、symsum(2k,0,200)ans=3213876088517980551083924184682325205044405987565585670602751例:试求解无穷级数的和 syms n;s=symsum(1/(3*n-2)*(3*n+1),n,1,inf)%采用符号运算工具箱s=1/3 m=1:10000000;s1=sum(1./(3*m-2).*(3*m+1);%数值计算方法,双精度有效位16,“大数吃小数”,无法精确 format long;s1%以长型方式显示得出的结果s1=0.33333332222165例:求解 syms n x s1=symsum(2/(2*n+1)
26、*(2*x+1)(2*n+1),n,0,inf);simple(s1)%对结果进行化简,MATLAB 6.5 及以前版本因本身 bug 化简很麻烦ans=log(2*x+1)2)(1/2)+1)/(2*x+1)2)(1/2)-1)%实际应为log(x+1)/x)例:求 syms m n;limit(symsum(1/m,m,1,n)-log(n),n,inf)ans=eulergamma vpa(ans,70)%显示 70 位有效数字ans=.5772156649015328606065120900824024310421593359399235988057672348848677 3.3 数
27、值微分 3.3.1 数值微分算法 向前差商公式:向后差商公式两种中心公式:2342342()()()/2!()/3!()()2()()()/2!()/3!()2()()3!f xtfxt fxt fotf xtf xtfxt fxt fotttfxf 3.3.2 中心差分方法及其 MATLAB 实现 function dy,dx=diff_ctr(y,Dt,n)yx1=y 0 0 0 0 0;yx2=0 y 0 0 0 0;yx3=0 0 y 0 0 0;yx4=0 0 0 y 0 0;yx5=0 0 0 0 y 0;yx6=0 0 0 0 0 y;switch n case 1 dy=(-d
28、iff(yx1)+7*diff(yx2)+7*diff(yx3)-diff(yx4)/(12*Dt);L0=3;case 2 dy=(-diff(yx1)+15*diff(yx2)-15*diff(yx3)+diff(yx4)/(12*Dt2);L0=3;数值计算diff(X)表示数组X相邻两数的差 case 3 dy=(-diff(yx1)+7*diff(yx2)-6*diff(yx3)-6*diff(yx4)+.7*diff(yx5)-diff(yx6)/(8*Dt3);L0=5;case 4 dy=(-diff(yx1)+11*diff(yx2)-28*diff(yx3)+28*diff
29、(yx4)-11*diff(yx5)+diff(yx6)/(6*Dt4);L0=5;end dy=dy(L0+1:end-L0);dx=(1:length(dy)+L0-2-(n2)*Dt;调用格式:y为 等距实测数据,dy为得出的导数向量,dx为相应的自变量向量,dy、dx的数据比y短。,_(,)yxdddiffctr yt n 例:求导数的解析解,再用数值微分求取原函数的14 阶导数,并和解析解比较精度。h=0.05;x=0:h:pi;syms x1;y=sin(x1)/(x12+4*x1+3);%求各阶导数的解析解与对照数据 yy1=diff(y);f1=subs(yy1,x1,x);y
30、y2=diff(yy1);f2=subs(yy2,x1,x);yy3=diff(yy2);f3=subs(yy3,x1,x);yy4=diff(yy3);f4=subs(yy4,x1,x);y=sin(x)./(x.2+4*x+3);%生成已知数据点 y1,dx1=diff_ctr(y,h,1);subplot(221),plot(x,f1,dx1,y1,:);y2,dx2=diff_ctr(y,h,2);subplot(222),plot(x,f2,dx2,y2,:)y3,dx3=diff_ctr(y,h,3);subplot(223),plot(x,f3,dx3,y3,:);y4,dx4=
31、diff_ctr(y,h,4);subplot(224),plot(x,f4,dx4,y4,:)求最大相对误差:norm(y4-f4(4:60)./f4(4:60)ans=3.5025e-0043.3.3 用插值、拟合多项式的求导数 基本思想:当已知函数在一些离散点上的函数值时,该函数可用插值或拟合多项式来近似,然后对多项式进行微分求得导数。选取x=0附近的少量点 进行多项式拟合或插值 g(x)在x=0处的k阶导数为(,),1,2,1iix yin1121()nnnng xcxc xc x c()1(0)!0,1,2,knkgckkn 通过坐标变换用上述方法计算任意x点处的导数值 令 将g(x
32、)写成z的表达式 导数为 可直接用 拟合节点 得到系数 d=polyfit(x-a,y,length(xd)-1)zxa1121()()nnnng xg zdzd zd z d()()1()(0)!0,1,kknkgagdkkn()g z(,)iixa yid 例:数据集合如下:xd:0 0.2000 0.4000 0.6000 0.8000 1.000 yd:0.3927 0.5672 0.6982 0.7941 0.8614 0.9053计算x=a=0.3处的各阶导数。xd=0 0.2000 0.4000 0.6000 0.8000 1.000;yd=0.3927 0.5672 0.698
33、2 0.7941 0.8614 0.9053;a=0.3;L=length(xd);d=polyfit(xd-a,yd,L-1);fact=1;for k=1:L-1;fact=factorial(k),fact;end deriv=d.*factderiv=1.8750 -1.3750 1.0406 -0.9710 0.6533 0.6376 建立用拟合(插值)多项式计算各阶导数的poly_drv.mfunction der=poly_drv(xd,yd,a)m=length(xd)-1;d=polyfit(xd-a,yd,m);c=d(m:-1:1);去掉常数项fact(1)=1;for
34、i=2:m;fact(i)=i*fact(i-1);endder=c.*fact;例:xd=0 0.2000 0.4000 0.6000 0.8000 1.000;yd=0.3927 0.5672 0.6982 0.7941 0.8614 0.9053;a=0.3;der=poly_drv(xd,yd,a)der=0.6533 -0.9710 1.0406 -1.3750 1.87503.3.4 二元函数的梯度计算 格式:若z矩阵是建立在等间距的形式生成的网格基础上,则实际梯度为,()xyffgradient z/,/xxyyffxffy(,)zfx y 例:计算梯度,绘制引力线图:x,y=m
35、eshgrid(-3:.2:3,-2:.2:2);z=(x.2-2*x).*exp(-x.2-y.2-x.*y);fx,fy=gradient(z);fx=fx/0.2;fy=fy/0.2;contour(x,y,z,30);hold on;quiver(x,y,fx,fy)%绘制等高线与引力线图 绘制误差曲面:zx=-exp(-x.2-y.2-x.*y).*(-2*x+2+2*x.3+x.2.*y-4*x.2-2*x.*y);zy=-x.*(x-2).*(2*y+x).*exp(-x.2-y.2-x.*y);surf(x,y,abs(fx-zx);axis(-3 3-2 2 0,0.08)f
36、igure;surf(x,y,abs(fy-zy);axis(-3 3-2 2 0,0.11)建立一个新图形窗口 为减少误差,对网格加密一倍:x,y=meshgrid(-3:.1:3,-2:.1:2);z=(x.2-2*x).*exp(-x.2-y.2-x.*y);fx,fy=gradient(z);fx=fx/0.1;fy=fy/0.1;zx=-exp(-x.2-y.2-x.*y).*(-2*x+2+2*x.3+x.2.*y-4*x.2-2*x.*y);zy=-x.*(x-2).*(2*y+x).*exp(-x.2-y.2-x.*y);surf(x,y,abs(fx-zx);axis(-3
37、3-2 2 0,0.02)figure;surf(x,y,abs(fy-zy);axis(-3 3-2 2 0,0.06)3.4 数值积分问题 4.3.1 由给定数据进行梯形求积Sum(2*y(1:end-1,:)+diff(y).*diff(x)/2 格式:S=trapz(x,y)例:x1=0:pi/30:pi;y=sin(x1)cos(x1)sin(x1/2);x=x1 x1 x1;S=sum(2*y(1:end-1,:)+diff(y).*diff(x)/2S=1.9982 0.0000 1.9995 S1=trapz(x1,y)%得出和上述完全一致的结果S1=1.9982 0.0000
38、 1.9995 例:画图 x=0:0.01:3*pi/2,3*pi/2;%这样赋值能确保 3*pi/2点被包含在内 y=cos(15*x);plot(x,y)%求取理论值 syms x,A=int(cos(15*x),0,3*pi/2)A=1/15随着步距h的减小,计算精度逐渐增加:h0=0.1,0.01,0.001,0.0001,0.00001,0.000001;v=;for h=h0,x=0:h:3*pi/2,3*pi/2;y=cos(15*x);I=trapz(x,y);v=v;h,I,1/15-I;end vv=0.1000 0.0539 0.0128 0.0100 0.0665 0.
39、0001 0.0010 0.0667 0.0000 0.0001 0.0667 0.0000 0.0000 0.0667 0.0000 0.0000 0.0667 0.0000 format long,v3.4.2 单变量数值积分问题求解 梯形公式 格式:(变步长)y=quad(Fun,a,b)y=quadl(Fun,a,b)%求定积分 y=quad(Fun,a,b,)y=quadl(Fun,a,b,)%限定精度的定积分求解,默认精度为106。后面函数算法更精,精度更高。例:第三种:匿名函数(MATLAB 7.0)第二种:inline 函数第一种,一般函数方法函数定义被积函数:y=quad(c
40、3ffun,0,1.5)y=0.9661 用 inline 函数定义被积函数:f=inline(2/sqrt(pi)*exp(-x.2),x);y=quad(f,0,1.5)y=0.9661 运用符号工具箱:syms x,y0=vpa(int(2/sqrt(pi)*exp(-x2),0,1.5),60)y0=.966105146475310713936933729949905794996224943257461473285749 y=quad(f,0,1.5,1e-20)%设置高精度,但该方法失效 例:提高求解精度:y=quadl(f,0,1.5,1e-20)y=0.9661 abs(y-y0
41、)ans=.6402522848913892e-16 format long 16位精度 y=quadl(f,0,1.5,1e-20)y=0.96610514647531 例:求解绘制函数:x=0:0.01:2,2+eps:0.01:4,4;y=exp(x.2).*(x2);y(end)=0;x=eps,x;y=0,y;fill(x,y,g)为减少视觉上的误差,对端点与间断点(有跳跃)进行处理。调用quad():f=inline(exp(x.2).*(x2)./(4-sin(16*pi*x),x);I1=quad(f,0,4)I1=57.76435412500863 调用quadl():I2=
42、quadl(f,0,4)I2=57.76445016946768 syms x;I=vpa(int(exp(x2),0,2)+int(80/(4-sin(16*pi*x),2,4)I=57.7644501250530103333152353851823.4.3 Gauss求积公式 为使求积公式得到较高的代数精度 对求积区间a,b,通过变换 有110()()nkkkfx dxA fx22babaxt110()()()222222nbkakb ab aa bb ab aa bf x dxftdtA ft1,0.5773503,1.00000000;2,0.7745967,0.555555560.0
43、0000000,0.88888889;kkkkkknxAnxAxA 以n=2的高斯公式为例:function g=gauss2(fun,a,b)h=(b-a)/2;c=(a+b)/2;x=h*(-0.7745967)+c,c,h*0.7745967+c;g=h*(0.55555556*(gaussf(x(1)+gaussf(x(3)+0.88888889*gaussf(x(2);function y=gaussf(x)y=cos(x);gauss2(gaussf,0,1)ans=0.84153.4.4 基于样条插值的数值微积分运算 基于样条插值的数值微分运算格式:Sd=fnder(S,k)该函
44、数可以求取S的k阶导数。格式:Sd=fnder(S,k1,kn)可以求取多变量函数的偏导数 例:syms x;f=(x2-3*x+5)*exp(-5*x)*sin(x);ezplot(diff(f),0,1),hold on x=0:.12:1;y=(x.2-3*x+5).*exp(-5*x).*sin(x);sp1=csapi(x,y);建立三次样条函数 dsp1=fnder(sp1,1);fnplt(dsp1,-)绘制样条图 sp2=spapi(5,x,y);5阶次B样条 dsp2=fnder(sp2,1);fnplt(dsp2,:);axis(0,1,-0.8,5)例:拟合曲面 x0=-
45、3:.3:3;y0=-2:.2:2;x,y=ndgrid(x0,y0);z=(x.2-2*x).*exp(-x.2-y.2-x.*y);sp=spapi(5,5,x0,y0,z);B样条dspxy=fnder(sp,1,1);fnplt(dspxy)理论方法:syms x y;z=(x2-2*x)*exp(-x2-y2-x*y);ezsurf(diff(diff(z,x),y),-3 3,-2 2)对符号变量表达式做三维表面图 基于样条插值的数值积分运算格式:f=fnint(S)其中S为样条函数。例:考虑 中较稀疏的样本点,用样条积分的方式求出定积分及积分函数。x=0,0.4,1 2,pi;y
46、=sin(x);sp1=csapi(x,y);a=fnint(sp1,1);建立三次样条函数 xx=fnval(a,0,pi);xx(2)-xx(1)ans=2.01910sin xdx sp2=spapi(5,x,y);b=fnint(sp2,1);xx=fnval(b,0,pi);xx(2)-xx(1)ans=1.9999绘制曲线 ezplot(-cos(t)+2,0,pi);hold on不定积分可上下平移 fnplt(a,-);fnplt(b,:)3.4.5 双重积分问题的数值解 矩形区域上的二重积分的数值计算 格式:矩形区域的双重积分:y=dblquad(Fun,xm,xM,ym,y
47、M)限定精度的双重积分:y=dblquad(Fun,xm,xM,ym,yM,)例:求解 f=inline(exp(-x.2/2).*sin(x.2+y),x,y);y=dblquad(f,-2,2,-1,1)y=1.57449318974494 任意区域上二元函数的数值积分(调用工具箱NIT),该函数指定顺序先x后y.例 fh=inline(sqrt(1-x.2/2),x);%内积分上限 fl=inline(-sqrt(1-x.2/2),x);%内积分下限 f=inline(exp(-x.2/2).*sin(x.2+y),y,x);%交换顺序的被积函数 y=quad2dggen(f,fl,fh
48、,-1/2,1,eps)y=0.41192954617630 解析解方法:syms x y i1=int(exp(-x2/2)*sin(x2+y),y,-sqrt(1-x2/2),sqrt(1-x2/2);int(i1,x,-1/2,1)Warning:Explicit integral could not be found.In D:MATLAB6p5toolboxsymbolicsymint.m at line 58 ans=int(2*exp(-1/2*x2)*sin(x2)*sin(1/2*(4-2*x2)(1/2),x=-1/2.1)vpa(ans)ans=.411929546176
49、29511965175994017601222112211sin()yxyIexy dxdy222221sin()xxyIexy dxdy例:计算单位圆域上的积分:先把二重积分转化:syms x y i1=int(exp(-x2/2)*sin(x2+y),x,-sqrt(1-y.2),sqrt(1-y.2);Warning:Explicit integral could not be found.In D:MATLAB6p5toolboxsymbolicsymint.m at line 58对x是不可积的,故调用解析解方法不会得出结果,而数值解求解不受此影响。fh=inline(sqrt(1-
50、y.2),y);%内积分上限 fl=inline(-sqrt(1-y.2),y);%内积分下限 f=inline(exp(-x.2/2).*sin(x.2+y),x,y);%交换顺序的被积函数 I=quad2dggen(f,fl,fh,-1,1,eps)Integral did not converge-singularity likelyI=0.536860382697953.4.6 三重定积分的数值求解 格式:I=triplequad(Fun,xm,xM,ym,yM,zm,zM,,quadl)其中quadl为具体求解一元积分的数值函数,也可选用quad或自编积分函数,但调用格式要与quad