X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?a=blobdiff_plain;ds=sidebyside;f=octave_packages%2Fm%2Fgeneral%2Fdblquad.m;fp=octave_packages%2Fm%2Fgeneral%2Fdblquad.m;h=3647e88faced544e5c89fb63b312aeff1fe570bc;hb=1c0469ada9531828709108a4882a751d2816994a;hp=0000000000000000000000000000000000000000;hpb=63de9f36673d49121015e3695f2c336ea92bc278;p=CreaPhase.git diff --git a/octave_packages/m/general/dblquad.m b/octave_packages/m/general/dblquad.m new file mode 100644 index 0000000..3647e88 --- /dev/null +++ b/octave_packages/m/general/dblquad.m @@ -0,0 +1,82 @@ +## Copyright (C) 2008-2012 David Bateman +## +## This file is part of Octave. +## +## Octave is free software; you can redistribute it and/or modify it +## under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 3 of the License, or (at +## your option) any later version. +## +## Octave is distributed in the hope that it will be useful, but +## WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +## General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with Octave; see the file COPYING. If not, see +## . + +## -*- texinfo -*- +## @deftypefn {Function File} {} dblquad (@var{f}, @var{xa}, @var{xb}, @var{ya}, @var{yb}) +## @deftypefnx {Function File} {} dblquad (@var{f}, @var{xa}, @var{xb}, @var{ya}, @var{yb}, @var{tol}) +## @deftypefnx {Function File} {} dblquad (@var{f}, @var{xa}, @var{xb}, @var{ya}, @var{yb}, @var{tol}, @var{quadf}) +## @deftypefnx {Function File} {} dblquad (@var{f}, @var{xa}, @var{xb}, @var{ya}, @var{yb}, @var{tol}, @var{quadf}, @dots{}) +## Numerically evaluate the double integral of @var{f}. +## @var{f} is a function handle, inline function, or string +## containing the name of the function to evaluate. The function @var{f} must +## have the form @math{z = f(x,y)} where @var{x} is a vector and @var{y} is a +## scalar. It should return a vector of the same length and orientation as +## @var{x}. +## +## @var{xa}, @var{ya} and @var{xb}, @var{yb} are the lower and upper limits of +## integration for x and y respectively. The underlying integrator determines +## whether infinite bounds are accepted. +## +## The optional argument @var{tol} defines the absolute tolerance used to +## integrate each sub-integral. The default value is @math{1e^{-6}}. +## +## The optional argument @var{quadf} specifies which underlying integrator +## function to use. Any choice but @code{quad} is available and the default +## is @code{quadcc}. +## +## Additional arguments, are passed directly to @var{f}. To use the default +## value for @var{tol} or @var{quadf} one may pass ':' or an empty matrix ([]). +## @seealso{triplequad, quad, quadv, quadl, quadgk, quadcc, trapz} +## @end deftypefn + +function q = dblquad (f, xa, xb, ya, yb, tol = 1e-6, quadf = @quadcc, varargin) + + if (nargin < 5) + print_usage (); + endif + if (isempty (tol)) + tol = 1e-6; + endif + if (isempty (quadf)) + quadf = @quadcc; + endif + + inner = @__dblquad_inner__; + if (ischar (f)) + f = @(x,y) feval (f, x, y, varargin{:}); + varargin = {}; + endif + + q = feval (quadf, @(y) inner (y, f, xa, xb, tol, quadf, + varargin{:}), ya, yb, tol); +endfunction + +function q = __dblquad_inner__ (y, f, xa, xb, tol, quadf, varargin) + q = zeros (size(y)); + for i = 1 : length (y) + q(i) = feval (quadf, @(x) f(x, y(i), varargin{:}), xa, xb, tol); + endfor +endfunction + +%% Nasty integrand to show quadcc off +%!assert (dblquad (@(x,y) 1 ./ (x+y), 0, 1, 0, 1), 2*log(2), 1e-6) + +%!assert (dblquad (@(x,y) exp(-x.^2 - y.^2) , -1, 1, -1, 1, 1e-6, @quadgk), pi * erf(1).^2, 1e-6) +%!assert (dblquad (@(x,y) exp(-x.^2 - y.^2) , -1, 1, -1, 1, 1e-6, @quadl), pi * erf(1).^2, 1e-6) +%!assert (dblquad (@(x,y) exp(-x.^2 - y.^2) , -1, 1, -1, 1, 1e-6, @quadv), pi * erf(1).^2, 1e-6) +