Navigation

Operators and Keywords

Function List:

C++ API

 LAPLACIAN   Sparse Negative Laplacian in 1D, 2D, or 3D

    [~,~,A]=LAPLACIAN(N) generates a sparse negative 3D Laplacian matrix
    with Dirichlet boundary conditions, from a rectangular cuboid regular
    grid with j x k x l interior grid points if N = [j k l], using the
    standard 7-point finite-difference scheme,  The grid size is always
    one in all directions.

    [~,~,A]=LAPLACIAN(N,B) specifies boundary conditions with a cell array
    B. For example, B = {'DD' 'DN' 'P'} will Dirichlet boundary conditions
    ('DD') in the x-direction, Dirichlet-Neumann conditions ('DN') in the
    y-direction and period conditions ('P') in the z-direction. Possible
    values for the elements of B are 'DD', 'DN', 'ND', 'NN' and 'P'.

    LAMBDA = LAPLACIAN(N,B,M) or LAPLACIAN(N,M) outputs the m smallest
    eigenvalues of the matrix, computed by an exact known formula, see
    http://en.wikipedia.org/wiki/Eigenvalues_and_eigenvectors_of_the_second_derivative
    It will produce a warning if the mth eigenvalue is equal to the
    (m+1)th eigenvalue. If m is absebt or zero, lambda will be empty.

    [LAMBDA,V] = LAPLACIAN(N,B,M) also outputs orthonormal eigenvectors
    associated with the corresponding m smallest eigenvalues.

    [LAMBDA,V,A] = LAPLACIAN(N,B,M) produces a 2D or 1D negative
    Laplacian matrix if the length of N and B are 2 or 1 respectively.
    It uses the standard 5-point scheme for 2D, and 3-point scheme for 1D.

    % Examples:
    [lambda,V,A] = laplacian([100,45,55],{'DD' 'NN' 'P'}, 20); 
    % Everything for 3D negative Laplacian with mixed boundary conditions.
    laplacian([100,45,55],{'DD' 'NN' 'P'}, 20);
    % or
    lambda = laplacian([100,45,55],{'DD' 'NN' 'P'}, 20);
    % computes the eigenvalues only

    [~,V,~] = laplacian([200 200],{'DD' 'DN'},30);
    % Eigenvectors of 2D negative Laplacian with mixed boundary conditions.

    [~,~,A] = laplacian(200,{'DN'},30);
    % 1D negative Laplacian matrix A with mixed boundary conditions.

    % Example to test if outputs correct eigenvalues and vectors:
    [lambda,V,A] = laplacian([13,10,6],{'DD' 'DN' 'P'},30);
    [Veig D] = eig(full(A)); lambdaeig = diag(D(1:30,1:30));
    max(abs(lambda-lambdaeig))  %checking eigenvalues
    subspace(V,Veig(:,1:30))    %checking the invariant subspace
    subspace(V(:,1),Veig(:,1))  %checking selected eigenvectors
    subspace(V(:,29:30),Veig(:,29:30)) %a multiple eigenvalue 
    
    % Example showing equivalence between laplacian.m and built-in MATLAB
    % DELSQ for the 2D case. The output of the last command shall be 0.
    A1 = delsq(numgrid('S',32)); % input 'S' specifies square grid.
    [~,~,A2] = laplacian([30,30]);
    norm(A1-A2,inf)
    
    Class support for inputs:
    N - row vector float double  
    B - cell array
    M - scalar float double 

    Class support for outputs:
    lambda and V  - full float double, A - sparse float double.

    Note: the actual numerical entries of A fit int8 format, but only
    double data class is currently (2010) supported for sparse matrices. 

    This program is designed to efficiently compute eigenvalues,
    eigenvectors, and the sparse matrix of the (1-3)D negative Laplacian
    on a rectangular grid for Dirichlet, Neumann, and Periodic boundary
    conditions using tensor sums of 1D Laplacians. For more information on
    tensor products, see
    http://en.wikipedia.org/wiki/Kronecker_sum_of_discrete_Laplacians
    For 2D case in MATLAB, see 
    http://www.mathworks.com/access/helpdesk/help/techdoc/ref/kron.html.

    This code is also part of the BLOPEX package: 
    http://en.wikipedia.org/wiki/BLOPEX or directly 
    http://code.google.com/p/blopex/

Package: specfun