diff options
41 files changed, 1510 insertions, 445 deletions
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 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<!-- + * + * This help file was generated from lsqnonlin.sci using help_from_sci(). + * + --> + +<refentry version="5.0-subset Scilab" xml:id="lsqnonlin" xml:lang="en" + xmlns="http://docbook.org/ns/docbook" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns:ns3="http://www.w3.org/1999/xhtml" + xmlns:mml="http://www.w3.org/1998/Math/MathML" + xmlns:scilab="http://www.scilab.org" + xmlns:db="http://docbook.org/ns/docbook"> + + <refnamediv> + <refname>lsqnonlin</refname> + <refpurpose>Solves a non linear data fitting problems.</refpurpose> + </refnamediv> + + +<refsynopsisdiv> + <title>Calling Sequence</title> + <synopsis> + 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( ... ) + + </synopsis> +</refsynopsisdiv> + +<refsection> + <title>Parameters</title> + <variablelist> + <varlistentry><term>fun :</term> + <listitem><para> a function, representing the objective function and gradient (if given) of the problem</para></listitem></varlistentry> + <varlistentry><term>x0 :</term> + <listitem><para> a vector of double, contains initial guess of variables.</para></listitem></varlistentry> + <varlistentry><term>lb :</term> + <listitem><para> a vector of double, contains lower bounds of the variables.</para></listitem></varlistentry> + <varlistentry><term>ub :</term> + <listitem><para> a vector of double, contains upper bounds of the variables.</para></listitem></varlistentry> + <varlistentry><term>options :</term> + <listitem><para> a list containing the parameters to be set.</para></listitem></varlistentry> + <varlistentry><term>xopt :</term> + <listitem><para> a vector of double, the computed solution of the optimization problem.</para></listitem></varlistentry> + <varlistentry><term>resnorm :</term> + <listitem><para> a double, objective value returned as the scalar value i.e. sum(fun(x).^2).</para></listitem></varlistentry> + <varlistentry><term>residual :</term> + <listitem><para> a vector of double, solution of objective function i.e. fun(x).</para></listitem></varlistentry> + <varlistentry><term>exitflag :</term> + <listitem><para> The exit status. See below for details.</para></listitem></varlistentry> + <varlistentry><term>output :</term> + <listitem><para> The structure consist of statistics about the optimization. See below for details.</para></listitem></varlistentry> + <varlistentry><term>lambda :</term> + <listitem><para> The structure consist of the Lagrange multipliers at the solution of problem. See below for details.</para></listitem></varlistentry> + <varlistentry><term>gradient :</term> + <listitem><para> a vector of doubles, containing the Objective's gradient of the solution.</para></listitem></varlistentry> + </variablelist> +</refsection> + +<refsection> + <title>Description</title> + <para> +Search the minimum of a constrained non-linear least square problem specified by : + </para> + <para> +<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> + </para> + <para> +The routine calls fmincon which calls Ipopt for solving the non-linear least square problem, Ipopt is a library written in C++. + </para> + <para> +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> + </para> + <para> +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> + </para> + <para> +For more details on exitflag see the ipopt documentation, go to http://www.coin-or.org/Ipopt/documentation/ + </para> + <para> +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> + </para> + <para> +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> + </para> + <para> +</para> +</refsection> + +<refsection> + <title>Examples</title> + <programlisting role="example"><![CDATA[ +//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 + + ]]></programlisting> +</refsection> + +<refsection> + <title>Examples</title> + <programlisting role="example"><![CDATA[ +//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) + ]]></programlisting> +</refsection> + +<refsection> + <title>Authors</title> + <simplelist type="vert"> + <member>Harpreet Singh</member> + </simplelist> +</refsection> +</refentry> 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 @@ <!ENTITY a14f1077f437dbe35eb1cac51fed7a9fc SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/fminunc.xml"> <!ENTITY aa809ed678033fc05c9b60a71de55b2ce SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/linprog.xml"> <!ENTITY a3d4ec65684b561d91f7a255acd23f51c SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/lsqlin.xml"> +<!ENTITY aa63ebf0c6a638d0a3a932f61b6b4cc92 SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/lsqnonlin.xml"> <!ENTITY aa4a031935f5eed6cfc8fc4a49823b00b SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/lsqnonneg.xml"> <!ENTITY a6b85f6e0c98751f20b68663a23cb4cd2 SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/qpipopt.xml"> <!ENTITY a8549a3935858ed104f4749ca2243456a SYSTEM "/home/harpreet/symphony_work/symphony/help/en_US/qpipoptmat.xml"> @@ -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 Binary files differindex a5dd8d0..e9d664b 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB Binary files differindex 497453b..8bc08b5 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS Binary files differindex 48d2dc4..cb6bcfa 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS Binary files differindex b391d86..7979ee5 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS 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 Binary files differindex bed7ce2..26a946f 100644 --- a/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP +++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP 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 Binary files differnew file mode 100644 index 0000000..02e04b1 --- /dev/null +++ b/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png 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 @@ +<li><a href="lsqnonlin.html" class="refentry">lsqnonlin</a> — <span class="refentry-description">Solves a non linear data fitting problems.</span></li> + + + + + <li><a href="lsqnonneg.html" class="refentry">lsqnonneg</a> — <span class="refentry-description">Solves nonnegative least-squares curve fitting problems.</span></li> 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 @@ <mapID target="fminunc" url="fminunc.html"/> <mapID target="linprog" url="linprog.html"/> <mapID target="lsqlin" url="lsqlin.html"/> +<mapID target="lsqnonlin" url="lsqnonlin.html"/> <mapID target="lsqnonneg" url="lsqnonneg.html"/> <mapID target="qpipopt" url="qpipopt.html"/> <mapID target="qpipoptmat" url="qpipoptmat.html"/> 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 @@ <tocitem target="fminunc" text="fminunc"/> <tocitem target="linprog" text="linprog"/> <tocitem target="lsqlin" text="lsqlin"/> +<tocitem target="lsqnonlin" text="lsqnonlin"/> <tocitem target="lsqnonneg" text="lsqnonneg"/> <tocitem target="qpipopt" text="qpipopt"/> <tocitem target="qpipoptmat" text="qpipoptmat"/> 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 @@ </td> <td width="30%" class="next"> - <span class="next"><a href="lsqnonneg.html">lsqnonneg >></a></span> + <span class="next"><a href="lsqnonlin.html">lsqnonlin >></a></span> </td> </tr></table> @@ -165,7 +165,7 @@ It has type "struct" and contains the following fields. </td> <td width="30%" class="next"> - <span class="next"><a href="lsqnonneg.html">lsqnonneg >></a></span> + <span class="next"><a href="lsqnonlin.html">lsqnonlin >></a></span> </td> </tr></table> 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 @@ +<html><head> + <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> + <title>lsqnonlin</title> + <style type="text/css" media="all"> + @import url("scilab_code.css"); + @import url("xml_code.css"); + @import url("c_code.css"); + @import url("style.css"); + </style> + </head> + <body> + <div class="manualnavbar"> + <table width="100%"><tr> + <td width="30%"> + <span class="previous"><a href="lsqlin.html"><< lsqlin</a></span> + + </td> + <td width="40%" class="center"> + <span class="top"><a href="section_19f4f1e5726c01d683e8b82be0a7e910.html">FOSSEE Optimization Toolbox</a></span> + + </td> + <td width="30%" class="next"> + <span class="next"><a href="lsqnonneg.html">lsqnonneg >></a></span> + + </td> + </tr></table> + <hr /> + </div> + + + + <span class="path"><a href="index.html">FOSSEE Optimization Toolbox</a> >> <a href="section_19f4f1e5726c01d683e8b82be0a7e910.html">FOSSEE Optimization Toolbox</a> > lsqnonlin</span> + + <br /><br /> + <div class="refnamediv"><h1 class="refname">lsqnonlin</h1> + <p class="refpurpose">Solves a non linear data fitting problems.</p></div> + + +<div class="refsynopsisdiv"><h3 class="title">Calling Sequence</h3> + <div class="synopsis"><pre><span class="default">xopt</span><span class="default"> = </span><span class="functionid">lsqnonlin</span><span class="default">(</span><span class="default">fun</span><span class="default">,</span><span class="default">x0</span><span class="default">)</span> +<span class="default">xopt</span><span class="default"> = </span><span class="functionid">lsqnonlin</span><span class="default">(</span><span class="default">fun</span><span class="default">,</span><span class="default">x0</span><span class="default">,</span><span class="default">lb</span><span class="default">,</span><span class="default">ub</span><span class="default">)</span> +<span class="default">xopt</span><span class="default"> = </span><span class="functionid">lsqnonlin</span><span class="default">(</span><span class="default">fun</span><span class="default">,</span><span class="default">x0</span><span class="default">,</span><span class="default">lb</span><span class="default">,</span><span class="default">ub</span><span class="default">,</span><span class="default">options</span><span class="default">)</span> +<span class="default">[</span><span class="default">xopt</span><span class="default">,</span><span class="default">resnorm</span><span class="default">] = </span><span class="functionid">lsqnonlin</span><span class="default">( ... )</span> +<span class="default">[</span><span class="default">xopt</span><span class="default">,</span><span class="default">resnorm</span><span class="default">,</span><span class="default">residual</span><span class="default">] = </span><span class="functionid">lsqnonlin</span><span class="default">( ... )</span> +<span class="default">[</span><span class="default">xopt</span><span class="default">,</span><span class="default">resnorm</span><span class="default">,</span><span class="default">residual</span><span class="default">,</span><span class="default">exitflag</span><span class="default">] = </span><span class="functionid">lsqnonlin</span><span class="default">( ... )</span> +<span class="default">[</span><span class="default">xopt</span><span class="default">,</span><span class="default">resnorm</span><span class="default">,</span><span class="default">residual</span><span class="default">,</span><span class="default">exitflag</span><span class="default">,</span><span class="default">output</span><span class="default">,</span><span class="default">lambda</span><span class="default">,</span><span class="default">gradient</span><span class="default">] = </span><span class="functionid">lsqnonlin</span><span class="default">( ... )</span></pre></div></div> + +<div class="refsection"><h3 class="title">Parameters</h3> + <dl><dt><span class="term">fun :</span> + <dd><p class="para">a function, representing the objective function and gradient (if given) of the problem</p></dd></dt> + <dt><span class="term">x0 :</span> + <dd><p class="para">a vector of double, contains initial guess of variables.</p></dd></dt> + <dt><span class="term">lb :</span> + <dd><p class="para">a vector of double, contains lower bounds of the variables.</p></dd></dt> + <dt><span class="term">ub :</span> + <dd><p class="para">a vector of double, contains upper bounds of the variables.</p></dd></dt> + <dt><span class="term">options :</span> + <dd><p class="para">a list containing the parameters to be set.</p></dd></dt> + <dt><span class="term">xopt :</span> + <dd><p class="para">a vector of double, the computed solution of the optimization problem.</p></dd></dt> + <dt><span class="term">resnorm :</span> + <dd><p class="para">a double, objective value returned as the scalar value i.e. sum(fun(x).^2).</p></dd></dt> + <dt><span class="term">residual :</span> + <dd><p class="para">a vector of double, solution of objective function i.e. fun(x).</p></dd></dt> + <dt><span class="term">exitflag :</span> + <dd><p class="para">The exit status. See below for details.</p></dd></dt> + <dt><span class="term">output :</span> + <dd><p class="para">The structure consist of statistics about the optimization. See below for details.</p></dd></dt> + <dt><span class="term">lambda :</span> + <dd><p class="para">The structure consist of the Lagrange multipliers at the solution of problem. See below for details.</p></dd></dt> + <dt><span class="term">gradient :</span> + <dd><p class="para">a vector of doubles, containing the Objective's gradient of the solution.</p></dd></dt></dl></div> + +<div class="refsection"><h3 class="title">Description</h3> + <p class="para">Search the minimum of a constrained non-linear least square problem specified by :</p> + <p class="para"><span><img src='./_LaTeX_lsqnonlin.xml_1.png' style='position:relative;top:20px;width:341px;height:48px'/></span></p> + <p class="para">The routine calls fmincon which calls Ipopt for solving the non-linear least square problem, Ipopt is a library written in C++.</p> + <p class="para">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. +<ul class="itemizedlist"><li>Syntax : options= list("MaxIter", [---], "CpuTime", [---],"GradObj", "on");</li> +<li>MaxIter : a Scalar, containing the Maximum Number of Iteration that the solver should take.</li> +<li>CpuTime : a Scalar, containing the Maximum amount of CPU Time that the solver should take.</li> +<li>GradObj : a string, representing the gradient function is on or off.</li> +<li>Default Values : options = list("MaxIter", [3000], "CpuTime", [600], "GradObj", "off");</li></ul></p> + <p class="para">The exitflag allows to know the status of the optimization which is given back by Ipopt. +<ul class="itemizedlist"><li>exitflag=0 : Optimal Solution Found</li> +<li>exitflag=1 : Maximum Number of Iterations Exceeded. Output may not be optimal.</li> +<li>exitflag=2 : Maximum CPU Time exceeded. Output may not be optimal.</li> +<li>exitflag=3 : Stop at Tiny Step.</li> +<li>exitflag=4 : Solved To Acceptable Level.</li> +<li>exitflag=5 : Converged to a point of local infeasibility.</li></ul></p> + <p class="para">For more details on exitflag see the ipopt documentation, go to http://www.coin-or.org/Ipopt/documentation/</p> + <p class="para">The output data structure contains detailed informations about the optimization process. +It has type "struct" and contains the following fields. +<ul class="itemizedlist"><li>output.iterations: The number of iterations performed during the search</li> +<li>output.constrviolation: The max-norm of the constraint violation.</li></ul></p> + <p class="para">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. +<ul class="itemizedlist"><li>lambda.lower: The Lagrange multipliers for the lower bound constraints.</li> +<li>lambda.upper: The Lagrange multipliers for the upper bound constraints.</li></ul></p> + <p class="para"></p></div> + +<div class="refsection"><h3 class="title">Examples</h3> + <div class="programlisting"><table border="0" width="100%"><tr><td width="98%"><pre class="scilabcode"><span class="scilabcomment">//A simple non-linear least square example taken from leastsq default present in scilab</span> +<span class="scilabfkeyword">function</span> <span class="scilabinputoutputargs">y</span><span class="scilaboperator">=</span><span class="scilabfunctionid">yth</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">t</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">)</span> +<span class="scilabinputoutputargs">y</span> <span class="scilaboperator">=</span> <span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">1</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><a class="scilabcommand" href="scilab://exp">exp</a><span class="scilabopenclose">(</span><span class="scilaboperator">-</span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">2</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><span class="scilabinputoutputargs">t</span><span class="scilabopenclose">)</span> +<span class="scilabfkeyword">endfunction</span> +<span class="scilabcomment">// we have the m measures (ti, yi):</span> +<span class="scilabid">m</span> <span class="scilaboperator">=</span> <span class="scilabnumber">10</span><span class="scilabdefault">;</span> +<span class="scilabid">tm</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">0.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.5</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.75</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.0</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.5</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.75</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.0</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.5</span><span class="scilabopenclose">]</span><span class="scilaboperator">'</span><span class="scilabdefault">;</span> +<span class="scilabid">ym</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">0.79</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.59</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.47</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.36</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.29</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.23</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.17</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.15</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.12</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.08</span><span class="scilabopenclose">]</span><span class="scilaboperator">'</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// measure weights (here all equal to 1...)</span> +<span class="scilabid">wm</span> <span class="scilaboperator">=</span> <a class="scilabcommand" href="scilab://ones">ones</a><span class="scilabopenclose">(</span><span class="scilabid">m</span><span class="scilabdefault">,</span><span class="scilabnumber">1</span><span class="scilabopenclose">)</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// and we want to find the parameters x such that the model fits the given</span> +<span class="scilabcomment">// data in the least square sense:</span> +<span class="scilabcomment">//</span> +<span class="scilabcomment">// minimize f(x) = sum_i wm(i)^2 ( yth(tm(i),x) - ym(i) )^2</span> +<span class="scilabcomment">// initial parameters guess</span> +<span class="scilabid">x0</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">1.5</span> <span class="scilabdefault">;</span> <span class="scilabnumber">0.8</span><span class="scilabopenclose">]</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// in the first examples, we define the function fun and dfun</span> +<span class="scilabcomment">// in scilab language</span> +<span class="scilabfkeyword">function</span> <span class="scilabinputoutputargs">y</span><span class="scilaboperator">=</span><span class="scilabfunctionid">myfun</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">x</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">tm</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">ym</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">wm</span><span class="scilabopenclose">)</span> +<span class="scilabinputoutputargs">y</span> <span class="scilaboperator">=</span> <span class="scilabinputoutputargs">wm</span><span class="scilaboperator">.*</span><span class="scilabopenclose">(</span> <span class="scilabfunctionid">yth</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">tm</span><span class="scilabdefault">,</span> <span class="scilabinputoutputargs">x</span><span class="scilabopenclose">)</span> <span class="scilaboperator">-</span> <span class="scilabinputoutputargs">ym</span> <span class="scilabopenclose">)</span> +<span class="scilabfkeyword">endfunction</span> +<span class="scilabcomment">// the simplest call</span> +<span class="scilabopenclose">[</span><span class="scilabid">xopt</span><span class="scilabdefault">,</span><span class="scilabid">resnorm</span><span class="scilabdefault">,</span><span class="scilabid">residual</span><span class="scilabdefault">,</span><span class="scilabid">exitflag</span><span class="scilabdefault">,</span><span class="scilabid">output</span><span class="scilabdefault">,</span><span class="scilabid">lambda</span><span class="scilabdefault">,</span><span class="scilabid">gradient</span><span class="scilabopenclose">]</span> <span class="scilaboperator">=</span> <span class="scilabid">lsqnonlin</span><span class="scilabopenclose">(</span><span class="scilabfunctionid">myfun</span><span class="scilabdefault">,</span><span class="scilabid">x0</span><span class="scilabopenclose">)</span> +<span class="scilabcomment">// Press ENTER to continue</span></pre></td><td valign="top"><a href="scilab://scilab.execexample/"><img src="ScilabExecute.png" border="0"/></a></td><td valign="top"><a href="scilab://scilab.editexample/"><img src="ScilabEdit.png" border="0"/></a></td><td></td></tr></table></div></div> + +<div class="refsection"><h3 class="title">Examples</h3> + <div class="programlisting"><table border="0" width="100%"><tr><td width="98%"><pre class="scilabcode"><span class="scilabcomment">//A basic example taken from leastsq default present in scilab with gradient</span> +<span class="scilabfkeyword">function</span> <span class="scilabinputoutputargs">y</span><span class="scilaboperator">=</span><span class="scilabfunctionid">yth</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">t</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">)</span> +<span class="scilabinputoutputargs">y</span> <span class="scilaboperator">=</span> <span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">1</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><a class="scilabcommand" href="scilab://exp">exp</a><span class="scilabopenclose">(</span><span class="scilaboperator">-</span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">2</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><span class="scilabinputoutputargs">t</span><span class="scilabopenclose">)</span> +<span class="scilabfkeyword">endfunction</span> +<span class="scilabcomment">// we have the m measures (ti, yi):</span> +<span class="scilabid">m</span> <span class="scilaboperator">=</span> <span class="scilabnumber">10</span><span class="scilabdefault">;</span> +<span class="scilabid">tm</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">0.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.5</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.75</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.0</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.5</span><span class="scilabdefault">,</span> <span class="scilabnumber">1.75</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.0</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.25</span><span class="scilabdefault">,</span> <span class="scilabnumber">2.5</span><span class="scilabopenclose">]</span><span class="scilaboperator">'</span><span class="scilabdefault">;</span> +<span class="scilabid">ym</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">0.79</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.59</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.47</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.36</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.29</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.23</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.17</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.15</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.12</span><span class="scilabdefault">,</span> <span class="scilabnumber">0.08</span><span class="scilabopenclose">]</span><span class="scilaboperator">'</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// measure weights (here all equal to 1...)</span> +<span class="scilabid">wm</span> <span class="scilaboperator">=</span> <a class="scilabcommand" href="scilab://ones">ones</a><span class="scilabopenclose">(</span><span class="scilabid">m</span><span class="scilabdefault">,</span><span class="scilabnumber">1</span><span class="scilabopenclose">)</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// and we want to find the parameters x such that the model fits the given</span> +<span class="scilabcomment">// data in the least square sense:</span> +<span class="scilabcomment">//</span> +<span class="scilabcomment">// minimize f(x) = sum_i wm(i)^2 ( yth(tm(i),x) - ym(i) )^2</span> +<span class="scilabcomment">// initial parameters guess</span> +<span class="scilabid">x0</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabnumber">1.5</span> <span class="scilabdefault">;</span> <span class="scilabnumber">0.8</span><span class="scilabopenclose">]</span><span class="scilabdefault">;</span> +<span class="scilabcomment">// in the first examples, we define the function fun and dfun</span> +<span class="scilabcomment">// in scilab language</span> +<span class="scilabfkeyword">function</span> <span class="scilabopenclose">[</span><span class="scilabinputoutputargs">y</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">dy</span><span class="scilabopenclose">]</span><span class="scilaboperator">=</span><span class="scilabfunctionid">myfun</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">x</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">tm</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">ym</span><span class="scilabdefault">, </span><span class="scilabinputoutputargs">wm</span><span class="scilabopenclose">)</span> +<span class="scilabinputoutputargs">y</span> <span class="scilaboperator">=</span> <span class="scilabinputoutputargs">wm</span><span class="scilaboperator">.*</span><span class="scilabopenclose">(</span> <span class="scilabfunctionid">yth</span><span class="scilabopenclose">(</span><span class="scilabinputoutputargs">tm</span><span class="scilabdefault">,</span> <span class="scilabinputoutputargs">x</span><span class="scilabopenclose">)</span> <span class="scilaboperator">-</span> <span class="scilabinputoutputargs">ym</span> <span class="scilabopenclose">)</span> +<span class="scilabid">v</span> <span class="scilaboperator">=</span> <span class="scilabinputoutputargs">wm</span><span class="scilaboperator">.*</span><a class="scilabcommand" href="scilab://exp">exp</a><span class="scilabopenclose">(</span><span class="scilaboperator">-</span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">2</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><span class="scilabinputoutputargs">tm</span><span class="scilabopenclose">)</span> +<span class="scilabinputoutputargs">dy</span> <span class="scilaboperator">=</span> <span class="scilabopenclose">[</span><span class="scilabid">v</span> <span class="scilabdefault">,</span> <span class="scilaboperator">-</span><span class="scilabinputoutputargs">x</span><span class="scilabopenclose">(</span><span class="scilabnumber">1</span><span class="scilabopenclose">)</span><span class="scilaboperator">*</span><span class="scilabinputoutputargs">tm</span><span class="scilaboperator">.*</span><span class="scilabid">v</span><span class="scilabopenclose">]</span> +<span class="scilabfkeyword">endfunction</span> +<span class="scilabid">options</span> <span class="scilaboperator">=</span> <a class="scilabcommand" href="scilab://list">list</a><span class="scilabopenclose">(</span><span class="scilabstring">"</span><span class="scilabstring">GradObj</span><span class="scilabstring">"</span><span class="scilabdefault">,</span> <span class="scilabstring">"</span><span class="scilabstring">on</span><span class="scilabstring">"</span><span class="scilabopenclose">)</span> +<span class="scilabopenclose">[</span><span class="scilabid">xopt</span><span class="scilabdefault">,</span><span class="scilabid">resnorm</span><span class="scilabdefault">,</span><span class="scilabid">residual</span><span class="scilabdefault">,</span><span class="scilabid">exitflag</span><span class="scilabdefault">,</span><span class="scilabid">output</span><span class="scilabdefault">,</span><span class="scilabid">lambda</span><span class="scilabdefault">,</span><span class="scilabid">gradient</span><span class="scilabopenclose">]</span> <span class="scilaboperator">=</span> <span class="scilabid">lsqnonlin</span><span class="scilabopenclose">(</span><span class="scilabfunctionid">myfun</span><span class="scilabdefault">,</span><span class="scilabid">x0</span><span class="scilabdefault">,</span><span class="scilabopenclose">[</span><span class="scilabopenclose">]</span><span class="scilabdefault">,</span><span class="scilabopenclose">[</span><span class="scilabopenclose">]</span><span class="scilabdefault">,</span><span class="scilabid">options</span><span class="scilabopenclose">)</span></pre></td><td valign="top"><a href="scilab://scilab.execexample/"><img src="ScilabExecute.png" border="0"/></a></td><td valign="top"><a href="scilab://scilab.editexample/"><img src="ScilabEdit.png" border="0"/></a></td><td></td></tr></table></div></div> + +<div class="refsection"><h3 class="title">Authors</h3> + <ul class="itemizedlist"><li class="member">Harpreet Singh</li></ul></div> + <br /> + + <div class="manualnavbar"> + <table width="100%"> + <tr><td colspan="3" class="next"><a href="http://bugzilla.scilab.org/enter_bug.cgi?product=Scilab%20software&component=Documentation%20pages" class="ulink">Report an issue</a></td></tr> +<tr> + <td width="30%"> + <span class="previous"><a href="lsqlin.html"><< lsqlin</a></span> + + </td> + <td width="40%" class="center"> + <span class="top"><a href="section_19f4f1e5726c01d683e8b82be0a7e910.html">FOSSEE Optimization Toolbox</a></span> + + </td> + <td width="30%" class="next"> + <span class="next"><a href="lsqnonneg.html">lsqnonneg >></a></span> + + </td> + </tr></table> + <hr /> + </div> + </body> +</html> 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 @@ <div class="manualnavbar"> <table width="100%"><tr> <td width="30%"> - <span class="previous"><a href="lsqlin.html"><< lsqlin</a></span> + <span class="previous"><a href="lsqnonlin.html"><< lsqnonlin</a></span> </td> <td width="40%" class="center"> @@ -111,7 +111,7 @@ It has type "struct" and contains the following fields. <tr><td colspan="3" class="next"><a href="http://bugzilla.scilab.org/enter_bug.cgi?product=Scilab%20software&component=Documentation%20pages" class="ulink">Report an issue</a></td></tr> <tr> <td width="30%"> - <span class="previous"><a href="lsqlin.html"><< lsqlin</a></span> + <span class="previous"><a href="lsqnonlin.html"><< lsqnonlin</a></span> </td> <td width="40%" class="center"> 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 @@ +<li><a href="lsqnonlin.html" class="refentry">lsqnonlin</a> — <span class="refentry-description">Solves a non linear data fitting problems.</span></li> + + + + + <li><a href="lsqnonneg.html" class="refentry">lsqnonneg</a> — <span class="refentry-description">Solves nonnegative least-squares curve fitting problems.</span></li> diff --git a/jar/scilab_en_US_help.jar b/jar/scilab_en_US_help.jar Binary files differindex ee0cb27..424087a 100644 --- a/jar/scilab_en_US_help.jar +++ b/jar/scilab_en_US_help.jar 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 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"); |