* Bug #12702 fixed - Optimization: fix for NDcost() 23/12323/5
Paul BIGNIER [Thu, 22 Aug 2013 09:17:07 +0000 (11:17 +0200)]
NDcost did not work when no extra parameters were needed.

Change-Id: Ifac4edea63cc2a570405f6c39cd695f30a6c04c8

scilab/CHANGES_5.5.X
scilab/modules/optimization/help/en_US/NDcost.xml
scilab/modules/optimization/macros/NDcost.sci
scilab/modules/optimization/tests/nonreg_tests/bug_12702.dia.ref [new file with mode: 0644]
scilab/modules/optimization/tests/nonreg_tests/bug_12702.tst [new file with mode: 0644]

index d23005b..8766656 100644 (file)
@@ -511,6 +511,8 @@ Bug fixes
 
 * Bug #12686 fixed - Error returned by diff() fixed.
 
+* Bug #12702 fixed - When no extra parameters were needed in the cost function, NDcost did not work.
+
 * Bug #12703 fixed - In SciNotes, common shortcuts 'SHIFT DELETE', 'SHIFT INSERT' (and others) added.
 
 * Bug #12705 fixed - Function members() added. It allows to find number of occurrences and linear indexes
index ffa165f..a0805ae 100644 (file)
@@ -2,11 +2,11 @@
 <!--
  * Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
  * Copyright (C) 2008 - INRIA
- * 
+ *
  * This file must be used under the terms of the CeCILL.
  * This source file is licensed as described in the file COPYING, which
  * you should have received as part of this distribution.  The terms
- * are also available at    
+ * are also available at
  * http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
  *
  -->
     </refsection>
     <refsection>
         <title>Examples</title>
