1.trapz函数
MATLAB中的trapz()函数是基于复化梯形公式设计编写的,其一般调用格式为:
I=trpaz(x,y,dim)
其中x,y是观测数据,x可以为行向量或列向量,y可以为向量或矩阵,y的行数应等于x向量的元素个数;dim表示按维进行求积,若dim=1(缺省值),则按行求积,若dim=2,则按列求积。
如:计算函数y=x^3-2x-3,为了计算在[0,1]上的积分
x=0:0.05:1;
y=x.^3-2.*x-3;
trapz(x,y)
ans =
-3.7494
2.cumtrapz函数
如上一个积分所示,trapz其实就是trapezoidal(梯形的简写),cumtrapz函数和trapz函数使用方法类似,但是返回的结果不一样。前面的cum是cumulation的意思,也就是累积,相当于是不断地从第一个值累积到当前的结果。
输入
x=0:0.05:1;
y=x.^3-2.*x-3;
cumtrapz(x,y)
ans =
Columns 1 through 7
0 -0.1525 -0.3100 -0.4724 -0.6396 -0.8115 -0.9879
Columns 8 through 14
-1.1687 -1.3535 -1.5421 -1.7342 -1.9294 -2.1274 -2.3276
Columns 15 through 21
-2.5297 -2.7330 -2.9372 -3.1415 -3.3455 -3.5483 -3.7494
3.quad函数
MATLAB提供的quad()函数是基于自适应辛普森法设计的,该函数的调用格式为:
[q,fcnt] = quad(fun,a,b,tol,trace,p1,p2,...)
其中fun是被积函数,可以是字符表达式、内联函数、匿名函数和M函数;a,b是定积分的上限和下限;tol为指定的误差限,缺省值为;trace提供中间输出[fcnt a b-a q],若trace=[],则quad不提供中间输出;p1,p2,...是函数fun的附加参数。q是返回的数值积分;fcnt返回函数评估的次数。
另外,MATLAB还提供了一个新的函数quadl()。其调用格式与quad()函数完全一致,使用的算法是自适应Lobatto算法,其精度和速度均远高于quad()函数,所以在追求高精度数值解时建议使用该函数。
如:
To compute the integral
write a function myfun
that computes the integrand:
Then pass @myfun
, a function handle to myfun
, to quad
, along with the limits of integration, 0
to2
:
function y = myfun(x)
y = 1./(x.^3-2*x-5);
end
在命令行中输入Q=quad(@myfun,0,2),输出
Q =
-0.4605
4.quadgk函数
quadgk()函数是MATLAB R2007b版本提供的基于Gauss-Kronrod算法实现的数值积分函数,该函数可以用来求解振荡函数的积分、广义积分甚至是复数积分,其一般调用格式为:
[q,errbnd] = quadgk(fun,a,b,param1,val1,param2,val2,...)
其中fun是被积函数,可以是字符表达式、内联函数、匿名函数和M函数;a,b是积分的上限和下限,它们可以为-inf和inf;parami,vali是指相关属性名及其属性值,具体的值见书本。
5.dblquad()函数
MATLAB提供的dblquad()函数是用来求解长方形区域的双重积分的。其一般调用格式为:
q = dblquad(fun,xmin,xmax,ymin,ymax,tol,@quadl,p1,p2,...)
其中,输入参数@quadl为具体求解一元积分的数值函数,也可以选择@quad甚至用户自己编写的数值积分求解函数,但要求其调用格式与quadl()函数完全一致,其余参数大致同函数quadl()。
对于一般区域的二重积分,MATLAB提供了quad2d() 函数来求取。该函数的一般调用格式为:
q = quad2d(fun,a,b,c,d,param1,val1,param2,val2,...)
6.现在在新的matlab版本一般用integral,精确度也比较高,可以doc intergral来查看,下面给一个例子:
function f =g(x)
e1 = 0.01;e2 = 0.02;
y_2diff = (-1.*(x+2019.3)/(3189.94^2-((x+2019.38).^2).^(1/2))+1).^(1/2);
f = y_2diff/10/7*(10*(1-e2)*(450-(3189.94^2-((x+2019.38).^2)).^(1/2)+2019.38)-e1*y_2diff*x);
end
命令行中输入
integral(@g,0,450,'ArrayValued',true)
输出
ans= 1.3214e+04。