gusucode.com > 高等数学问题求解源码程序 > CH08/Gauss_legendre.m

    function I=Gauss_legendre(fun,a,b,m,n,varargin)
%GAUSS_LEGENDRE   高斯-勒让德方法计算数值积分
% I=GAUSS_LEGENDRE(FUN,A,B,M)  高斯-勒让德方法计算函数FUN在积分区间[A,B]上的
%                              数值积分,并指定每段高斯点数为M
% I=GAUSS_LEGENDRE(FUN,A,B,M,N)  高斯-勒让德方法计算函数FUN在积分区间[A,B]上的
%                                数值积分,并指定每段高斯点数为M和区间等分数N
% I=GAUSS_LEGENDRE(FUN,A,B,M,N,P1,P2,...)  高斯-勒让德方法计算函数FUN的
%                                          数值积分,其中函数FUN带有附加参数
%
% 输入参数:
%     ---FUN:被积函数
%     ---A,B:积分区间端点
%     ---M:每段高斯点数
%     ---N:等分区间数
%     ---P1,P2,...:函数FUN的附加参数
% 输出参数:
%     ---I:求得的数值积分值
%
% See also InterpolatoryQuad, ComplexQuad

if nargin<5 || isempty(n)
    n=10;
end
switch m
    case 0
        t=0;A=2;
    case 1
        t=[-0.5773502692,0.5773502692];A=[1,1];
    case 2
        t=[-0.7745966692,0,0.7745966692];
        A=[0.5555555556,0.8888888889,0.5555555556];
    case 3
        t=[-0.8611363116,-0.3399810436,0.3399810436,0.8611363116];
        A=[0.3478548451,0.6521451549,0.6521451549,0.3478548451];
    case 4
        t=[-0.9061798459,-0.5384693101,0,0.5384693101,0.9061798459];
        A=[0.2369268851,0.4786286705,0.5688888889,0.4786286705,0.2369268851];
    case 5
        t=[-0.9324695142,-0.6612093865,-0.2386191861,...
            0.2386191861,0.6612093865,0.9324695142];
        A=[0.1713244924,0.3607615370,0.4679139346...
            0.4679139346,0.3607615370,0.1713244924];
    case 6
        t=[-0.9491079123,-0.7415311856,-0.4058451514,0,...
            0.4058451514,0.7415311856,0.9491079123];
        A=[0.1294849662,0.2797053915,0.3818300505,0.4179591837,...
            0.3818300505,0.2797053915,0.1294849662];
    case 7
        t=[-0.9602898565,-0.7966664774,-0.5255354099,0.1834346425,...
            0.1834346425,0.5255354099,0.7966664774,0.9602898565];
        A=[0.1012285363,0.2223810345,0.3137066459,0.3626837834...
            0.3626837834,0.3137066459,0.2223810345,0.1012285363,];
    otherwise
        error('本程序最多仅提供m=7!')
end
h=(b-a)/n;
I=0;
for k=1:n
    F=feval(fun,h/2*t+a+(k-1/2)*h,varargin{:});
    I=I+A*F';
end
I=h/2*I;
web -broswer http://www.ilovematlab.cn/forum-221-1.html