# HG changeset patch # User Rik # Date 1652295297 25200 # Node ID 1fcfe94439179e8137e0a0c8bc9ead3c8abc262a # Parent 1212ed22f9620120c0660e1bc441593a12d3158d quadgk.m: Don't warn about failing to converge if second output ERR is requested (bug #62412) * quadgk.m: Document change in behavior (using the same language as for quadcc). Check number of outputs is less than 2 before issuing warning about failed convergence. Re-code BIST test not to issue a warning about using deprecated "inline" function. Add BIST test for bug #62412. * quadcc.cc (Fquadcc): Make BIST test for bug #62412 a fixed, regression if it fails. Change error bounds on test to be default relative tolerance. diff -r 1212ed22f962 -r 1fcfe9443917 libinterp/corefcn/quadcc.cc --- a/libinterp/corefcn/quadcc.cc Wed May 11 09:45:31 2022 -0700 +++ b/libinterp/corefcn/quadcc.cc Wed May 11 11:54:57 2022 -0700 @@ -2251,11 +2251,11 @@ %! assert (class (quadcc (@sin, 0, single (1))), "single"); %! assert (class (quadcc (@sin, single (0), single (1))), "single"); -%!test<62412> +%!test <*62412> %! f = @(t) -1 ./ t.^1.1; %! fail ("quadcc (f, 1, Inf)", "warning", "Error tolerance not met"); %! [q, err] = quadcc (f, 1, Inf); -%! assert (err > 1); +%! assert (err > 1e-5); ## Test input validation %!error quadcc () diff -r 1212ed22f962 -r 1fcfe9443917 scripts/general/quadgk.m --- a/scripts/general/quadgk.m Wed May 11 09:45:31 2022 -0700 +++ b/scripts/general/quadgk.m Wed May 11 11:54:57 2022 -0700 @@ -123,7 +123,12 @@ ## ## @var{err} is an approximate bound on the error in the integral ## @w{@code{abs (@var{q} - @var{I})}}, where @var{I} is the exact value of the -## integral. +## integral. If the adaptive integration did not converge, the value of +## @var{err} will be larger than the requested tolerance. If only a single +## output is requested then a warning will be emitted when the requested +## tolerance is not met. If the second output @var{err} is requested then no +## warning is issued and it is the responsibility of the programmer to inspect +## and determine whether the results are satisfactory. ## ## Reference: @nospell{L.F. Shampine}, ## @cite{"Vectorized adaptive quadrature in @sc{matlab}"}, Journal of @@ -400,7 +405,7 @@ [q_subs, q_errs] = __quadgk_eval__ (f, subs, eps1, trans); endwhile - if (err > max (abstol, reltol * abs (q))) + if (nargout < 2 && err > max (abstol, reltol * abs (q))) warning (warn_id, "quadgk: Error tolerance not met. Estimated error %g", err); endif @@ -469,7 +474,9 @@ %!assert (quadgk (@sin,-pi,pi), 0, 1e-10) -%!assert (quadgk (inline ("sin"),-pi,pi), 0, 1e-10) +%!test +%! warning ("off", "Octave:legacy-function", "local"); +%! assert (quadgk (inline ("sin"), -pi, pi), 0, 1e-10); %!assert (quadgk ("sin",-pi,pi), 0, 1e-10) %!assert (quadgk (@sin,-pi,pi, "WayPoints", 0, "MaxIntervalCount", 100, %! "RelTol", 1e-3, "AbsTol", 1e-6, "trace", false), 0, 1e-6) @@ -495,6 +502,12 @@ %! f = @(x) x .^ 5 .* exp (-x) .* sin (x); %! assert (quadgk (f, 0, Inf, "RelTol", 1e-8, "AbsTol", 1e-12), -15, -1e-8); +%!test <*62412> +%! f = @(t) -1 ./ t.^1.1; +%! fail ("quadgk (f, 1, Inf)", "warning", "Error tolerance not met"); +%! [q, err] = quadgk (f, 1, Inf); +%! assert (err > 1e-5); + ## Test input validation %!error quadgk (@sin) %!error quadgk (@sin, 0)