diff options
author | Harpreet | 2016-03-03 08:59:34 +0530 |
---|---|---|
committer | Harpreet | 2016-03-03 08:59:34 +0530 |
commit | 7cf9300c2eb4773afa9823cf4a179d43f70001aa (patch) | |
tree | 62f03c9c2df9ffe1c061d346a2059cc0fe862ba0 /macros | |
parent | d0cad398d8df199a4974112bfb7945c18636b5f8 (diff) | |
download | FOSSEE-Optimization-toolbox-7cf9300c2eb4773afa9823cf4a179d43f70001aa.tar.gz FOSSEE-Optimization-toolbox-7cf9300c2eb4773afa9823cf4a179d43f70001aa.tar.bz2 FOSSEE-Optimization-toolbox-7cf9300c2eb4773afa9823cf4a179d43f70001aa.zip |
lsqnonlin added
Diffstat (limited to 'macros')
-rw-r--r-- | macros/fminbnd.bin | bin | 54876 -> 64312 bytes | |||
-rw-r--r-- | macros/fminunc.bin | bin | 60896 -> 69752 bytes | |||
-rw-r--r-- | macros/lib | bin | 864 -> 864 bytes | |||
-rw-r--r-- | macros/lsqcurvefit.bin | bin | 64252 -> 0 bytes | |||
-rw-r--r-- | macros/lsqcurvefit.sci | 439 | ||||
-rw-r--r-- | macros/lsqnonlin.bin | bin | 0 -> 48352 bytes | |||
-rw-r--r-- | macros/lsqnonlin.sci | 317 | ||||
-rw-r--r-- | macros/names | 2 |
8 files changed, 318 insertions, 440 deletions
diff --git a/macros/fminbnd.bin b/macros/fminbnd.bin Binary files differindex 97b00fc..de98f29 100644 --- a/macros/fminbnd.bin +++ b/macros/fminbnd.bin diff --git a/macros/fminunc.bin b/macros/fminunc.bin Binary files differBinary files differindex aa82fc3..3bda54f 100644 --- a/macros/fminunc.bin +++ b/macros/fminunc.bin diff --git a/macros/lsqcurvefit.bin b/macros/lsqcurvefit.bin Binary files differdeleted file mode 100644 index 20a8d0d..0000000 --- a/macros/lsqcurvefit.bin +++ /dev/null diff --git a/macros/lsqcurvefit.sci b/macros/lsqcurvefit.sci deleted file mode 100644 index 10e8e48..0000000 --- a/macros/lsqcurvefit.sci +++ /dev/null @@ -1,439 +0,0 @@ -// Copyright (C) 2015 - IIT Bombay - FOSSEE -// -// 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 -// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt -// Author: Harpreet Singh -// Organization: FOSSEE, IIT Bombay -// Email: toolbox@scilab.in - -function [xopt,resnorm,residual,exitflag,output,lambda] = lsqcurvefit (varargin) - // Solves a non linear data fitting problems. - // - // Calling Sequence - // xopt = lsqcurvefit(fun,x0,xdata,ydata) - // xopt = lsqcurvefit(fun,x0,xdata,ydata,lb,ub) - // xopt = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options) - // [xopt,resnorm] = lsqcurvefit( ... ) - // - // Parameters - // C : a matrix of double, represents the multiplier of the solution x in the expression C⋅x - d. Number of columns in C is equal to the number of elements in x. - // d : a vector of double, represents the additive constant term in the expression C⋅x - d. Number of elements in d is equal to the number of rows in C matrix. - // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b. - // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b. - // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq. - // beq : a vector of double, represents the linear coefficients in the equality constraints Aeq⋅x = beq. - // lb : a vector of double, contains lower bounds of the variables. - // ub : a vector of double, contains upper bounds of the variables. - // x0 : a vector of double, contains initial guess of variables. - // param : a list containing the parameters to be set. - // xopt : a vector of double, the computed solution of the optimization problem. - // resnorm : a double, objective value returned as the scalar value norm(C⋅x-d)^2. - // residual : a vector of double, solution residuals returned as the vector d-C⋅x. - // exitflag : The exit status. See below for details. - // output : The structure consist of statistics about the optimization. See below for details. - // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. - // - // Description - // Search the minimum of a constrained linear least square problem specified by : - // - // <latex> - // \begin{eqnarray} - // &\mbox{min}_{x} - // & 1/2||C⋅x - d||_2^2 \\ - // & \text{subject to} & A⋅x \leq b \\ - // & & Aeq⋅x = beq \\ - // & & lb \leq x \leq ub \\ - // \end{eqnarray} - // </latex> - // - // The routine calls Ipopt for solving the linear least square problem, Ipopt is a library written in C++. - // - // The options allows the user to set various parameters of the Optimization problem. - // It should be defined as type "list" and contains the following fields. - // <itemizedlist> - // <listitem>Syntax : options= list("MaxIter", [---], "CpuTime", [---]);</listitem> - // <listitem>MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take.</listitem> - // <listitem>CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take.</listitem> - // <listitem>Default Values : options = list("MaxIter", [3000], "CpuTime", [600]);</listitem> - // </itemizedlist> - // - // The exitflag allows to know the status of the optimization which is given back by Ipopt. - // <itemizedlist> - // <listitem>exitflag=0 : Optimal Solution Found </listitem> - // <listitem>exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> - // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> - // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> - // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> - // <listitem>exitflag=5 : Converged to a point of local infeasibility.</listitem> - // </itemizedlist> - // - // For more details on exitflag see the ipopt documentation, go to http://www.coin-or.org/Ipopt/documentation/ - // - // The output data structure contains detailed informations about the optimization process. - // It has type "struct" and contains the following fields. - // <itemizedlist> - // <listitem>output.iterations: The number of iterations performed during the search</listitem> - // <listitem>output.constrviolation: The max-norm of the constraint violation.</listitem> - // </itemizedlist> - // - // The lambda data structure contains the Lagrange multipliers at the end - // of optimization. In the current version the values are returned only when the the solution is optimal. - // It has type "struct" and contains the following fields. - // <itemizedlist> - // <listitem>lambda.lower: The Lagrange multipliers for the lower bound constraints.</listitem> - // <listitem>lambda.upper: The Lagrange multipliers for the upper bound constraints.</listitem> - // <listitem>lambda.eqlin: The Lagrange multipliers for the linear equality constraints.</listitem> - // <listitem>lambda.ineqlin: The Lagrange multipliers for the linear inequality constraints.</listitem> - // </itemizedlist> - // - // Examples - // //A simple linear least square example - // C = [ 2 0; - // -1 1; - // 0 2] - // d = [1 - // 0 - // -1]; - // A = [10 -2; - // -2 10]; - // b = [4 - // -4]; - // [xopt,resnorm,residual,exitflag,output,lambda] = lsqlin(C,d,A,b) - // // Press ENTER to continue - // - // Examples - // //A basic example for equality, inequality constraints and variable bounds - // C = [1 1 1; - // 1 1 0; - // 0 1 1; - // 1 0 0; - // 0 0 1] - // d = [89; - // 67; - // 53; - // 35; - // 20;] - // A = [3 2 1; - // 2 3 4; - // 1 2 3]; - // b = [191 - // 209 - // 162]; - // Aeq = [1 2 1]; - // beq = 10; - // lb = repmat(0.1,3,1); - // ub = repmat(4,3,1); - // [xopt,resnorm,residual,exitflag,output,lambda] = lsqlin(C,d,A,b,Aeq,beq,lb,ub) - // Authors - // Harpreet Singh - - - //To check the number of input and output argument - [lhs , rhs] = argn(); - - //To check the number of argument given by user - if ( rhs < 4 | rhs == 5 | rhs == 7 | rhs > 10 ) then - errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [4 6 8 9 10]"), "lsqlin", rhs); - error(errmsg) - end - -// Initializing all the values to empty matrix - C=[]; - d=[]; - A=[]; - b=[]; - Aeq=[]; - beq=[]; - lb=[]; - ub=[]; - x0=[]; - - C = varargin(1); - d = varargin(2); - A = varargin(3); - b = varargin(4); - nbVar = size(C,2); - - if(nbVar == 0) then - errmsg = msprintf(gettext("%s: Cannot determine the number of variables because input objective coefficients is empty"), "lsqlin"); - error(errmsg); - end - - if ( rhs<5 ) then - Aeq = [] - beq = [] - else - Aeq = varargin(5); - beq = varargin(6); - end - - if ( rhs<7 ) then - lb = repmat(-%inf,nbVar,1); - ub = repmat(%inf,nbVar,1); - else - lb = varargin(7); - ub = varargin(8); - end - - - if ( rhs<9 | size(varargin(9)) ==0 ) then - x0 = repmat(0,nbVar,1) - else - x0 = varargin(9); - end - - if ( rhs<10 | size(varargin(10)) ==0 ) then - param = list(); - else - param =varargin(10); - end - - if (size(lb,2)==0) then - lb = repmat(-%inf,nbVar,1); - end - - if (size(ub,2)==0) then - ub = repmat(%inf,nbVar,1); - end - - if (type(param) ~= 15) then - errmsg = msprintf(gettext("%s: param should be a list "), "lsqlin"); - error(errmsg); - end - - //Check type of variables - Checktype("lsqlin", C, "C", 1, "constant") - Checktype("lsqlin", d, "d", 2, "constant") - Checktype("lsqlin", A, "A", 3, "constant") - Checktype("lsqlin", b, "b", 4, "constant") - Checktype("lsqlin", Aeq, "Aeq", 5, "constant") - Checktype("lsqlin", beq, "beq", 6, "constant") - Checktype("lsqlin", lb, "lb", 7, "constant") - Checktype("lsqlin", ub, "ub", 8, "constant") - Checktype("lsqlin", x0, "x0", 9, "constant") - - if (modulo(size(param),2)) then - errmsg = msprintf(gettext("%s: Size of parameters should be even"), "lsqlin"); - error(errmsg); - end - - options = list( "MaxIter" , [3000], ... - "CpuTime" , [600] ... - ); - - for i = 1:(size(param))/2 - - select convstr(param(2*i-1),'l') - case "maxiter" then - options(2*i) = param(2*i); - case "cputime" then - options(2*i) = param(2*i); - else - errmsg = msprintf(gettext("%s: Unrecognized parameter name ''%s''."), "lsqlin", param(2*i-1)); - error(errmsg) - end - end - - nbConInEq = size(A,1); - nbConEq = size(Aeq,1); - - // Check if the user gives row vector - // and Changing it to a column matrix - - if (size(d,2)== [nbVar]) then - d=d'; - end - - if (size(lb,2)== [nbVar]) then - lb = lb'; - end - - if (size(ub,2)== [nbVar]) then - ub = ub'; - end - - if (size(b,2)==nbConInEq) then - b = b'; - end - - if (size(beq,2)== nbConEq) then - beq = beq'; - end - - if (size(x0,2)== [nbVar]) then - x0=x0'; - end - - //Check the size of d which should equal to the number of variable - if ( size(d,1) ~= size(C,1)) then - errmsg = msprintf(gettext("%s: The number of rows in C must be equal the number of elements of d"), "lsqlin"); - error(errmsg); - end - - //Check the size of inequality constraint which should be equal to the number of variables - if ( size(A,2) ~= nbVar & size(A,2) ~= 0) then - errmsg = msprintf(gettext("%s: The number of columns in A must be the same as the number of columns in C"), "lsqlin"); - error(errmsg); - end - - //Check the size of equality constraint which should be equal to the number of variables - if ( size(Aeq,2) ~= nbVar & size(Aeq,2) ~= 0 ) then - errmsg = msprintf(gettext("%s: The number of columns in Aeq must be the same as the number of columns in C"), "lsqlin"); - error(errmsg); - end - - //Check the size of Lower Bound which should be equal to the number of variables - if ( size(lb,1) ~= nbVar) then - errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "lsqlin"); - error(errmsg); - end - - //Check the size of Upper Bound which should equal to the number of variables - if ( size(ub,1) ~= nbVar) then - errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "lsqlin"); - error(errmsg); - end - - //Check the size of constraints of Lower Bound which should equal to the number of constraints - if ( size(b,1) ~= nbConInEq & size(b,1) ~= 0) then - errmsg = msprintf(gettext("%s: The number of rows in A must be the same as the number of elements of b"), "lsqlin"); - error(errmsg); - end - - //Check the size of constraints of Upper Bound which should equal to the number of constraints - if ( size(beq,1) ~= nbConEq & size(beq,1) ~= 0) then - errmsg = msprintf(gettext("%s: The number of rows in Aeq must be the same as the number of elements of beq"), "lsqlin"); - error(errmsg); - end - - //Check the size of initial of variables which should equal to the number of variables - if ( size(x0,1) ~= nbVar) then - warnmsg = msprintf(gettext("%s: Ignoring initial guess of variables as it is not equal to the number of variables"), "lsqlin"); - warning(warnmsg); - x0 = repmat(0,nbVar,1); - end - - //Check if the user gives a matrix instead of a vector - - if ((size(d,1)~=1)& (size(d,2)~=1)) then - errmsg = msprintf(gettext("%s: d should be a vector"), "lsqlin"); - error(errmsg); - end - - if (size(lb,1)~=1)& (size(lb,2)~=1) then - errmsg = msprintf(gettext("%s: Lower Bound should be a vector"), "lsqlin"); - error(errmsg); - end - - if (size(ub,1)~=1)& (size(ub,2)~=1) then - errmsg = msprintf(gettext("%s: Upper Bound should be a vector"), "lsqlin"); - error(errmsg); - end - - if (nbConInEq) then - if ((size(b,1)~=1)& (size(b,2)~=1)) then - errmsg = msprintf(gettext("%s: Constraint Lower Bound should be a vector"), "lsqlin"); - error(errmsg); - end - end - - if (nbConEq) then - if (size(beq,1)~=1)& (size(beq,2)~=1) then - errmsg = msprintf(gettext("%s: Constraint should be a vector"), "lsqlin"); - error(errmsg); - end - end - - for i = 1:nbConInEq - if (b(i) == -%inf) - errmsg = msprintf(gettext("%s: Value of b can not be negative infinity"), "lsqlin"); - error(errmsg); - end - end - - for i = 1:nbConEq - if (beq(i) == -%inf) - errmsg = msprintf(gettext("%s: Value of beq can not be negative infinity"), "lsqlin"); - error(errmsg); - end - end - - for i = 1:nbVar - if(lb(i)>ub(i)) - errmsg = msprintf(gettext("%s: Problem has inconsistent variable bounds"), "lsqlin"); - error(errmsg); - end - end - - //Converting it into Quadratic Programming Problem - - H = C'*C; - f = [-C'*d]'; - op_add = d'*d; - lb = lb'; - ub = ub'; - x0 = x0'; - conMatrix = [Aeq;A]; - nbCon = size(conMatrix,1); - conLB = [beq; repmat(-%inf,nbConInEq,1)]'; - conUB = [beq;b]' ; - [xopt,fopt,status,iter,Zl,Zu,lmbda] = solveqp(nbVar,nbCon,H,f,conMatrix,conLB,conUB,lb,ub,x0,options); - - xopt = xopt'; - residual = d-C*xopt; - resnorm = residual'*residual; - exitflag = status; - output = struct("Iterations" , [], .. - "ConstrViolation" ,[]); - output.Iterations = iter; - output.ConstrViolation = max([0;norm(Aeq*xopt-beq, 'inf');(lb'-xopt);(xopt-ub');(A*xopt-b)]); - lambda = struct("lower" , [], .. - "upper" , [], .. - "eqlin" , [], .. - "ineqlin" , []); - - lambda.lower = Zl; - lambda.upper = Zu; - lambda.eqlin = lmbda(1:nbConEq); - lambda.ineqlin = lmbda(nbConEq+1:nbCon); - - select status - case 0 then - printf("\nOptimal Solution Found.\n"); - case 1 then - printf("\nMaximum Number of Iterations Exceeded. Output may not be optimal.\n"); - case 2 then - printf("\nMaximum CPU Time exceeded. Output may not be optimal.\n"); - case 3 then - printf("\nStop at Tiny Step\n"); - case 4 then - printf("\nSolved To Acceptable Level\n"); - case 5 then - printf("\nConverged to a point of local infeasibility.\n"); - case 6 then - printf("\nStopping optimization at current point as requested by user.\n"); - case 7 then - printf("\nFeasible point for square problem found.\n"); - case 8 then - printf("\nIterates diverging; problem might be unbounded.\n"); - case 9 then - printf("\nRestoration Failed!\n"); - case 10 then - printf("\nError in step computation (regularization becomes too large?)!\n"); - case 12 then - printf("\nProblem has too few degrees of freedom.\n"); - case 13 then - printf("\nInvalid option thrown back by Ipopt\n"); - case 14 then - printf("\nNot enough memory.\n"); - case 15 then - printf("\nINTERNAL ERROR: Unknown SolverReturn value - Notify Ipopt Authors.\n"); - else - printf("\nInvalid status returned. Notify the Toolbox authors\n"); - break; - end - -endfunction diff --git a/macros/lsqnonlin.bin b/macros/lsqnonlin.bin Binary files differnew file mode 100644 index 0000000..2cc1f1c --- /dev/null +++ b/macros/lsqnonlin.bin diff --git a/macros/lsqnonlin.sci b/macros/lsqnonlin.sci new file mode 100644 index 0000000..50a1a49 --- /dev/null +++ b/macros/lsqnonlin.sci @@ -0,0 +1,317 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// 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 +// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: toolbox@scilab.in + +function [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin (varargin) + // Solves a non linear data fitting problems. + // + // Calling Sequence + // xopt = lsqnonlin(fun,x0) + // xopt = lsqnonlin(fun,x0,lb,ub) + // xopt = lsqnonlin(fun,x0,lb,ub,options) + // [xopt,resnorm] = lsqnonlin( ... ) + // [xopt,resnorm,residual] = lsqnonlin( ... ) + // [xopt,resnorm,residual,exitflag] = lsqnonlin( ... ) + // [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin( ... ) + // + // Parameters + // fun : a function, representing the objective function and gradient (if given) of the problem + // x0 : a vector of double, contains initial guess of variables. + // lb : a vector of double, contains lower bounds of the variables. + // ub : a vector of double, contains upper bounds of the variables. + // options : a list containing the parameters to be set. + // xopt : a vector of double, the computed solution of the optimization problem. + // resnorm : a double, objective value returned as the scalar value i.e. sum(fun(x).^2). + // residual : a vector of double, solution of objective function i.e. fun(x). + // exitflag : The exit status. See below for details. + // output : The structure consist of statistics about the optimization. See below for details. + // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details. + // gradient : a vector of doubles, containing the Objective's gradient of the solution. + // + // Description + // Search the minimum of a constrained non-linear least square problem specified by : + // + // <latex> + // \begin{eqnarray} + // &\mbox{min}_{x} + // & (f_1(x)^2 + f_2(x)^2 + ... + f_n(x)^2) \\ + // & lb \leq x \leq ub \\ + // \end{eqnarray} + // </latex> + // + // The routine calls fmincon which calls Ipopt for solving the non-linear least square problem, Ipopt is a library written in C++. + // + // The options allows the user to set various parameters of the Optimization problem. + // It should be defined as type "list" and contains the following fields. + // <itemizedlist> + // <listitem>Syntax : options= list("MaxIter", [---], "CpuTime", [---],"GradObj", "on");</listitem> + // <listitem>MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take.</listitem> + // <listitem>CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take.</listitem> + // <listitem>GradObj : a string, representing the gradient function is on or off.</listitem> + // <listitem>Default Values : options = list("MaxIter", [3000], "CpuTime", [600], "GradObj", "off");</listitem> + // </itemizedlist> + // + // The exitflag allows to know the status of the optimization which is given back by Ipopt. + // <itemizedlist> + // <listitem>exitflag=0 : Optimal Solution Found </listitem> + // <listitem>exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</listitem> + // <listitem>exitflag=3 : Stop at Tiny Step.</listitem> + // <listitem>exitflag=4 : Solved To Acceptable Level.</listitem> + // <listitem>exitflag=5 : Converged to a point of local infeasibility.</listitem> + // </itemizedlist> + // + // For more details on exitflag see the ipopt documentation, go to http://www.coin-or.org/Ipopt/documentation/ + // + // The output data structure contains detailed informations about the optimization process. + // It has type "struct" and contains the following fields. + // <itemizedlist> + // <listitem>output.iterations: The number of iterations performed during the search</listitem> + // <listitem>output.constrviolation: The max-norm of the constraint violation.</listitem> + // </itemizedlist> + // + // The lambda data structure contains the Lagrange multipliers at the end + // of optimization. In the current version the values are returned only when the the solution is optimal. + // It has type "struct" and contains the following fields. + // <itemizedlist> + // <listitem>lambda.lower: The Lagrange multipliers for the lower bound constraints.</listitem> + // <listitem>lambda.upper: The Lagrange multipliers for the upper bound constraints.</listitem> + // </itemizedlist> + // + // Examples + // //A simple non-linear least square example taken from leastsq default present in scilab + // function y=yth(t, x) + // y = x(1)*exp(-x(2)*t) + // endfunction + // // we have the m measures (ti, yi): + // m = 10; + // tm = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5]'; + // ym = [0.79, 0.59, 0.47, 0.36, 0.29, 0.23, 0.17, 0.15, 0.12, 0.08]'; + // // measure weights (here all equal to 1...) + // wm = ones(m,1); + // // and we want to find the parameters x such that the model fits the given + // // data in the least square sense: + // // + // // minimize f(x) = sum_i wm(i)^2 ( yth(tm(i),x) - ym(i) )^2 + // // initial parameters guess + // x0 = [1.5 ; 0.8]; + // // in the first examples, we define the function fun and dfun + // // in scilab language + // function y=myfun(x, tm, ym, wm) + // y = wm.*( yth(tm, x) - ym ) + // endfunction + // // the simplest call + // [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin(myfun,x0) + // // Press ENTER to continue + // + // Examples + // //A basic example taken from leastsq default present in scilab with gradient + // function y=yth(t, x) + // y = x(1)*exp(-x(2)*t) + // endfunction + // // we have the m measures (ti, yi): + // m = 10; + // tm = [0.25, 0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.25, 2.5]'; + // ym = [0.79, 0.59, 0.47, 0.36, 0.29, 0.23, 0.17, 0.15, 0.12, 0.08]'; + // // measure weights (here all equal to 1...) + // wm = ones(m,1); + // // and we want to find the parameters x such that the model fits the given + // // data in the least square sense: + // // + // // minimize f(x) = sum_i wm(i)^2 ( yth(tm(i),x) - ym(i) )^2 + // // initial parameters guess + // x0 = [1.5 ; 0.8]; + // // in the first examples, we define the function fun and dfun + // // in scilab language + // function [y,dy]=myfun(x, tm, ym, wm) + // y = wm.*( yth(tm, x) - ym ) + // v = wm.*exp(-x(2)*tm) + // dy = [v , -x(1)*tm.*v] + // endfunction + // options = list("GradObj", "on") + // [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin(myfun,x0,[],[],options) + // Authors + // Harpreet Singh + + + //To check the number of input and output argument + [lhs , rhs] = argn(); + + //To check the number of argument given by user + if ( rhs < 2 | rhs == 3 | rhs > 5 ) then + errmsg = msprintf(gettext("%s: Unexpected number of input arguments : %d provided while should be in the set of [2 4 5]"), "lsqnonlin", rhs); + error(errmsg) + end + +// Initializing all the values to empty matrix + + + _fun = varargin(1); + x0 = varargin(2); + nbVar = size(x0,'*'); + + if(nbVar == 0) then + errmsg = msprintf(gettext("%s: Cannot determine the number of variables because input initial guess is empty"), "lsqcurvefit"); + error(errmsg); + end + + if (size(x0,2)~=1) then + errmsg = msprintf(gettext("%s: Initial Guess should be a column matrix"), "lsqcurvefit"); + error(errmsg); + end + + if ( rhs<3 ) then + lb = repmat(-%inf,nbVar,1); + ub = repmat(%inf,nbVar,1); + else + lb = varargin(3); + ub = varargin(4); + end + + if ( rhs<7 | size(varargin(5)) ==0 ) then + param = list(); + else + param =varargin(5); + end + + if (size(lb,2)==0) then + lb = repmat(-%inf,nbVar,1); + end + + if (size(ub,2)==0) then + ub = repmat(%inf,nbVar,1); + end + + if (type(param) ~= 15) then + errmsg = msprintf(gettext("%s: param should be a list "), "lsqnonlin"); + error(errmsg); + end + + //Check type of variables + Checktype("lsqnonlin", _fun, "fun", 1, "function") + Checktype("lsqnonlin", x0, "x0", 2, "constant") + Checktype("lsqnonlin", lb, "lb", 3, "constant") + Checktype("lsqnonlin", ub, "ub", 4, "constant") + + if (modulo(size(param),2)) then + errmsg = msprintf(gettext("%s: Size of parameters should be even"), "lsqnonlin"); + error(errmsg); + end + + options = list( "MaxIter" , [3000], ... + "CpuTime" , [600], ... + "GradObj" , ["off"]); + + for i = 1:(size(param))/2 + + select convstr(param(2*i-1),'l') + case "maxiter" then + options(2*i) = param(2*i); + Checktype("lsqcurvefit", param(2*i), "maxiter", i, "constant") + case "cputime" then + options(2*i) = param(2*i); + Checktype("lsqcurvefit", param(2*i), "cputime", i, "constant") + case "gradobj" then + if (convstr(param(2*i))=="on") then + options(2*i) = "on"; + else + errmsg = msprintf(gettext("%s: Unrecognized String [%s] entered for gradobj."), "lsqnonlin",param(2*i)); + error(errmsg); + end + else + errmsg = msprintf(gettext("%s: Unrecognized parameter name ''%s''."), "lsqnonlin", param(2*i-1)); + error(errmsg) + end + end + + // Check if the user gives row vector + // and Changing it to a column matrix + + if (size(lb,2)== [nbVar]) then + lb = lb(:); + end + + if (size(ub,2)== [nbVar]) then + ub = ub(:); + end + + //To check the match between fun (1st Parameter) and x0 (2nd Parameter) + if(execstr('init=_fun(x0)','errcatch')==21) then + errmsg = msprintf(gettext("%s: Objective function and x0 did not match"), "fmincon"); + error(errmsg); + end + + ierr = execstr('init=_fun(x0)', "errcatch") + if ierr <> 0 then + lamsg = lasterror(); + lclmsg = "%s: Error while evaluating the function: ""%s""\n"; + error(msprintf(gettext(lclmsg), "lsqnonlin", lamsg)); + end + + //Check the size of Lower Bound which should be equal to the number of variables + if ( size(lb,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Lower Bound is not equal to the number of variables"), "lsqnonlin"); + error(errmsg); + end + + //Check the size of Upper Bound which should equal to the number of variables + if ( size(ub,1) ~= nbVar) then + errmsg = msprintf(gettext("%s: The Upper Bound is not equal to the number of variables"), "lsqnonlin"); + error(errmsg); + end + + //Check if the user gives a matrix instead of a vector + + if (size(lb,1)~=1)& (size(lb,2)~=1) then + errmsg = msprintf(gettext("%s: Lower Bound should be a vector"), "lsqnonlin"); + error(errmsg); + end + + if (size(ub,1)~=1)& (size(ub,2)~=1) then + errmsg = msprintf(gettext("%s: Upper Bound should be a vector"), "lsqnonlin"); + error(errmsg); + end + + for i = 1:nbVar + if(lb(i)>ub(i)) + errmsg = msprintf(gettext("%s: Problem has inconsistent variable bounds"), "lsqnonlin"); + error(errmsg); + end + end + + //Converting it into fmincon Problem + function [y] = __fun(x) + [xVal] = _fun(x); + y = sum(xVal.^2); + endfunction + + if (options(6) == "on") + ierr = execstr('[initx initdx]=_fun(x0)', "errcatch") + if ierr <> 0 then + lamsg = lasterror(); + lclmsg = "%s: Error while evaluating the function: ""%s""\n"; + error(msprintf(gettext(lclmsg), "lsqnonlin", lamsg)); + end + function [dy] = __fGrad(x) + [x_user,dx_user] = _fun(x) + dy = 2*dx_user*(x_user'); + endfunction + options(6) = __fGrad; + end + + + [xopt,fopt,exitflag,output,lambda_fmincon,gradient] = fmincon(__fun,x0,[],[],[],[],lb,ub,[],options); + + lambda = struct("lower", lambda_fmincon.lower,"upper",lambda_fmincon.upper); + + resnorm = sum(_fun(xopt).^2); + residual = _fun(xopt); + +endfunction diff --git a/macros/names b/macros/names index 36793aa..dc01f55 100644 --- a/macros/names +++ b/macros/names @@ -9,8 +9,8 @@ fmincon fminimax fminunc linprog -lsqcurvefit lsqlin +lsqnonlin lsqnonneg matrix_linprog mps_linprog |