quad8是matlab中调用那个,Matlab 数值积分
MATLAB數(shù)值積分與微分
8.1?數(shù)值積分
8.1.1?數(shù)值積分基本原理
求解定積分的數(shù)值方法多種多樣,如簡單的梯形法、辛普生(Simpson)法、牛頓-柯特斯(Newton-Cotes)法等都是經(jīng)常采用的方法。它們的基本思想都是將整個積分區(qū)間[a,b]分成n個子區(qū)間[xi,xi+1],i=1,2,…,n,其中x1=a,xn+1=b。這樣求定積分問題就分解為求和問題。
8.1.2?數(shù)值積分的實現(xiàn)方法
1.變步長辛普生法
基于變步長辛普生法,MATLAB給出了quad函數(shù)來求定積分。該函數(shù)的調(diào)用格式為:
[I,n]=quad('fname',a,b,tol,trace)
其中fname是被積函數(shù)名。a和b分別是定積分的下限和上限。tol用來控制積分精度,缺省時取tol=0.001。trace控制是否展現(xiàn)積分過程,若取非0則展現(xiàn)積分過程,取0則不展現(xiàn),缺省時取trace=0。返回參數(shù)I即定積分值,n為被積函數(shù)的調(diào)用次數(shù)。
例8-1?求定積分。
(1)?建立被積函數(shù)文件fesin.m。
function
f=fesin(x)
f=exp(-0.5*x).*sin(x+pi/6);
(2)?調(diào)用數(shù)值積分函數(shù)quad求定積分。
[S,n]=quad('fesin',0,3*pi)
S =
0.9008
n =
77
2.牛頓-柯特斯法
基于牛頓-柯特斯法,MATLAB給出了quad8函數(shù)來求定積分。該函數(shù)的調(diào)用格式為:
[I,n]=quad8('fname',a,b,tol,trace)
其中參數(shù)的含義和quad函數(shù)相似,只是tol的缺省值取10-6。該函數(shù)可以更精確地求出定積分的值,且一般情況下函數(shù)調(diào)用的步數(shù)明顯小于quad函數(shù),從而保證能以更高的效率求出所需的定積分值。
例8-2?求定積分。
(1)?被積函數(shù)文件fx.m。
function
f=fx(x)
f=x.*sin(x)./(1+cos(x).*cos(x));
(2)?調(diào)用函數(shù)quad8求定積分。
I=quad8('fx',0,pi)
I =
2.4674
例8-3?分別用quad函數(shù)和quad8函數(shù)求定積分的近似值,并在相同的積分精度下,比較函數(shù)的調(diào)用次數(shù)。
調(diào)用函數(shù)quad求定積分:
format
long;
fx=inline('exp(-x)');
[I,n]=quad(fx,1,2.5,1e-10)
I =
0.28579444254766
n =
65
調(diào)用函數(shù)quad8求定積分:
format
long;
fx=inline('exp(-x)');
[I,n]=quad8(fx,1,2.5,1e-10)
I =
0.28579444254754
n =
33
3.被積函數(shù)由一個表格定義
在MATLAB中,對由表格形式定義的函數(shù)關(guān)系的求定積分問題用trapz(X,Y)函數(shù)。其中向量X,Y定義函數(shù)關(guān)系Y=f(X)。
例8-4?用trapz函數(shù)計算定積分。
命令如下:
X=1:0.01:2.5;
Y=exp(-X);?%生成函數(shù)關(guān)系數(shù)據(jù)向量
trapz(X,Y)
ans =
0.28579682416393
8.1.3?二重定積分的數(shù)值求解
使用MATLAB提供的dblquad函數(shù)就可以直接求出上述二重定積分的數(shù)值解。該函數(shù)的調(diào)用格式為:
I=dblquad(f,a,b,c,d,tol,trace)
該函數(shù)求f(x,y)在[a,b]×[c,d]區(qū)域上的二重定積分。參數(shù)tol,trace的用法與函數(shù)quad完全相同。
例8-5?計算二重定積分
(1)?建立一個函數(shù)文件fxy.m:
function
f=fxy(x,y)
global
ki;
ki=ki+1;?%ki用于統(tǒng)計被積函數(shù)的調(diào)用次數(shù)
f=exp(-x.^2/2).*sin(x.^2+y);
(2)?調(diào)用dblquad函數(shù)求解。
global
ki;ki=0;
I=dblquad('fxy',-2,2,-1,1)
ki
I =
1.57449318974494
ki =
1038
8.2?數(shù)值微分
8.2.1?數(shù)值差分與差商
8.2.2?數(shù)值微分的實現(xiàn)
在MATLAB中,沒有直接提供求數(shù)值導(dǎo)數(shù)的函數(shù),只有計算向前差分的函數(shù)diff,其調(diào)用格式為:
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時(缺省狀態(tài)),按列計算差分;dim=2,按行計算差分。
例8-6?生成以向量V=[1,2,3,4,5,6]為基礎(chǔ)的范得蒙矩陣,按列進行差分運算。
命令如下:
V=vander(1:6)
DV=diff(V)?%計算V的一階差分
例8-7?用不同的方法求函數(shù)f(x)的數(shù)值導(dǎo)數(shù),并在同一個坐標(biāo)系中做出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求導(dǎo)數(shù)dp
dpx=polyval(dp,x);?%求dp在假設(shè)點的函數(shù)值
dx=diff(f([x,3.01]))/0.01;?%直接對f(x)求數(shù)值導(dǎo)數(shù)
,diff是后一個數(shù)減去前一個數(shù)。在最后面加了一個點3.01->才能求出x=3的微分值。n+1個點中間有n段線段
gx=g(x);?%求函數(shù)f的導(dǎo)函數(shù)g在假設(shè)點的導(dǎo)數(shù)
plot(x,dpx,x,dx,'.',x,gx,'-');?%作圖
一、Z = trapz(X,Y,dim)
梯形數(shù)值積分,通過已知參數(shù)x,y按dim維使用梯形公式進行積分。
例1 計算int(sin(x),0,pi)
>>x=0:pi/100:2*pi;
>>y=sin(x);
>>z=trapz(x,y)%或者說使用z =
pi/100*trapz(y)
z =
1.0300e-017
>>z = pi/100*trapz(y)
二、[q,fcnt]=
quad(fun,a,b,tol,trace,p1,p2...)
自適應(yīng)simpson公式數(shù)值積分,適用于精度要求低,被積函數(shù)平滑性較差的數(shù)值積分。
注意事項:
1.被積函數(shù)fun必須是函數(shù)句柄;
2.積分限[a,b]必須是有限的,因此不能為inf;
3.p1為其他需要傳遞的參數(shù),一般是數(shù)值。
可能警告:
1.'Minimum step size reached'
意味著子區(qū)間的長度與計算機舍入誤差相當(dāng),無法繼續(xù)計算了。原因可能是有不可積的奇點;
2.'Maximum function count exceeded'
意味著積分遞歸計算超過了10000次。原因可能是有不可積的奇點;
3.'Infinite or Not-a-Number function value encountered'
意味著在積分計算時,區(qū)間內(nèi)出現(xiàn)了浮點數(shù)溢出或者被零除。
例2 計算積分1/(x^3-2*x-p),其中參數(shù)p=5,積分區(qū)間為[0,2]。
>>F = @(x,n)1./(x.^3-2*x-n);
>>Q = quad(@(x)F(x,5),0,2)%或者使用
quad(F,0,2,[],[],5)效果是一樣的,只是前者使用的函數(shù)嵌套。
Q =
-0.4605
>>quad(F,0,2,[],[],5)
ans =
-0.4605
三、[q,fcnt] =
quadl(fun,a,b,tol,trace,p1,p2...)
自適應(yīng)Lobatto數(shù)值積分,適用于精度要求高,被積函數(shù)曲線比較平滑的數(shù)值積分。
注意事項:
同quad
可能警告:
同quad
例3 計算積分1/(x^3-2*x-p),其中參數(shù)p=5,積分區(qū)間為[0,2]。
>>F=@(x,p)1./(x.^3-2*x-p);
>>Q = quadl(F,0,2,[],[],5)%或者Q =
quadl(@(x)F(x,5),0,2)。
Q =
-0.4605
四、[q,errbnd] =
quadgk(fun,a,b,param1,val1,param2,val2,...)
自適應(yīng)Gauss-Kronrod數(shù)值積分,適用于高精度和震蕩數(shù)值積分,支持無窮區(qū)間,并且能夠處理端點包含奇點的情況,同時還支持沿著不連續(xù)函數(shù)積分,復(fù)數(shù)域線性路徑的圍道積分法。
注意事項:
1.積分限[a,b]可以是[-inf,inf],但必須快速衰減;
2.被積函數(shù)在端點可以有奇點,如果區(qū)間內(nèi)部有奇點,將以奇點區(qū)間劃分成多個,也就是說奇點只能出現(xiàn)在端點上;
3.被積函數(shù)可以劇烈震蕩;
4.可以計算不連續(xù)積分,此時需要用到'Waypoints'參數(shù),'Waypoints'中的點必須嚴(yán)格單調(diào);
5.可以計算圍道積分,此時需要用到'Waypoints'參數(shù),并且為復(fù)數(shù),各點之間使用直線連接;
6.param,val為函數(shù)的其它控制參數(shù),比如上面的'waypoints'就是,具體看幫助。
出現(xiàn)錯誤:
1.'Reached the limit on the maximum number of intervals in
use'
2.'Infinite or Not-a-Number function value encountered'
例4 計算有奇點積分int(exp(x)*log(x),0,1)。
>>F=@(x)exp(x).*log(x);%奇點必須在端點上,否則請先進行區(qū)間劃分。
>>Q = quadgk(F,0,1)
Q =
-1.3179
例5 計算半無限震蕩積分int(x^5*exp(-x)*sin(x),0,inf)。
>>F=@(x)x.^5.*exp(-x).*sin(x);
>>fplot(F,[0,100])%繪圖,看看函數(shù)的圖形
>>[q,errbnd] =
quadgk(F,0,inf,'RelTol',1e-8,'AbsTol',1e-12)%積分限中可以有inf,但必須快速收斂
q =
-15.0000
errbnd =
9.4386e-009
例6
計算不連續(xù)積分,積分函數(shù)為f(x)=x^5*exp(-x)*sin(x),但是人為定義f(2)=1000,f(5)=-100,積分區(qū)間為[1
10]。
>>F=@(x)x.^5.*exp(-x).*sin(x);
>>[q,errbnd] =
quadgk(F,1,10,'Waypoints',[2 5])%顯然2,5為間斷點
q =
-10.9408
errbnd =
3.2296e-014
例7 計算圍道積分,在復(fù)數(shù)域內(nèi),積分函數(shù)1/(2*z-1),積分路徑為由[-1-i 1-i 1+i -1+i
-1-i]圍成的矩形邊框。
>>Waypoints=[-1-i 1-i 1+i -1+i
-1-i];
>>plot(Waypoints);%繪制積分路徑
>>xlabel('Real axis');ylabel('Image
axis');axis([-1.5 1.5 -1.5 1.5]);grid on;
>>Q = quadgk(@(z)1./(2*z -
1),-1-i,-1-i,'Waypoints',[1-i,1+i,-1+i])%注意各點間使用直線連接
ans =
0.0000 + 3.1416i
>> quadgk(@(z)1./(2*z -
1),-1-i,-1-i,'Waypoints',Waypoints)%使用這個的效果也是一樣的,就是說始末點可以隨便包不包含在Waypoints中。
ans =
0.0000 + 3.1416i
五、[Q,fcnt] = quadv(fun,a,b,tol,trace)
矢量化自適應(yīng)simpson數(shù)值積分。
注意事項:
1.該函將quad函數(shù)矢量化了,就是一次可以計算多個積分;
2.所有的要求完全與quad相同。
例8 計算下面積分,分別計算n=1,2...,5時的5個積分值,被積函數(shù)1/(n+x),積分限為[0,1]。
>>for k =
1:5,?Qs(k) = quadv(@(x)1/(k+x),0,1);end;Qs
Qs =
0.6931?0.4055?0.2877?0.2231?0.1823
>>F=@(x,n)1./((1:n)+x);%定義被積函數(shù)
>>quadv(@(x)F(x,5),0,1)%我們可以完全使用quadv函數(shù)替換上面循環(huán)語句的,建議使用后者
ans =
0.6931?0.4055?0.2877?0.2231?0.1823
六、q =
dblquad(fun,xmin,xmax,ymin,ymax,tol,method)
矩形區(qū)域二重數(shù)值積分,一般區(qū)域二重積分參見NIT(數(shù)值積分工具箱)的quad2dggen函數(shù)。
例9 計算下面二重積分
>>F = @(x,y)y*sin(x)+x*cos(y);
>Q = dblquad(F,pi,2*pi,0,pi)
Q =
-9.8696
七、q=triplequad(fun,xmin,xmax,ymin,ymax,zmin,zmax,tol,method)
長方體區(qū)域三重數(shù)值積分,注意此時沒有一般區(qū)域的三重積分。
例10 計算下面三重積分。
>>F =
@(x,y,z)y*sin(x)+z*cos(x);
>>Q = triplequad(F,0,pi,0,1,-1,1)
Q =
2.0000
八、超維長方體區(qū)域多重積分
quadndg:NIT工具箱函數(shù),可以解決多重超維長方體邊界的定積分問題,但沒有現(xiàn)成的一般積分區(qū)域求解函數(shù)。
下面總結(jié)下:
(1)quad:采用自適應(yīng)變步長simpson方法,速度和精度都是最差的,建議不要使用;
(2)quad8:使用8階Newton-Cotes算法,精度和速度均優(yōu)于quad,但在目前版本下已被取消;
(3)quadl:采用lobbato算法,精度和速度均較好,建議全部使用該函數(shù);
(4)quadg:NIT(數(shù)值積分)工具箱函數(shù),效率最高,但該工具箱需要另外下載;
(5)quadv:quad的矢量化函數(shù),可以同時計算多個積分;
(6)quadgk:很有用的函數(shù),功能在Matlab中最強大;
(7)quad2dggen:一般區(qū)域二重積分,效率很好,需要NIT支持;
(8)dblquad:長方形區(qū)域二重積分;
(9)triplequadL:長方體區(qū)域三重積分;
(10)quadndg:超維長方體區(qū)域積分,需要NIT支持。
int的積分可以是定積分,也可以是不定積分(即有沒有積分上下限都可以積),可以得到解析的解,比如你對x^2積分,得到的結(jié)果是1/3*x^3,這是通過解析的方法來解的。如果int(x^2,x,1,2)得到的結(jié)果是7/3
;
quad是數(shù)值積分,它只能是定積分(就是有積分上下限的積分),它是通過simpson數(shù)值積分來求得的(并不是通過解析的方法得到解析解,再將上下限代入,而是用小梯形的面積求和得到的)。如果f=inline(‘x.^2′);quad(f,1,2)得到的結(jié)果是2.333333,這個數(shù)并不是7/3
;
最新心得:
看一本書上介紹quad積分時,是創(chuàng)建了一個子函數(shù)形式,如
function f=quadl(x)
f=x.^2;
Q=quad(‘quadl’,0,2)
結(jié)果Q =
2.6667
如果函數(shù)中有一個已知變量如a的話,如
function f=quadl(x)
a=2;
f=a+x.^2;
Q=quad(‘quadl’,0,2)
結(jié)果Q =
6.6667
當(dāng)用使用inline函數(shù)的時候可以避免調(diào)用子函數(shù)的麻煩,直接把這個功能集成于總程序,如
f=inline(‘x.^2′);quad(f,1,2)
但是當(dāng)函數(shù)為
a=2;
f=inline(‘a(chǎn)+x.^2′);
quad(f,1,2)
計算就會出錯,說明inline中不能帶已知的字母。
但是很多時候,變量a是循環(huán)變化的,這樣就導(dǎo)致這種調(diào)用子函數(shù)的方法非常不好用,
a不能及時改變,下面的方法可以解決這個問題:
a=2;
f=@(x)(a+x.^2);
Q=quad(f,0,2)
結(jié)果Q =
6.6667 正確
用@來表達函數(shù)要比inline應(yīng)用更廣,在循環(huán)中應(yīng)用更有利!
總結(jié)
以上是生活随笔為你收集整理的quad8是matlab中调用那个,Matlab 数值积分的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: php对手时间戳判断,PHP 中判断一个
- 下一篇: lnmp php fpm 默认,LNMP