-        <programlisting role="example"><![CDATA[ 
+        <programlisting role="example"><![CDATA[
 // example #1 (a simple one)
 //function to minimize
 function f=rosenbrock(x,varargin)
   p=varargin(1)
-  f=1+sum( p*(x(2:$)-x(1:$-1)^2)^2 + (1-x(2:$))^2)
+  f=1+sum( p*(x(2:$)-x(1:$-1).^2).^2 + (1-x(2:$)).^2)
 endfunction
 
 x0=[1;2;3;4];
 [f,xopt,gopt]=optim(list(NDcost,rosenbrock,200),x0)
 
 // example #2: This example (by Rainer von Seggern) shows a quick (*) way to
-//             identify the parameters of a linear differential equation with 
+//             identify the parameters of a linear differential equation with
 //             the help of scilab.
 //             The model is a simple damped (linear) oscillator:
 //
 //               x''(t) + c x'(t) + k x(t) = 0 ,
-// 
+//
 // and we write it as a system of two differential equations of first
 // order with y(1) = x, and y(2) = x':
 //
 //     dy1/dt = y(2)
 //     dy2/dt = -c*y(2) -k*y(1).
 //
-// We suppose to have m measurements of x (that is y(1)) at different times 
+// We suppose to have m measurements of x (that is y(1)) at different times
 // t_obs(1), ..., t_obs(m) called x_obs(1), ..., x_obs(m)  (in this example
 // these measuresments will be simulated), and we want to identify the parameters
 // c and k by minimizing the sum of squared errors between x_obs and y1(t_obs,p).
-// 
+//
 // (*) This method is not the most efficient but it is easy to implement.
-// 
+//
 function dy = DEQ(t,y,p)
   // The rhs of our first order differential equation system.
   c =p(1);k=p(2)
@@ -119,20 +119,20 @@ function y=uN(p, t, t0, y0)
   // Numerical solution obtained with ode. (In this linear case an exact analytic
   // solution can easily be found, but ode would also work for "any" system.)
   // Note: the ode output must be an approximation of the solution at
-  //       times given in the vector t=[t(1),...,t($)]  
+  //       times given in the vector t=[t(1),...,t($)]
   y = ode(y0,t0,t,list(DEQ,p))
 endfunction
 
-function r = cost_func(p, t_obs, x_obs, t0, y0) 
+function r = cost_func(p, t_obs, x_obs, t0, y0)
   // This is the function to be minimized, that is the sum of the squared
   // errors between what gives the model and the measuments.
   sol = uN(p, t_obs, t0, y0)
   e = sol(1,:) - x_obs
-  r = sum(e.*e) 
+  r = sum(e.*e)
 endfunction
 
 // Data
-y0 = [10;0]; t0 = 0; // Initial conditions y0 for initial time t0. 
+y0 = [10;0]; t0 = 0; // Initial conditions y0 for initial time t0.
 T = 30;  // Final time for the measurements.
 
 // Here we simulate experimental data, (from which the parameters
@@ -142,15 +142,15 @@ m = 80;  t_obs = linspace(t0+2,T,m); // Observation times
 // Noise: each measurement is supposed to have a (gaussian) random error
 // of mean 0 and std deviation proportional to the magnitude
 // of the value (sigma*|x_exact(t_obs(i))|).
-sigma = 0.1;  
+sigma = 0.1;
 y_exact = uN(pe, t_obs, t0, y0);
 x_obs = y_exact(1,:) + grand(1,m,"nor",0, sigma).*abs(y_exact(1,:));
 
 // Initial guess parameters
-p0 = [0.5 ; 5];  
+p0 = [0.5 ; 5];
 
 // The value of the cost function before optimization:
-cost0 = cost_func(p0, t_obs, x_obs, t0, y0); 
+cost0 = cost_func(p0, t_obs, x_obs, t0, y0);
 mprintf("\n\r The value of the cost function before optimization = %g \n\r",...
 
 // Solution with optim
index 3097382..e93ba84 100644 (file)
@@ -7,10 +7,14 @@
 // are also available at
 // http://www.cecill.info/licences/Licence_CeCILL_V2.1-en.txt
 
-function [f,g,ind]=NDcost(x,ind,fun,varargin)
-    //external for optim
-    //computes gradient using Code differentiation
-    if argn(2)<4 then varargin=list(),end
-    f=fun(x,varargin(:))
-    g=derivative(list(fun,varargin(:)),x)
+function [f, g, ind] = NDcost(x, ind, fun, varargin)
+    // external for optim()
+    // Computes the gradient of 'fun' at 'x' using code differentiation
+    if argn(2) < 4 then
+        f = fun(x);
+        g = derivative(fun, x);
+    else
+        f = fun(x, varargin(:));
+        g = derivative(list(fun, varargin(:)), x);
+    end
 endfunction
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_12702.dia.ref b/scilab/modules/optimization/tests/nonreg_tests/bug_12702.dia.ref
new file mode 100644 (file)
index 0000000..bd026d8
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 12702 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12702
+//
+// <-- Short Description -->
+// When no extra parameters are needed in the cost function, NDcost does not work:
+//
+function f = fun(x)
+    f = x^2;
+endfunction
+// Looking for minimum of f(x) = x^2, which is obviously at x = 0 with f(x) = 0.
+[f, x] = optim(list(NDcost, fun), 1);
+assert_checkalmostequal([f x], [0 0], 0, 1d-20);
diff --git a/scilab/modules/optimization/tests/nonreg_tests/bug_12702.tst b/scilab/modules/optimization/tests/nonreg_tests/bug_12702.tst
new file mode 100644 (file)
index 0000000..bd026d8
--- /dev/null
@@ -0,0 +1,23 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2013 - Scilab Enterprises - Paul Bignier
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+//
+// <-- ENGLISH IMPOSED -->
+//
+// <-- Non-regression test for bug 12702 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/show_bug.cgi?id=12702
+//
+// <-- Short Description -->
+// When no extra parameters are needed in the cost function, NDcost does not work:
+//
+function f = fun(x)
+    f = x^2;
+endfunction
+// Looking for minimum of f(x) = x^2, which is obviously at x = 0 with f(x) = 0.
+[f, x] = optim(list(NDcost, fun), 1);
+assert_checkalmostequal([f x], [0 0], 0, 1d-20);