[Pkg-octave-commit] r2568 - in octave/trunk/debian: . in patches

Rafael Laboissiere rafael at alioth.debian.org
Sat Jan 3 12:17:53 UTC 2009


tags 510577 pending
thanks

Author: rafael
Date: 2009-01-03 12:17:53 +0000 (Sat, 03 Jan 2009)
New Revision: 2568

Added:
   octave/trunk/debian/patches/polyfit-scaling.dpatch
Modified:
   octave/trunk/debian/changelog
   octave/trunk/debian/in/00list
Log:
Add polyfit.m from hg for fixing stability issue

Modified: octave/trunk/debian/changelog
===================================================================
--- octave/trunk/debian/changelog	2009-01-02 16:02:48 UTC (rev 2567)
+++ octave/trunk/debian/changelog	2009-01-03 12:17:53 UTC (rev 2568)
@@ -1,3 +1,12 @@
+octave3.0 (1:3.0.3-2) UNRELEASED; urgency=low
+
+  * debian/patches/polyfit-scaling.dpatch: Add patch for introducing a new
+    polyfit.m taken from the Mercurial upstream repository.  This version
+    has a new algorithm that improves the numerical stability of the
+    results for ill-conditioned input values (closes: #510577).
+
+ -- Rafael Laboissiere <rafael at debian.org>  Sat, 03 Jan 2009 12:28:47 +0100
+
 octave3.0 (1:3.0.3-1) experimental; urgency=low
 
   [ Thomas Weber ]
@@ -3,5 +12,5 @@
   * New upstream release:
     + Improved documentation about axes properties (closes: #492070)
-    + Check that X and Y are of same size when calling contourf 
+    + Check that X and Y are of same size when calling contourf
       (closes: #492223)
     + varargin is now in the manual index (closes: #492992)

Modified: octave/trunk/debian/in/00list
===================================================================
--- octave/trunk/debian/in/00list	2009-01-02 16:02:48 UTC (rev 2567)
+++ octave/trunk/debian/in/00list	2009-01-03 12:17:53 UTC (rev 2568)
@@ -17,6 +17,7 @@
 50_fix_handle_for_plotyy.dpatch
 no_pdf_in_print.dpatch
 dont_set_helvetica.dpatch
+polyfit-scaling.dpatch
 :][V_3_1:
 50_octave-bug-tempfile
 no_pdf_in_print.dpatch

Added: octave/trunk/debian/patches/polyfit-scaling.dpatch
===================================================================
--- octave/trunk/debian/patches/polyfit-scaling.dpatch	                        (rev 0)
+++ octave/trunk/debian/patches/polyfit-scaling.dpatch	2009-01-03 12:17:53 UTC (rev 2568)
@@ -0,0 +1,192 @@
+#! /bin/sh /usr/share/dpatch/dpatch-run
+## -*- diff -*-
+## polyfit-scaling.dpatch by Rafael Laboissiere <rafael at debian.org>
+##
+## DP: Introduce polyfit.m from the Mercurial repository (2008-01-03)
+## DP: with new algorithm for rescaling the input values, which
+## DP: improves stability. Fixes Bug#510577.
+
+ at DPATCH@
+--- octave3.0-3.0.3.orig/scripts/polynomial/polyfit.m
++++ octave3.0-3.0.3/scripts/polynomial/polyfit.m
+@@ -18,30 +18,17 @@
+ ## <http://www.gnu.org/licenses/>.
+ 
+ ## -*- texinfo -*-
+-## @deftypefn {Function File} {[@var{p}, @var{s}] =} polyfit (@var{x}, @var{y}, @var{n})
++## @deftypefn {Function File} {[@var{p}, @var{s}, @var{mu}] =} polyfit (@var{x}, @var{y}, @var{n})
+ ## Return the coefficients of a polynomial @var{p}(@var{x}) of degree
+-## @var{n} that minimizes
+-## @iftex
+-## @tex
+-## $$
+-## \sum_{i=1}^N (p(x_i) - y_i)^2
+-## $$
+-## @end tex
+-## @end iftex
+-## @ifinfo
+-## @code{sumsq (p(x(i)) - y(i))},
+-## @end ifinfo
+-##  to best fit the data in the least squares sense.
++## @var{n} that minimizes the least-squares-error of the fit.
+ ##
+ ## The polynomial coefficients are returned in a row vector.
+ ##
+-## If two output arguments are requested, the second is a structure
+-## containing the following fields:
++## The second output is a structure containing the following fields:
+ ##
+-## @table @code
++## @table @samp
+ ## @item R
+-## The Cholesky factor of the Vandermonde matrix used to compute the
+-## polynomial coefficients.
++## Triangular factor R from the QR decomposition.
+ ## @item X
+ ## The Vandermonde matrix used to compute the polynomial coefficients.
+ ## @item df
+@@ -51,6 +38,17 @@
+ ## @item yf
+ ## The values of the polynomial for each value of @var{x}.
+ ## @end table
++##
++## The second output may be used by @code{polyval} to calculate the 
++## statistical error limits of the predicted values.
++##
++## When the third output, @var{mu}, is present the 
++## coefficients, @var{p}, are associated with a polynomial in
++## @var{xhat} = (@var{x}- at var{mu}(1))/@var{mu}(2).
++## Where @var{mu}(1) = mean (@var{x}), and @var{mu}(2) = std (@var{x}).
++## This linear transformation of @var{x} improves the numerical
++## stability of the fit.
++## @seealso{polyval, residue}
+ ## @end deftypefn
+ 
+ ## Author: KH <Kurt.Hornik at wu-wien.ac.at>
+@@ -59,12 +57,17 @@
+ 
+ function [p, s, mu] = polyfit (x, y, n)
+ 
+-
+-  if (nargin != 3)
++  if (nargin < 3 || nargin > 4)
+     print_usage ();
+   endif
+ 
+-  if (! (isvector (x) && isvector (y) && size_equal (x, y)))
++  if (nargout > 2)
++    ## Normalized the x values.
++    mu = [mean(x), std(x)];
++    x = (x - mu(1)) / mu(2);
++  endif
++
++  if (! size_equal (x, y))
+     error ("polyfit: x and y must be vectors of the same size");
+   endif
+ 
+@@ -74,17 +77,21 @@
+ 
+   y_is_row_vector = (rows (y) == 1);
+ 
+-  l = length (x);
++  ## Reshape x & y into column vectors.
++  l = numel (x);
+   x = reshape (x, l, 1);
+   y = reshape (y, l, 1);
+ 
+-  X = (x * ones (1, n+1)) .^ (ones (l, 1) * (n : -1 : 0));
++  ## Construct the Vandermonde matrix.
++  v = (x * ones (1, n+1)) .^ (ones (l, 1) * (n : -1 : 0));
+ 
+-  p = X \ y;
++  ## Solve by QR decomposition.
++  [q, r, k] = qr (v, 0);
++  p = r \ (y' * q)';
++  p(k) = p;
+ 
+   if (nargout > 1)
+-
+-    yf = X*p;
++    yf = v*p;
+ 
+     if (y_is_row_vector)
+       s.yf = yf.';
+@@ -92,15 +99,73 @@
+       s.yf = yf;
+     endif
+ 
+-    [s.R, dummy] = chol (X'*X);
+-    s.X = X;
++    s.R = r;
++    s.X = v;
+     s.df = l - n - 1;
+     s.normr = norm (yf - y);
+-
+   endif
+ 
+-  ## Return value should be a row vector.
+-
++  ## Return a row vector.
+   p = p.';
+ 
+ endfunction
++
++%!test
++%! x = [-2, -1, 0, 1, 2];
++%! assert(all (all (abs (polyfit (x, x.^2+x+1, 2) - [1, 1, 1]) < sqrt (eps))));
++
++%!error(polyfit ([1, 2; 3, 4], [1, 2, 3, 4], 2))
++
++%!test
++%! x = [-2, -1, 0, 1, 2];
++%! assert(all (all (abs (polyfit (x, x.^2+x+1, 3) - [0, 1, 1, 1]) < sqrt (eps))));
++
++%!test
++%! x = [-2, -1, 0, 1, 2];
++%! fail("polyfit (x, x.^2+x+1)");
++
++%!test
++%! x = [-2, -1, 0, 1, 2];
++%! fail("polyfit (x, x.^2+x+1, [])");
++
++## Test difficult case where scaling is really needed. This example
++## demonstrates the rather poor result which occurs when the dependent
++## variable is not normalized properly.
++## Also check the usage of 2nd & 3rd output arguments.
++%!test
++%! x = [ -1196.4, -1195.2, -1194, -1192.8, -1191.6, -1190.4, -1189.2, -1188, \
++%!       -1186.8, -1185.6, -1184.4, -1183.2, -1182];
++%! y = [ 315571.7086, 315575.9618, 315579.4195, 315582.6206, 315585.4966,    \
++%!       315588.3172, 315590.9326, 315593.5934, 315596.0455, 315598.4201,    \
++%!       315600.7143, 315602.9508, 315605.1765 ];
++%! [p1, s1] = polyfit (x, y, 10);
++%! [p2, s2, mu] = polyfit (x, y, 10);
++%! assert (2*s2.normr < s1.normr)
++
++%!test
++%! x = 1:4;
++%! p0 = [1i, 0, 2i, 4];
++%! y0 = polyval (p0, x);
++%! p = polyfit (x, y0, numel(p0)-1);
++%! assert (p, p0, 1000*eps)
++
++%!test
++%! x = 1000 + (-5:5);
++%! xn = (x - mean (x)) / std (x);
++%! pn = ones (1,5);
++%! y = polyval (pn, xn);
++%! [p, s, mu] = polyfit (x, y, numel(pn)-1);
++%! [p2, s2] = polyfit (x, y, numel(pn)-1);
++%! assert (p, pn, s.normr)
++%! assert (s.yf, y, s.normr)
++%! assert (mu, [mean(x), std(x)])
++%! assert (s.normr/s2.normr < sqrt(eps))
++
++%!test
++%! x = [1, 2, 3; 4, 5, 6];
++%! y = [0, 0, 1; 1, 0, 0];
++%! p = polyfit (x, y, 5);
++%! expected = [0, 1, -14, 65, -112, 60]/12;
++%! assert (p, expected, sqrt(eps))
++
++


Property changes on: octave/trunk/debian/patches/polyfit-scaling.dpatch
___________________________________________________________________
Name: svn:executable
   + *




More information about the Pkg-octave-commit mailing list