From 7cf9300c2eb4773afa9823cf4a179d43f70001aa Mon Sep 17 00:00:00 2001 From: Harpreet Date: Thu, 3 Mar 2016 08:59:34 +0530 Subject: lsqnonlin added --- demos/lsqnonlin.dem.sce | 57 +++ help/en_US/lsqnonlin.xml | 199 ++++++++++ help/en_US/master_help.xml | 2 + help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS | Bin 6704 -> 6940 bytes .../scilab_en_US_help/JavaHelpSearch/DOCS.TAB | Bin 917 -> 944 bytes .../en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS | Bin 256 -> 264 bytes .../scilab_en_US_help/JavaHelpSearch/POSITIONS | Bin 36124 -> 37635 bytes help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA | 2 +- help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP | Bin 16384 -> 18432 bytes .../scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png | Bin 0 -> 1932 bytes help/en_US/scilab_en_US_help/index.html | 6 + help/en_US/scilab_en_US_help/jhelpmap.jhm | 1 + help/en_US/scilab_en_US_help/jhelptoc.xml | 1 + help/en_US/scilab_en_US_help/lsqlin.html | 4 +- help/en_US/scilab_en_US_help/lsqnonlin.html | 181 +++++++++ help/en_US/scilab_en_US_help/lsqnonneg.html | 4 +- .../section_19f4f1e5726c01d683e8b82be0a7e910.html | 6 + jar/scilab_en_US_help.jar | Bin 226390 -> 234046 bytes macros/fminbnd.bin | Bin 54876 -> 64312 bytes macros/fminunc.bin | Bin 60896 -> 69752 bytes macros/lib | Bin 864 -> 864 bytes macros/lsqcurvefit.bin | Bin 64252 -> 0 bytes macros/lsqcurvefit.sci | 439 --------------------- macros/lsqnonlin.bin | Bin 0 -> 48352 bytes macros/lsqnonlin.sci | 317 +++++++++++++++ macros/names | 2 +- tests/general_tests/fmincon/fmincon_grad1.sce | 44 +++ tests/general_tests/fmincon/fmincon_grad2.sce | 44 +++ tests/general_tests/fmincon/fmincon_gradcon1.sce | 44 +++ tests/general_tests/fmincon/fmincon_gradcon2.sce | 44 +++ tests/general_tests/fmincon/fmincon_gradcon3.sce | 44 +++ tests/general_tests/fmincon/fmincon_hess1.sce | 44 +++ tests/general_tests/fmincon/fmincon_hess2.sce | 44 +++ tests/general_tests/fmincon/fmincon_nlc1.sce | 44 +++ tests/general_tests/fmincon/fmincon_nlc2.sce | 44 +++ tests/general_tests/fmincon/fmincon_nlc3.sce | 44 +++ tests/general_tests/fmincon/fmincon_nlc4.sce | 40 ++ tests/general_tests/fmincon/fmincon_options1.sce | 44 +++ tests/general_tests/fmincon/fmincon_options2.sce | 44 +++ tests/unit_tests/lsqnonlin.dia.ref | 83 ++++ tests/unit_tests/lsqnonlin.tst | 83 ++++ 41 files changed, 1510 insertions(+), 445 deletions(-) create mode 100644 demos/lsqnonlin.dem.sce create mode 100644 help/en_US/lsqnonlin.xml create mode 100644 help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png create mode 100644 help/en_US/scilab_en_US_help/lsqnonlin.html delete mode 100644 macros/lsqcurvefit.bin delete mode 100644 macros/lsqcurvefit.sci create mode 100644 macros/lsqnonlin.bin create mode 100644 macros/lsqnonlin.sci create mode 100644 tests/general_tests/fmincon/fmincon_grad1.sce create mode 100644 tests/general_tests/fmincon/fmincon_grad2.sce create mode 100644 tests/general_tests/fmincon/fmincon_gradcon1.sce create mode 100644 tests/general_tests/fmincon/fmincon_gradcon2.sce create mode 100644 tests/general_tests/fmincon/fmincon_gradcon3.sce create mode 100644 tests/general_tests/fmincon/fmincon_hess1.sce create mode 100644 tests/general_tests/fmincon/fmincon_hess2.sce create mode 100644 tests/general_tests/fmincon/fmincon_nlc1.sce create mode 100644 tests/general_tests/fmincon/fmincon_nlc2.sce create mode 100644 tests/general_tests/fmincon/fmincon_nlc3.sce create mode 100644 tests/general_tests/fmincon/fmincon_nlc4.sce create mode 100644 tests/general_tests/fmincon/fmincon_options1.sce create mode 100644 tests/general_tests/fmincon/fmincon_options2.sce create mode 100644 tests/unit_tests/lsqnonlin.dia.ref create mode 100644 tests/unit_tests/lsqnonlin.tst diff --git a/demos/lsqnonlin.dem.sce b/demos/lsqnonlin.dem.sce new file mode 100644 index 0000000..a650e63 --- /dev/null +++ b/demos/lsqnonlin.dem.sce @@ -0,0 +1,57 @@ +mode(1) +// +// Demo of lsqnonlin.sci +// + +//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 +halt() // Press return to continue + +//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) +//========= E N D === O F === D E M O =========// diff --git a/help/en_US/lsqnonlin.xml b/help/en_US/lsqnonlin.xml new file mode 100644 index 0000000..d7b8110 --- /dev/null +++ b/help/en_US/lsqnonlin.xml @@ -0,0 +1,199 @@ + + + + + + + + lsqnonlin + 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 : + + + +\begin{eqnarray} +&\mbox{min}_{x} +& (f_1(x)^2 + f_2(x)^2 + ... + f_n(x)^2) \\ +& lb \leq x \leq ub \\ +\end{eqnarray} + + + +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. + +Syntax : options= list("MaxIter", [---], "CpuTime", [---],"GradObj", "on"); +MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take. +CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take. +GradObj : a string, representing the gradient function is on or off. +Default Values : options = list("MaxIter", [3000], "CpuTime", [600], "GradObj", "off"); + + + +The exitflag allows to know the status of the optimization which is given back by Ipopt. + +exitflag=0 : Optimal Solution Found +exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal. +exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal. +exitflag=3 : Stop at Tiny Step. +exitflag=4 : Solved To Acceptable Level. +exitflag=5 : Converged to a point of local infeasibility. + + + +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. + +output.iterations: The number of iterations performed during the search +output.constrviolation: The max-norm of the constraint violation. + + + +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. + +lambda.lower: The Lagrange multipliers for the lower bound constraints. +lambda.upper: The Lagrange multipliers for the upper bound constraints. + + + + + + + + Examples + + + + + Examples + + + + + Authors + + Harpreet Singh + + + diff --git a/help/en_US/master_help.xml b/help/en_US/master_help.xml index 73ec952..48de693 100644 --- a/help/en_US/master_help.xml +++ b/help/en_US/master_help.xml @@ -8,6 +8,7 @@ + @@ -94,6 +95,7 @@ &a14f1077f437dbe35eb1cac51fed7a9fc; &aa809ed678033fc05c9b60a71de55b2ce; &a3d4ec65684b561d91f7a255acd23f51c; +&aa63ebf0c6a638d0a3a932f61b6b4cc92; &aa4a031935f5eed6cfc8fc4a49823b00b; &a6b85f6e0c98751f20b68663a23cb4cd2; &a8549a3935858ed104f4749ca2243456a; diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS index a5dd8d0..e9d664b 100644 Binary files a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS and b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS differ diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB index 497453b..8bc08b5 100644 Binary files a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB and b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB differ diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS index 48d2dc4..cb6bcfa 100644 Binary files a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS and b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS differ diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS index b391d86..7979ee5 100644 Binary files a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS and b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS differ diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA b/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA index 9c2220b..00ccabf 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA @@ -1,2 +1,2 @@ JavaSearch 1.0 -TMAP bs=2048 rt=1 fl=-1 id1=1479 id2=1 +TMAP bs=2048 rt=1 fl=-1 id1=1516 id2=1 diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP b/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP index bed7ce2..26a946f 100644 Binary files a/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP and b/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP differ diff --git a/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png b/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png new file mode 100644 index 0000000..02e04b1 Binary files /dev/null and b/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png differ diff --git a/help/en_US/scilab_en_US_help/index.html b/help/en_US/scilab_en_US_help/index.html index 7bbe95e..d257dff 100644 --- a/help/en_US/scilab_en_US_help/index.html +++ b/help/en_US/scilab_en_US_help/index.html @@ -74,6 +74,12 @@ +
  • lsqnonlinSolves a non linear data fitting problems.
  • + + + + +
  • lsqnonnegSolves nonnegative least-squares curve fitting problems.
  • diff --git a/help/en_US/scilab_en_US_help/jhelpmap.jhm b/help/en_US/scilab_en_US_help/jhelpmap.jhm index f46a5e3..ff67fca 100644 --- a/help/en_US/scilab_en_US_help/jhelpmap.jhm +++ b/help/en_US/scilab_en_US_help/jhelpmap.jhm @@ -10,6 +10,7 @@ + diff --git a/help/en_US/scilab_en_US_help/jhelptoc.xml b/help/en_US/scilab_en_US_help/jhelptoc.xml index c4d5a12..6e158e1 100644 --- a/help/en_US/scilab_en_US_help/jhelptoc.xml +++ b/help/en_US/scilab_en_US_help/jhelptoc.xml @@ -10,6 +10,7 @@ + diff --git a/help/en_US/scilab_en_US_help/lsqlin.html b/help/en_US/scilab_en_US_help/lsqlin.html index 1343385..2030acd 100644 --- a/help/en_US/scilab_en_US_help/lsqlin.html +++ b/help/en_US/scilab_en_US_help/lsqlin.html @@ -20,7 +20,7 @@ - lsqnonneg >> + lsqnonlin >> @@ -165,7 +165,7 @@ It has type "struct" and contains the following fields. - lsqnonneg >> + lsqnonlin >> diff --git a/help/en_US/scilab_en_US_help/lsqnonlin.html b/help/en_US/scilab_en_US_help/lsqnonlin.html new file mode 100644 index 0000000..fb058f4 --- /dev/null +++ b/help/en_US/scilab_en_US_help/lsqnonlin.html @@ -0,0 +1,181 @@ + + + lsqnonlin + + + +
    + + + + +
    + << lsqlin + + + FOSSEE Optimization Toolbox + + + lsqnonneg >> + +
    +
    +
    + + + + FOSSEE Optimization Toolbox >> FOSSEE Optimization Toolbox > lsqnonlin + +

    +

    lsqnonlin

    +

    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 :

    +

    +

    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. +

    • Syntax : options= list("MaxIter", [---], "CpuTime", [---],"GradObj", "on");
    • +
    • MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take.
    • +
    • CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take.
    • +
    • GradObj : a string, representing the gradient function is on or off.
    • +
    • Default Values : options = list("MaxIter", [3000], "CpuTime", [600], "GradObj", "off");

    +

    The exitflag allows to know the status of the optimization which is given back by Ipopt. +

    • exitflag=0 : Optimal Solution Found
    • +
    • exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal.
    • +
    • exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.
    • +
    • exitflag=3 : Stop at Tiny Step.
    • +
    • exitflag=4 : Solved To Acceptable Level.
    • +
    • exitflag=5 : Converged to a point of local infeasibility.

    +

    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. +

    • output.iterations: The number of iterations performed during the search
    • +
    • output.constrviolation: The max-norm of the constraint violation.

    +

    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. +

    • lambda.lower: The Lagrange multipliers for the lower bound constraints.
    • +
    • lambda.upper: The Lagrange multipliers for the upper bound constraints.

    +

    + +

    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
    +
    + + + + diff --git a/help/en_US/scilab_en_US_help/lsqnonneg.html b/help/en_US/scilab_en_US_help/lsqnonneg.html index a095226..760cc74 100644 --- a/help/en_US/scilab_en_US_help/lsqnonneg.html +++ b/help/en_US/scilab_en_US_help/lsqnonneg.html @@ -12,7 +12,7 @@
    - << lsqlin + << lsqnonlin @@ -111,7 +111,7 @@ It has type "struct" and contains the following fields.
    Report an issue
    - << lsqlin + << lsqnonlin diff --git a/help/en_US/scilab_en_US_help/section_19f4f1e5726c01d683e8b82be0a7e910.html b/help/en_US/scilab_en_US_help/section_19f4f1e5726c01d683e8b82be0a7e910.html index b34093f..ff9a47e 100644 --- a/help/en_US/scilab_en_US_help/section_19f4f1e5726c01d683e8b82be0a7e910.html +++ b/help/en_US/scilab_en_US_help/section_19f4f1e5726c01d683e8b82be0a7e910.html @@ -73,6 +73,12 @@ +
  • lsqnonlinSolves a non linear data fitting problems.
  • + + + + +
  • lsqnonnegSolves nonnegative least-squares curve fitting problems.
  • diff --git a/jar/scilab_en_US_help.jar b/jar/scilab_en_US_help.jar index ee0cb27..424087a 100644 Binary files a/jar/scilab_en_US_help.jar and b/jar/scilab_en_US_help.jar differ diff --git a/macros/fminbnd.bin b/macros/fminbnd.bin index 97b00fc..de98f29 100644 Binary files a/macros/fminbnd.bin and b/macros/fminbnd.bin differ diff --git a/macros/fminunc.bin b/macros/fminunc.bin index aa82fc3..3bda54f 100644 Binary files a/macros/fminunc.bin and b/macros/fminunc.bin differ diff --git a/macros/lib b/macros/lib index 612b878..08d754b 100644 Binary files a/macros/lib and b/macros/lib differ diff --git a/macros/lsqcurvefit.bin b/macros/lsqcurvefit.bin deleted file mode 100644 index 20a8d0d..0000000 Binary files a/macros/lsqcurvefit.bin and /dev/null differ 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 : - // - // - // \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} - // - // - // 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. - // - // Syntax : options= list("MaxIter", [---], "CpuTime", [---]); - // MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take. - // CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take. - // Default Values : options = list("MaxIter", [3000], "CpuTime", [600]); - // - // - // The exitflag allows to know the status of the optimization which is given back by Ipopt. - // - // exitflag=0 : Optimal Solution Found - // exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal. - // exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal. - // exitflag=3 : Stop at Tiny Step. - // exitflag=4 : Solved To Acceptable Level. - // exitflag=5 : Converged to a point of local infeasibility. - // - // - // 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. - // - // output.iterations: The number of iterations performed during the search - // output.constrviolation: The max-norm of the constraint violation. - // - // - // 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. - // - // lambda.lower: The Lagrange multipliers for the lower bound constraints. - // lambda.upper: The Lagrange multipliers for the upper bound constraints. - // lambda.eqlin: The Lagrange multipliers for the linear equality constraints. - // lambda.ineqlin: The Lagrange multipliers for the linear inequality constraints. - // - // - // 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 new file mode 100644 index 0000000..2cc1f1c Binary files /dev/null and b/macros/lsqnonlin.bin differ 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 : + // + // + // \begin{eqnarray} + // &\mbox{min}_{x} + // & (f_1(x)^2 + f_2(x)^2 + ... + f_n(x)^2) \\ + // & lb \leq x \leq ub \\ + // \end{eqnarray} + // + // + // 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. + // + // Syntax : options= list("MaxIter", [---], "CpuTime", [---],"GradObj", "on"); + // MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take. + // CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take. + // GradObj : a string, representing the gradient function is on or off. + // Default Values : options = list("MaxIter", [3000], "CpuTime", [600], "GradObj", "off"); + // + // + // The exitflag allows to know the status of the optimization which is given back by Ipopt. + // + // exitflag=0 : Optimal Solution Found + // exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal. + // exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal. + // exitflag=3 : Stop at Tiny Step. + // exitflag=4 : Solved To Acceptable Level. + // exitflag=5 : Converged to a point of local infeasibility. + // + // + // 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. + // + // output.iterations: The number of iterations performed during the search + // output.constrviolation: The max-norm of the constraint violation. + // + // + // 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. + // + // lambda.lower: The Lagrange multipliers for the lower bound constraints. + // lambda.upper: The Lagrange multipliers for the upper bound constraints. + // + // + // 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 diff --git a/tests/general_tests/fmincon/fmincon_grad1.sce b/tests/general_tests/fmincon/fmincon_grad1.sce new file mode 100644 index 0000000..bf72b8f --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_grad1.sce @@ -0,0 +1,44 @@ + +//Incompatibility between user defined gradient function and dimensions of the starting point x0 + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Gradient function of Objective and x0 did not match +//at line 606 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_grad1.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +//x(4) is invalid here +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(4)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_grad2.sce b/tests/general_tests/fmincon/fmincon_grad2.sce new file mode 100644 index 0000000..9f29a39 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_grad2.sce @@ -0,0 +1,44 @@ + +//User defined gradient function does not return a vector + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Wrong Input for Objective Gradient function(10th Parameter)---->Vector function is Expected +//at line 615 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_grad2.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + //y is not a vector here + y= [x(2),x(1)+x(3);x(2),x(1)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_gradcon1.sce b/tests/general_tests/fmincon/fmincon_gradcon1.sce new file mode 100644 index 0000000..7a1efa4 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_gradcon1.sce @@ -0,0 +1,44 @@ + +//Incompatibility between user defined constraint gradient function and dimensions of the starting point x0 + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Gradient function of Constraint and x0 did not match +//at line 640 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_gradcon1.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +//x(4) is invalid here +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(4)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(4)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_gradcon2.sce b/tests/general_tests/fmincon/fmincon_gradcon2.sce new file mode 100644 index 0000000..f064e98 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_gradcon2.sce @@ -0,0 +1,44 @@ + +//Wrong dimensions of non-linear inequality constraint gradient function + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Definition of (cg) in Non-Linear Constraint function(10th Parameter) should be in the form of (m X n) or Empty Matrix where m is number of Non- linear inequality constraints and n is number of Variables +//at line 647 of function fmincon called by : +//ncon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options +//at line 44 of exec file called by : +//exec fmincon_gradcon2.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +//Dimension of cg is wrong here +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3);1,0,1]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_gradcon3.sce b/tests/general_tests/fmincon/fmincon_gradcon3.sce new file mode 100644 index 0000000..eeda192 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_gradcon3.sce @@ -0,0 +1,44 @@ + +//Wrong dimensions of non-linear equality constraint gradient function + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Definition of (ceqg) in Non-Linear Constraint function(10th Parameter) should be in the form of (m X n) or Empty Matrix where m is number of Non- linear equality constraints and n is number of Variables +//at line 653 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_gradcon3.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +//Dimension of ceqg is wrong here +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0,x(3);0,2*x(2),2*x(3),2*x(1)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_hess1.sce b/tests/general_tests/fmincon/fmincon_hess1.sce new file mode 100644 index 0000000..058f521 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_hess1.sce @@ -0,0 +1,44 @@ + +//Incompatibility between user defined hessian function and dimensions of the starting point x0 + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Hessian function of Objective and x0 did not match +//at line 625 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_hess1.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +//x(4) is invalid here +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(4),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_hess2.sce b/tests/general_tests/fmincon/fmincon_hess2.sce new file mode 100644 index 0000000..58f8804 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_hess2.sce @@ -0,0 +1,44 @@ + +//User defined hessian is of wrong dimensions + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Wrong Input for Objective Hessian function(10th Parameter)---->Symmetric Matrix function is Expected +//at line 630 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_hess2.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +//Wrong dimensions of Hessian here +function y= lHess(x,obj,lambda) + y= obj*[0,1;1,0;0,1] + lambda(1)*[2,0;0,0;0,0] + lambda(2)*[2,0;0,2;0,0] +lambda(3)*[0,0;0,0;0,0] + lambda(4)*[6*x(1),0;0,0;0,0] + lambda(5)*[0,0;0,2;0,0]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_nlc1.sce b/tests/general_tests/fmincon/fmincon_nlc1.sce new file mode 100644 index 0000000..65064d7 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_nlc1.sce @@ -0,0 +1,44 @@ + +//Mismatch in dimensions of starting point x0 and that of non-linear constraints + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Non-Linear Constraint function(9th Parameter) and x0(2nd Parameter) did not match +//at line 487 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_nlc1.sce + +function [c,ceq]=nlc(x) + //x(4) is out of dimension here when compared to x0 + c=[x(1)^2-1,x(4)^2+x(2)^2-1,x(4)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1 ),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon", cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_nlc2.sce b/tests/general_tests/fmincon/fmincon_nlc2.sce new file mode 100644 index 0000000..5a524fd --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_nlc2.sce @@ -0,0 +1,44 @@ + +//Checking if non-linear inequality constraints are specified in row vector format + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Definition of c in Non-Linear Constraint function(9th Parameter) should be in the form of Row Vector or Empty Vector +//at line 493 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_nlc2.sce + +function [c,ceq]=nlc(x) + //Expected a row vector or an empty vector for c, but found a column vector + c=[x(1)^2-1;x(1)^2+x(2)^2-1;x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1 ),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon", cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_nlc3.sce b/tests/general_tests/fmincon/fmincon_nlc3.sce new file mode 100644 index 0000000..d82bf84 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_nlc3.sce @@ -0,0 +1,44 @@ + +//Checking if non-linear equality constraints are specified in row vector format + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Definition of ceq in Non-Linear Constraint function(9th Parameter) should be in the form of Row Vector or Empty Vector +//at line 498 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_nlc3.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + //Expected a row vector or an empty vector for ceq, but found a column vector + ceq=[x(1)^3-0.5;x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1 ),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon", cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_nlc4.sce b/tests/general_tests/fmincon/fmincon_nlc4.sce new file mode 100644 index 0000000..7e7c180 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_nlc4.sce @@ -0,0 +1,40 @@ + +//If non-linear constraints is neither a function nor an empty matrix then flag an error + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Non Linear Constraint (9th Parameter) should be a function or an Empty Matrix +//at line 542 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 40 of exec file called by : +//exec fmincon_nlc4.sce + +nlc=[1,2,3,4]; + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1 ),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon", cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_options1.sce b/tests/general_tests/fmincon/fmincon_options1.sce new file mode 100644 index 0000000..e5fc008 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_options1.sce @@ -0,0 +1,44 @@ + +//Size of options is not even + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Size of Options (list) should be even +//at line 558 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 43 of exec file called by : +//exec fmincon_options1.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +//cGrad is missing in the options +options=list("MaxIter", [1500], "CpuTime", [500], "GradObj", fGrad, "Hessian", lHess,"GradCon"); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/general_tests/fmincon/fmincon_options2.sce b/tests/general_tests/fmincon/fmincon_options2.sce new file mode 100644 index 0000000..1097690 --- /dev/null +++ b/tests/general_tests/fmincon/fmincon_options2.sce @@ -0,0 +1,44 @@ + +//Typing error in arguments to options + +function y=f(x) + y=x(1)*x(2)+x(2)*x(3); +endfunction + +x0=[1,1,1]; +A=[]; +b=[]; +Aeq=[]; +beq=[]; +lb=[0 0.2,-%inf]; +ub=[0.6 %inf,1]; + +//Error +//fmincon: Unrecognized parameter name GradientObj. +//at line 596 of function fmincon called by : +//fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) +//at line 44 of exec file called by : +//exec fmincon_options2.sce + +function [c,ceq]=nlc(x) + c=[x(1)^2-1,x(1)^2+x(2)^2-1,x(3)^2-1]; + ceq=[x(1)^3-0.5,x(2)^2+x(3)^2-0.75]; +endfunction + +function y= fGrad(x) + y= [x(2),x(1)+x(3),x(2)]; +endfunction + +function y= lHess(x,obj,lambda) + y= obj*[0,1,0;1,0,1;0,1,0] + lambda(1)*[2,0,0;0,0,0;0,0,0] + lambda(2)*[2,0,0;0,2,0;0,0,0] +lambda(3)*[0,0,0;0,0,0;0,0,2] + lambda(4)*[6*x(1),0,0;0,0,0;0,0,0] + lambda(5)*[0,0,0;0,2,0;0,0,2]; +endfunction + +function [cg,ceqg] = cGrad(x) + cg = [2*x(1),0,0;2*x(1),2*x(2),0;0,0,2*x(3)]; + ceqg = [3*x(1)^2,0,0;0,2*x(2),2*x(3)]; +endfunction + +//Typing error: Expected "GradObj" instead of "GradientObj" +options=list("MaxIter", [1500], "CpuTime", [500], "GradientObj", fGrad, "Hessian", lHess,"GradCon",cGrad); + +[x,fval,exitflag,output,lambda,grad,hessian] =fmincon(f,x0,A,b,Aeq,beq,lb,ub,nlc,options) diff --git a/tests/unit_tests/lsqnonlin.dia.ref b/tests/unit_tests/lsqnonlin.dia.ref new file mode 100644 index 0000000..916d9dc --- /dev/null +++ b/tests/unit_tests/lsqnonlin.dia.ref @@ -0,0 +1,83 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: harpreet.mertia@gmail.com +// +// 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 + +// <-- JVM NOT MANDATORY --> +// <-- ENGLISH IMPOSED --> + + +// +// assert_close -- +// Returns 1 if the two real matrices computed and expected are close, +// i.e. if the relative distance between computed and expected is lesser than epsilon. +// Arguments +// computed, expected : the two matrices to compare +// epsilon : a small number +// +function flag = assert_close ( computed, expected, epsilon ) + if expected==0.0 then + shift = norm(computed-expected); + else + shift = norm(computed-expected)/norm(expected); + end +// if shift < epsilon then +// flag = 1; +// else +// flag = 0; +// end +// if flag <> 1 then pause,end + flag = assert_checktrue ( shift < epsilon ); +endfunction +// +// assert_equal -- +// Returns 1 if the two real matrices computed and expected are equal. +// Arguments +// computed, expected : the two matrices to compare +// epsilon : a small number +// +//function flag = assert_equal ( computed , expected ) +// if computed==expected then +// flag = 1; +// else +// flag = 0; +// end +// if flag <> 1 then pause,end +//endfunction + +//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) + +assert_close ( xopt , [ 0.9940629 0.9904811 ]' , 0.0005 ); +assert_close ( residual , [-0.0139785 0.0158061 0.0029263 0.0091929 -0.0017872 -0.0050049 0.0056439 -0.0128825 -0.0129584 0.0035627]' , 0.0005 ); +assert_close ( resnorm , [ 0.0009450] , 0.0005 ); +assert_checkequal( exitflag , int32(0) ); +printf("Test Successful"); diff --git a/tests/unit_tests/lsqnonlin.tst b/tests/unit_tests/lsqnonlin.tst new file mode 100644 index 0000000..916d9dc --- /dev/null +++ b/tests/unit_tests/lsqnonlin.tst @@ -0,0 +1,83 @@ +// Copyright (C) 2015 - IIT Bombay - FOSSEE +// +// Author: Harpreet Singh +// Organization: FOSSEE, IIT Bombay +// Email: harpreet.mertia@gmail.com +// +// 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 + +// <-- JVM NOT MANDATORY --> +// <-- ENGLISH IMPOSED --> + + +// +// assert_close -- +// Returns 1 if the two real matrices computed and expected are close, +// i.e. if the relative distance between computed and expected is lesser than epsilon. +// Arguments +// computed, expected : the two matrices to compare +// epsilon : a small number +// +function flag = assert_close ( computed, expected, epsilon ) + if expected==0.0 then + shift = norm(computed-expected); + else + shift = norm(computed-expected)/norm(expected); + end +// if shift < epsilon then +// flag = 1; +// else +// flag = 0; +// end +// if flag <> 1 then pause,end + flag = assert_checktrue ( shift < epsilon ); +endfunction +// +// assert_equal -- +// Returns 1 if the two real matrices computed and expected are equal. +// Arguments +// computed, expected : the two matrices to compare +// epsilon : a small number +// +//function flag = assert_equal ( computed , expected ) +// if computed==expected then +// flag = 1; +// else +// flag = 0; +// end +// if flag <> 1 then pause,end +//endfunction + +//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) + +assert_close ( xopt , [ 0.9940629 0.9904811 ]' , 0.0005 ); +assert_close ( residual , [-0.0139785 0.0158061 0.0029263 0.0091929 -0.0017872 -0.0050049 0.0056439 -0.0128825 -0.0129584 0.0035627]' , 0.0005 ); +assert_close ( resnorm , [ 0.0009450] , 0.0005 ); +assert_checkequal( exitflag , int32(0) ); +printf("Test Successful"); -- cgit