第8章MATLAB數值積分與微分
8.1 數值積分
8.1.1 數值積分基本原理
求解定積分的數值方法多種多樣,如簡單的梯形法、辛普生(Simpson)法、牛頓-柯特斯(Newton-Cotes)法等都是經常采用的方法。它們的基本思想都是將整個積分區間[a,b]分成n個子區間[xi,xi+1],i=1,2,…,n,其中x1=a,xn+1=b。這樣求定積分問題就分解為求和問題。
8.1.2 數值積分的實現方法
1.變步長辛普生法
基於變步長辛普生法,MATLAB給出了quad函數來求定積分。該函數的調用格式為:
[I,n]=quad('fname',a,b,tol,trace)
其中fname是被積函數名。a和b分別是定積分的下限和上限。tol用來控制積分精度,缺省時取tol=0.001。trace控制是否展現積分過程,若取非0則展現積分過程,取0則不展現,缺省時取trace=0。返回參數I即定積分值,n為被積函數的調用次數。
例8-1求定積分。
(1)建立被積函數文件fesin.m。
function f=fesin(x)
f=exp(-0.5*x).*sin(x+pi/6);
(2)調用數值積分函數quad求定積分。
[S,n]=quad('fesin',0,3*pi)
S =
0.9008
n =
77
2.牛頓-柯特斯法
基於牛頓-柯特斯法,MATLAB給出了quad8函數來求定積分。該函數的調用格式為:
[I,n]=quad8('fname',a,b,tol,trace)
其中參數的含義和quad函數相似,只是tol的缺省值取10-6。該函數可以更精確地求出定積分的值,且一般情況下函數調用的步數明顯小於quad函數,從而保證能以更高的效率求出所需的定積分值。
例8-2 求定積分。
(1) 被積函數文件fx.m。
function f=fx(x)
f=x.*sin(x)./(1+cos(x).*cos(x));
(2)調用函數quad8求定積分。
I=quad8('fx',0,pi)
I =
2.4674
例8-3分別用quad函數和quad8函數求定積分的近似值,並在相同的積分精度下,比較函數的調用次數。
調用函數quad求定積分:
format long;
fx=inline('exp(-x)');
[I,n]=quad(fx,1,2.5,1e-10)
I =
0.28579444254766
n =
65
調用函數quad8求定積分:
format long;
fx=inline('exp(-x)');
[I,n]=quad8(fx,1,2.5,1e-10)
I =
0.28579444254754
n =
33
3.被積函數由一個表格定義
在MATLAB中,對由表格形式定義的函數關系的求定積分問題用trapz(X,Y)函數。其中向量X,Y定義函數關系Y=f(X)。
例8-4用trapz函數計算定積分。
命令如下:
X=1:0.01:2.5;
Y=exp(-X); %生成函數關系數據向量
trapz(X,Y)
ans =
0.28579682416393
8.1.3 二重定積分的數值求解
使用MATLAB提供的dblquad函數就可以直接求出上述二重定積分的數值解。該函數的調用格式為:
I=dblquad(f,a,b,c,d,tol,trace)
該函數求f(x,y)在[a,b]×[c,d]區域上的二重定積分。參數tol,trace的用法與函數quad完全相同。
例8-5 計算二重定積分
(1) 建立一個函數文件fxy.m:
function f=fxy(x,y)
global ki;
ki=ki+1; %ki用於統計被積函數的調用次數
f=exp(-x.^2/2).*sin(x.^2+y);
(2) 調用dblquad函數求解。
global ki;ki=0;
I=dblquad('fxy',-2,2,-1,1)
ki
I =
1.57449318974494
ki =
1038
8.2 數值微分
8.2.1 數值差分與差商
8.2.2 數值微分的實現
在MATLAB中,沒有直接提供求數值導數的函數,只有計算向前差分的函數diff,其調用格式為:
DX=diff(X):計算向量X的向前差分,DX(i)=X(i+1)-X(i),i=1,2,…,n-1。
DX=diff(X,n):計算X的n階向前差分。例如,diff(X,2)=diff(diff(X))。
DX=diff(A,n,dim):計算矩陣A的n階差分,dim=1時(缺省狀態),按列計算差分;dim=2,按行計算差分。
例8-6生成以向量V=[1,2,3,4,5,6]為基礎的范得蒙矩陣,按列進行差分運算。
命令如下:
V=vander(1:6)
DV=diff(V) %計算V的一階差分
例8-7用不同的方法求函數f(x)的數值導數,並在同一個坐標系中做出f'(x)的圖像。
程序如下:
f=inline('sqrt(x.^3+2*x.^2-x+12)+(x+5).^(1/6)+5*x+2');
g=inline('(3*x.^2+4*x-1)./sqrt(x.^3+2*x.^2-x+12)/2+1/6./(x+5).^(5/6)+5');
x=-3:0.01:3;
p=polyfit(x,f(x),5); %用5次多項式p擬合f(x)
dp=polyder(p); %對擬合多項式p求導數dp
dpx=polyval(dp,x); %求dp在假設點的函數值
dx=diff(f([x,3.01]))/0.01; %直接對f(x)求數值導數
gx=g(x); %求函數f的導函數g在假設點的導數
plot(x,dpx,x,dx,'.',x,gx,'-'); %作圖