www.gusucode.com > 高等数学问题求解源码程序 > CH08/ComplexQuad.m
function [I,str]=ComplexQuad(varargin) %COMPLEXQUAD 复化求积方法求解定积分 % I=COMPLEXQUAD(X,Y,TYPE) 使用指定的复化求积方法求离散数据的数值积分 % I=COMPLEXQUAD(FUN,A,B,N,TYPE) 使用指定的复化求积方法求函数FUN的数值积分 % [I,STR]=COMPLEXQUAD(...) 使用复化求积方法求数值积分并返回所采用的复化方法 % % 输入参数: % ---X,Y:观测数据,等长向量 % ---FUN:被积函数 % ---A,B:积分下限和上限 % ---N:积分区间等分数 % ---TYPE:指定的复化方法类型,有以下取值: % 1.'trape'或1:复化梯形求积 % 2.'simpson'或2:复化辛普森求积 % 3.'cotes'或4:复化Cotes求积 % 输出参数: % ---I:返回的数值积分值 % ---STR:返回的复化方法 % % See also InterpolatoryQuad args=varargin; type=args{end}; num=[1,2,4]; S={'trape','simpson','cotes'}; if ~isnumeric(type) I=ismember(S,type); n=num(I==1); else n=type; end if isnumeric(args{1}) x=args{1}; y=args{2}; N=length(x); if rem(N-1,n)~=0 error('数据的长度与所选的求积方法不匹配.') end Nn=(N-1)/n; h=(x(N)-x(1))/Nn; else [fun,a,b,Nn]=deal(args{1:end-1}); h=(b-a)/Nn; x=a+h/n*(0:n*Nn); N=length(x); y=feval(fun,x); end switch lower(type) case {1,'trape'} str='复化梯形求积'; I=h*[1,2*ones(1,Nn-1),1]*y'/2; case {2,'simpson'} str='复化辛普森求积'; a=[1,reshape([4*ones(1,Nn-1);2*ones(1,Nn-1)],1,[]),4,1]; I=h/6*a*y'; case {4,'cotes'} str='复化Cotes求积'; a=[7,reshape([32*ones(1,Nn-1);12*ones(1,Nn-1);... 32*ones(1,Nn-1);14*ones(1,Nn-1)],1,N-5),32,12,32,7]; I=h/90*a*y'; otherwise error('Illegal options.') end web -broswer http://www.ilovematlab.cn/forum-221-1.html