You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
2.5 KiB
77 lines
2.5 KiB
function [ Xq,Wq,pExact ] = GaussLegendreQuad1D( N,a,b )
|
|
%function [ Xq,Wq,pExact ] = GaussLegendreQuad1D( N,a,b ) generates the
|
|
%Gaussian quadrature scheme based on the Legendre nodes containing N points
|
|
%and weights which is accurate up to degree p = 2*N-1. The interval of
|
|
%integration is [a,b]. If a and be are not specified by the user, the
|
|
%default interval is [0,1].
|
|
%
|
|
% Inputs: N - Number of quadrature points and weights desired
|
|
% a - left endpoint of integration interval (default a = 0)
|
|
% b - right endpoint of integration interval (default b = 1)
|
|
%
|
|
% Outputs: Xq - list of N quadrature nodes
|
|
% Wq - list of N quadrature weights
|
|
% pExact - polynomial exactness of quadrature scheme (p = 2*N-1)
|
|
%
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
% Testing code
|
|
%
|
|
% N = 3;
|
|
%
|
|
% [ Xq,Wq,pExact ] = GaussLegendreQuad1D( N );
|
|
%
|
|
% plot(Xq,0,'ro')
|
|
%
|
|
% f =@(x) x.^pExact;
|
|
%
|
|
% x = linspace(0,1);
|
|
% ExactInt = 1/(pExact+1);
|
|
% QuadInt = Wq*f(Xq);
|
|
%
|
|
% fprintf('function: x^%d \n', pExact)
|
|
% fprintf('Exact Integral: %e \n',ExactInt);
|
|
% fprintf('Approx. Integral: %e \n',QuadInt);
|
|
% fprintf('Error: %e \n',abs(ExactInt-QuadInt));
|
|
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
|
%
|
|
%Based on the algorithm introduced in:
|
|
% Golub, Gene H., and John H. Welsch. "Calculation of Gauss quadrature rules."
|
|
% Mathematics of computation 23.106 (1969): 221-230.
|
|
%
|
|
% Written by: Joseph Benzaken
|
|
% Last Updated: 5/4/16
|
|
%
|
|
% CMGLab
|
|
|
|
% if no specified interval of integration, set to default of [0,1]
|
|
if nargin == 1
|
|
a = 0;
|
|
b = 1;
|
|
end
|
|
|
|
%initialize arrays to store reccurence coefficients
|
|
alpha = zeros(N,1);
|
|
beta = zeros(N,1);
|
|
|
|
%Legendre 3-term recursion relationship
|
|
for i=1:N
|
|
alpha(i) = 0;
|
|
beta(i) = (i-1)^2/(4*(i-1)^2-1);
|
|
end
|
|
|
|
%assemble Jacobi matrix
|
|
Tjacobi = diag(alpha) + sqrt(diag(beta(2:end),1)) + sqrt(diag(beta(2:end),-1));
|
|
|
|
[U,V]=eig(Tjacobi); %compute eigenvalues and eigenvectors of Jacobi matrix
|
|
|
|
Xq = toStandardInterval(diag(V),-1,1,a,b); %quadrature nodes are eigenvalues
|
|
Wq = (b-a)*U(1,:).^2; %quadrature weights are first component of eigenvectors squared and scaled by appropriate interval
|
|
pExact = 2*N-1; %polynomial exactness is 2*N-1
|
|
end
|
|
|
|
function [ stdX ] = toStandardInterval( X,oldMin,oldMax,newMin,newMax )
|
|
%function [ stdX ] = toStandardInterval( X,oldMin,oldMax,newMin,newMax )
|
|
% Linearly maps X in [oldMin,oldMax] to stdX in [newMin,newMax]
|
|
stdX = (newMax-newMin)/(oldMax-oldMin)*(X-oldMin)+newMin;
|
|
|
|
end
|