summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--demos/lsqnonlin.dem.sce57
-rw-r--r--help/en_US/lsqnonlin.xml199
-rw-r--r--help/en_US/master_help.xml2
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/DOCSbin6704 -> 6940 bytes
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TABbin917 -> 944 bytes
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETSbin256 -> 264 bytes
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONSbin36124 -> 37635 bytes
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA2
-rw-r--r--help/en_US/scilab_en_US_help/JavaHelpSearch/TMAPbin16384 -> 18432 bytes
-rw-r--r--help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.pngbin0 -> 1932 bytes
-rw-r--r--help/en_US/scilab_en_US_help/index.html6
-rw-r--r--help/en_US/scilab_en_US_help/jhelpmap.jhm1
-rw-r--r--help/en_US/scilab_en_US_help/jhelptoc.xml1
-rw-r--r--help/en_US/scilab_en_US_help/lsqlin.html4
-rw-r--r--help/en_US/scilab_en_US_help/lsqnonlin.html181
-rw-r--r--help/en_US/scilab_en_US_help/lsqnonneg.html4
-rw-r--r--help/en_US/scilab_en_US_help/section_19f4f1e5726c01d683e8b82be0a7e910.html6
-rw-r--r--jar/scilab_en_US_help.jarbin226390 -> 234046 bytes
-rw-r--r--macros/fminbnd.binbin54876 -> 64312 bytes
-rw-r--r--macros/fminunc.binbin60896 -> 69752 bytes
-rw-r--r--macros/libbin864 -> 864 bytes
-rw-r--r--macros/lsqcurvefit.binbin64252 -> 0 bytes
-rw-r--r--macros/lsqcurvefit.sci439
-rw-r--r--macros/lsqnonlin.binbin0 -> 48352 bytes
-rw-r--r--macros/lsqnonlin.sci317
-rw-r--r--macros/names2
-rw-r--r--tests/general_tests/fmincon/fmincon_grad1.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_grad2.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_gradcon1.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_gradcon2.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_gradcon3.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_hess1.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_hess2.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_nlc1.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_nlc2.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_nlc3.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_nlc4.sce40
-rw-r--r--tests/general_tests/fmincon/fmincon_options1.sce44
-rw-r--r--tests/general_tests/fmincon/fmincon_options2.sce44
-rw-r--r--tests/unit_tests/lsqnonlin.dia.ref83
-rw-r--r--tests/unit_tests/lsqnonlin.tst83
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}
+&amp;\mbox{min}_{x}
+&amp; (f_1(x)^2 + f_2(x)^2 + ... + f_n(x)^2) \\
+&amp; 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
index a5dd8d0..e9d664b 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB
index 497453b..8bc08b5 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/DOCS.TAB
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS
index 48d2dc4..cb6bcfa 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/OFFSETS
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS
index b391d86..7979ee5 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/POSITIONS
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA b/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA
index 9c2220b..00ccabf 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/SCHEMA
@@ -1,2 +1,2 @@
JavaSearch 1.0
-TMAP bs=2048 rt=1 fl=-1 id1=1479 id2=1
+TMAP bs=2048 rt=1 fl=-1 id1=1516 id2=1
diff --git a/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP b/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP
index bed7ce2..26a946f 100644
--- a/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP
+++ b/help/en_US/scilab_en_US_help/JavaHelpSearch/TMAP
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png b/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png
new file mode 100644
index 0000000..02e04b1
--- /dev/null
+++ b/help/en_US/scilab_en_US_help/_LaTeX_lsqnonlin.xml_1.png
Binary files differ
diff --git a/help/en_US/scilab_en_US_help/index.html b/help/en_US/scilab_en_US_help/index.html
index 7bbe95e..d257dff 100644
--- a/help/en_US/scilab_en_US_help/index.html
+++ b/help/en_US/scilab_en_US_help/index.html
@@ -74,6 +74,12 @@
+<li><a href="lsqnonlin.html" class="refentry">lsqnonlin</a> &#8212; <span class="refentry-description">Solves a non linear data fitting problems.</span></li>
+
+
+
+
+
<li><a href="lsqnonneg.html" class="refentry">lsqnonneg</a> &#8212; <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 &gt;&gt;</a></span>
+ <span class="next"><a href="lsqnonlin.html">lsqnonlin &gt;&gt;</a></span>
</td>
</tr></table>
@@ -165,7 +165,7 @@ It has type &#0034;struct&#0034; and contains the following fields.
</td>
<td width="30%" class="next">
- <span class="next"><a href="lsqnonneg.html">lsqnonneg &gt;&gt;</a></span>
+ <span class="next"><a href="lsqnonlin.html">lsqnonlin &gt;&gt;</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">&lt;&lt; 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 &gt;&gt;</a></span>
+
+ </td>
+ </tr></table>
+ <hr />
+ </div>
+
+
+
+ <span class="path"><a href="index.html">FOSSEE Optimization Toolbox</a> &gt;&gt; <a href="section_19f4f1e5726c01d683e8b82be0a7e910.html">FOSSEE Optimization Toolbox</a> &gt; 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&#0039;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 &#0034;list&#0034; and contains the following fields.
+<ul class="itemizedlist"><li>Syntax : options= list(&#0034;MaxIter&#0034;, [---], &#0034;CpuTime&#0034;, [---],&#0034;GradObj&#0034;, &#0034;on&#0034;);</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(&#0034;MaxIter&#0034;, [3000], &#0034;CpuTime&#0034;, [600], &#0034;GradObj&#0034;, &#0034;off&#0034;);</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 &#0034;struct&#0034; 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 &#0034;struct&#0034; 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">&#0039;</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">&#0039;</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">&#0039;</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">&#0039;</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">&#0034;</span><span class="scilabstring">GradObj</span><span class="scilabstring">&#0034;</span><span class="scilabdefault">,</span> <span class="scilabstring">&#0034;</span><span class="scilabstring">on</span><span class="scilabstring">&#0034;</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">&lt;&lt; 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 &gt;&gt;</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">&lt;&lt; lsqlin</a></span>
+ <span class="previous"><a href="lsqnonlin.html">&lt;&lt; lsqnonlin</a></span>
</td>
<td width="40%" class="center">
@@ -111,7 +111,7 @@ It has type &#0034;struct&#0034; 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">&lt;&lt; lsqlin</a></span>
+ <span class="previous"><a href="lsqnonlin.html">&lt;&lt; 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> &#8212; <span class="refentry-description">Solves a non linear data fitting problems.</span></li>
+
+
+
+
+
<li><a href="lsqnonneg.html" class="refentry">lsqnonneg</a> &#8212; <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
index ee0cb27..424087a 100644
--- a/jar/scilab_en_US_help.jar
+++ b/jar/scilab_en_US_help.jar
Binary files differ
diff --git a/macros/fminbnd.bin b/macros/fminbnd.bin
index 97b00fc..de98f29 100644
--- a/macros/fminbnd.bin
+++ b/macros/fminbnd.bin
Binary files differ
diff --git a/macros/fminunc.bin b/macros/fminunc.bin
index aa82fc3..3bda54f 100644
--- a/macros/fminunc.bin
+++ b/macros/fminunc.bin
Binary files differ
diff --git a/macros/lib b/macros/lib
index 612b878..08d754b 100644
--- a/macros/lib
+++ b/macros/lib
Binary files differ
diff --git a/macros/lsqcurvefit.bin b/macros/lsqcurvefit.bin
deleted file mode 100644
index 20a8d0d..0000000
--- a/macros/lsqcurvefit.bin
+++ /dev/null
Binary files differ
diff --git a/macros/lsqcurvefit.sci b/macros/lsqcurvefit.sci
deleted file mode 100644
index 10e8e48..0000000
--- a/macros/lsqcurvefit.sci
+++ /dev/null
@@ -1,439 +0,0 @@
-// Copyright (C) 2015 - IIT Bombay - FOSSEE
-//
-// This file must be used under the terms of the CeCILL.
-// This source file is licensed as described in the file COPYING, which
-// you should have received as part of this distribution. The terms
-// are also available at
-// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
-// Author: Harpreet Singh
-// Organization: FOSSEE, IIT Bombay
-// Email: toolbox@scilab.in
-
-function [xopt,resnorm,residual,exitflag,output,lambda] = lsqcurvefit (varargin)
- // Solves a non linear data fitting problems.
- //
- // Calling Sequence
- // xopt = lsqcurvefit(fun,x0,xdata,ydata)
- // xopt = lsqcurvefit(fun,x0,xdata,ydata,lb,ub)
- // xopt = lsqcurvefit(fun,x0,xdata,ydata,lb,ub,options)
- // [xopt,resnorm] = lsqcurvefit( ... )
- //
- // Parameters
- // C : a matrix of double, represents the multiplier of the solution x in the expression Câ‹…x - d. Number of columns in C is equal to the number of elements in x.
- // d : a vector of double, represents the additive constant term in the expression Câ‹…x - d. Number of elements in d is equal to the number of rows in C matrix.
- // A : a matrix of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // b : a vector of double, represents the linear coefficients in the inequality constraints A⋅x ≤ b.
- // Aeq : a matrix of double, represents the linear coefficients in the equality constraints Aeqâ‹…x = beq.
- // beq : a vector of double, represents the linear coefficients in the equality constraints Aeqâ‹…x = beq.
- // lb : a vector of double, contains lower bounds of the variables.
- // ub : a vector of double, contains upper bounds of the variables.
- // x0 : a vector of double, contains initial guess of variables.
- // param : a list containing the parameters to be set.
- // xopt : a vector of double, the computed solution of the optimization problem.
- // resnorm : a double, objective value returned as the scalar value norm(Câ‹…x-d)^2.
- // residual : a vector of double, solution residuals returned as the vector d-Câ‹…x.
- // exitflag : The exit status. See below for details.
- // output : The structure consist of statistics about the optimization. See below for details.
- // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details.
- //
- // Description
- // Search the minimum of a constrained linear least square problem specified by :
- //
- // <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
new file mode 100644
index 0000000..2cc1f1c
--- /dev/null
+++ b/macros/lsqnonlin.bin
Binary files differ
diff --git a/macros/lsqnonlin.sci b/macros/lsqnonlin.sci
new file mode 100644
index 0000000..50a1a49
--- /dev/null
+++ b/macros/lsqnonlin.sci
@@ -0,0 +1,317 @@
+// Copyright (C) 2015 - IIT Bombay - FOSSEE
+//
+// This file must be used under the terms of the CeCILL.
+// This source file is licensed as described in the file COPYING, which
+// you should have received as part of this distribution. The terms
+// are also available at
+// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
+// Author: Harpreet Singh
+// Organization: FOSSEE, IIT Bombay
+// Email: toolbox@scilab.in
+
+function [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin (varargin)
+ // Solves a non linear data fitting problems.
+ //
+ // Calling Sequence
+ // xopt = lsqnonlin(fun,x0)
+ // xopt = lsqnonlin(fun,x0,lb,ub)
+ // xopt = lsqnonlin(fun,x0,lb,ub,options)
+ // [xopt,resnorm] = lsqnonlin( ... )
+ // [xopt,resnorm,residual] = lsqnonlin( ... )
+ // [xopt,resnorm,residual,exitflag] = lsqnonlin( ... )
+ // [xopt,resnorm,residual,exitflag,output,lambda,gradient] = lsqnonlin( ... )
+ //
+ // Parameters
+ // fun : a function, representing the objective function and gradient (if given) of the problem
+ // x0 : a vector of double, contains initial guess of variables.
+ // lb : a vector of double, contains lower bounds of the variables.
+ // ub : a vector of double, contains upper bounds of the variables.
+ // options : a list containing the parameters to be set.
+ // xopt : a vector of double, the computed solution of the optimization problem.
+ // resnorm : a double, objective value returned as the scalar value i.e. sum(fun(x).^2).
+ // residual : a vector of double, solution of objective function i.e. fun(x).
+ // exitflag : The exit status. See below for details.
+ // output : The structure consist of statistics about the optimization. See below for details.
+ // lambda : The structure consist of the Lagrange multipliers at the solution of problem. See below for details.
+ // gradient : a vector of doubles, containing the Objective's gradient of the solution.
+ //
+ // Description
+ // Search the minimum of a constrained non-linear least square problem specified by :
+ //
+ // <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");