【數學建模】MATLAB數值積分與微分


第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是被積函數名。ab分別是定積分的下限上限。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,'-');  %作圖


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM