<html>
<head>
<meta content="text/html; charset=windows-1252"
http-equiv="Content-Type">
</head>
<body text="#000000" bgcolor="#FFFFFF">
<p><br>
</p>
<p>Hello Paul,</p>
<p>Rewriting the function as follows:</p>
<p>function f=target(x)<br>
val_lin = lineaire(x,1,2);<br>
val_rac = racine(x,10,6);<br>
// f = abs(val_lin - val_rac); <br>
f = sqrt((val_lin - val_rac)^2); <br>
disp(f)<br>
if ~isreal(f) then pause; end<br>
endfunction</p>
<p>will show you that at a certain iteraton 'x=-2' so
"racine(x,10,6)" returns a complex number and in turn sqrt() does,
when abs() returned the modulus (I added a 'pause' so you can play
with the variables).</p>
<p>Regards,</p>
<p>Paul<br>
</p>
<br>
<div class="moz-cite-prefix">On 01/15/2017 06:04 PM,
<a class="moz-txt-link-abbreviated" href="mailto:paul.carrico@free.fr">paul.carrico@free.fr</a> wrote:<br>
</div>
<blockquote cite="mid:4ccec3f1dd562124523b7f9b02bbe5d8@free.fr"
type="cite">
<meta http-equiv="Content-Type" content="text/html;
charset=windows-1252">
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">Hi Stephane,</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">You're right, I forgot my basis :-)</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">Nevertheless when I re-write the target function
as the following, it fails after some iterations and I do not
understand the origin (??)</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">Paul</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">#######################################</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">
<pre><span>function</span> <span>f</span><span>=</span><span>target</span><span>(</span><span>x</span><span>)</span>
<span>val_lin</span> <span>=</span> <span>lineaire</span><span>(</span><span>x</span><span>,</span><span>1</span><span>,</span><span>2</span><span>)</span><span>;</span>
<span>val_rac</span> <span>=</span> <span>racine</span><span>(</span><span>x</span><span>,</span><span>10</span><span>,</span><span>6</span><span>)</span><span>;</span>
<span>// f = abs(val_lin - val_rac); </span>
<span>f</span> <span>=</span> <span>sqrt</span><span>(</span><span>(</span><span>val_lin</span> <span>-</span> <span>val_rac</span><span>)</span><span>^</span><span>2</span><span>)</span><span>;</span>
<span>printf</span><span>(</span><span>"</span><span>f = %g\n</span><span>"</span><span>,</span><span>f</span><span>)</span><span>;</span>
<span>endfunction</span></pre>
</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">######################################</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">Console message:</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">*********** qnbd (with bound cstr) ****************<br>
dimension= 1, epsq= 0.2220446049250313E-15, verbosity level:
imp= 3<br>
max number of iterations allowed: iter= 1000<br>
max number of calls to costf allowed: nap= 1000<br>
------------------------------------------------<br>
f = 23.6393<br>
f = 25.1965<br>
f = 22.0911<br>
qnbd : iter= 1 f= 0.2363932D+02<br>
qnbd : nbre fact 1 defact 0 total var factorisees 1<br>
rlbd tp= 0.6440E+02 tmax= 0.1000E+11 dh0/dt=-0.6027E+00<br>
f = 21.6468<br>
f = 23.1924<br>
f = 20.111<br>
es t= 0.3318E+01 h=-0.1992E+01 dh/dt=-0.5981E+00
dfh/dt=-0.6005E+00 dt 0.3E+01<br>
f = 4<br>
f = 6.47214<br>
f = 6<br>
al_parameters,'qn','ar',nocf,niter,imp=3)<br>
!--error 98 <br>
La variable retournée par la fonction Scilab passée en argument
n'est pas valide.<br>
at line 36 of exec file called by : <br>
RFACE/Rosembrock/fonctions_test.sce', -1<br>
<br>
t= 0.6440E+02 h=-0.1992E+01 dh/dt=-0.5981E+00 dfh/dt= 0.0000E+00
dt 0.6E+02<br>
qnbd : indqn= 0</div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace"> </div>
<div class="pre" style="margin: 0; padding: 0; font-family:
monospace">Le 2017-01-15 12:59, Stéphane Mottelet a écrit :
<blockquote type="cite" style="padding: 0 0.4em; border-left:
#1010ff 2px solid; margin: 0">Hello <br>
<br>
Your target function is not differrentiable (Because of the
absolute<br>
value). That explains why optim has some difficulties. Using a
square<br>
instead should give the advantage to optim against
nelder-mead.<br>
<br>
S.<br>
<br>
<br>
<br>
<blockquote type="cite" style="padding: 0 0.4em; border-left:
#1010ff 2px solid; margin: 0">Le 15 janv. 2017 à 11:39, <a
moz-do-not-send="true" href="mailto:paul.carrico@free.fr">paul.carrico@free.fr</a>
a écrit :<br>
<br>
Hi all<br>
<br>
Well, from a "macro" point of view, gradient based methods
(order 1 method) should be more efficient than Nelder-Mead
one (order 0) especially for 1D topic, shouldn't be?<br>
<br>
In the case here bellow, when I use 'Optim' it is not the
case in comparison to 'NelderMead'... I don'y know what I'm
doing wrong but I decide to frop off 'optim' in favor tp
Nelder-Mead - nevertheless the later method requires much
more iterations :-(<br>
<br>
I'll be interested by some feedback on such topic, either in
the mailing list (or in MP in order to not pollute it).<br>
<br>
Paul<br>
########################################"<br>
'optim'<br>
########################################<br>
mode(0)<br>
<br>
function f=lineaire(x, a2, b2)<br>
f = a2*x+b2;<br>
endfunction<br>
<br>
function g=racine(x, a1, b1)<br>
g = sqrt(a1*x) + b1;<br>
endfunction<br>
<br>
function f=target(x)<br>
val_lin = lineaire(x,1,2);<br>
val_rac = racine(x,10,6);<br>
f = abs(val_lin - val_rac);<br>
endfunction<br>
<br>
// Cost function :<br>
function [f, g, ind]=cost(x, ind)<br>
f = target(x);<br>
// g = numderivative(target, x.');<br>
// g = numderivative(target, x.',0.1,order = 2);<br>
g = numderivative(target, x.',order = 2); // better but
why ??? h automatic works better ???<br>
// g = numderivative(target, x.',order = 4);<br>
// g = numderivative(target, x.',0.1, order = 4);<br>
endfunction<br>
<br>
// optimisation avec optim<br>
initial_parameters = [50]<br>
lower_bounds = [0];<br>
upper_bounds = [1000];<br>
nocf = 1000; // number of call of f<br>
niter = 1000; // number of iterations<br>
[fopt, xopt, gopt, work, iters, evals, err] =
optim(cost,'b',lower_bounds,upper_bounds,initial_parameters,'qn','ar',nocf,niter,imp=3);<br>
xopt<br>
fopt<br>
err<br>
<br>
// traçage courbes<br>
x = linspace(0,50,1000)';<br>
plot_raci = racine(x,10,6);<br>
plot_lin = lineaire(x,1,2);<br>
<br>
scf(1);<br>
drawlater();<br>
xgrid(3);<br>
f = gcf();<br>
//f<br>
f.figure_size = [1000, 1000];<br>
f.background = color(255,255,255);<br>
a = gca();<br>
//a<br>
a.font_size = 2;<br>
a.x_label.text = "X axis" ;<br>
a.x_location="bottom";<br>
a.x_label.font_angle=0;<br>
a.x_label.font_size = 4;<br>
a.y_label.text = "Y axis";<br>
a.y_location="left";<br>
a.y_label.font_angle=-90;<br>
a.Y_label.font_size = 4;<br>
a.title.text = "Title";<br>
a.title.font_size = 5;<br>
a.line_style = 1;<br>
<br>
// début des courbes<br>
plot(x,plot_lin);<br>
e1 = gce();<br>
p1 = e1.children;<br>
p1.thickness = 1;<br>
p1.line_style = 1;<br>
p1.foreground = 3;<br>
<br>
plot(x,plot_raci);<br>
e2 = gce();<br>
p2 = e2.children;<br>
p2.thickness = 1;<br>
p2.line_style = 1;<br>
p2.foreground = 2;<br>
drawnow();<br>
<br>
#######################################<br>
Nelder Mead<br>
#######################################<br>
mode(0)<br>
<br>
function f=lineaire(x, a2, b2)<br>
f = a2*x+b2;<br>
endfunction<br>
<br>
function g=racine(x, a1, b1)<br>
g = sqrt(a1*x) + b1;<br>
endfunction<br>
<br>
function [f, index]=target(x, index)<br>
val_lin = lineaire(x,1,2);<br>
val_rac = racine(x,10,6);<br>
f = abs(val_lin - val_rac);<br>
endfunction<br>
<br>
// optimisation avec optim<br>
initial_parameters = [50]<br>
lower_bounds = [0];<br>
upper_bounds = [1000];<br>
<br>
nm = neldermead_new ();<br>
nm = neldermead_configure(nm,"-numberofvariables",1);<br>
nm = neldermead_configure(nm,"-function",target);<br>
nm = neldermead_configure(nm,"-x0",initial_parameters);<br>
nm = neldermead_configure(nm,"-maxiter",1000);<br>
nm = neldermead_configure(nm,"-maxfunevals",1000);<br>
nm = neldermead_configure(nm,"-tolfunrelative",10*%eps);<br>
nm = neldermead_configure(nm,"-tolxrelative",10*%eps);<br>
nm = neldermead_configure(nm,"-method","box");<br>
nm = neldermead_configure(nm,"-boundsmin",lower_bounds);<br>
nm = neldermead_configure(nm,"-boundsmax", upper_bounds);<br>
nm = neldermead_search(nm);<br>
nm = neldermead_restart(nm);<br>
xopt = neldermead_get(nm,"-xopt")<br>
fopt = neldermead_get(nm,"-fopt")<br>
nm = neldermead_destroy(nm);<br>
<br>
// traçage courbes<br>
x = linspace(0,50,1000)';<br>
a1 = 10; b1 = 6; // b1 > b2 here<br>
a2 = 1; b2 = 2;<br>
<br>
plot_raci = racine(x,a1,b1);<br>
plot_lin = lineaire(x,a2,b2);<br>
<br>
scf(1);<br>
drawlater();<br>
xgrid(3);<br>
f = gcf();<br>
//f<br>
f.figure_size = [1000, 1000];<br>
f.background = color(255,255,255);<br>
a = gca();<br>
//a<br>
a.font_size = 2;<br>
a.x_label.text = "X axis" ;<br>
a.x_location="bottom";<br>
a.x_label.font_angle=0;<br>
a.x_label.font_size = 4;<br>
a.y_label.text = "Y axis";<br>
a.y_location="left";<br>
a.y_label.font_angle=-90;<br>
a.Y_label.font_size = 4;<br>
a.title.text = "Title";<br>
a.title.font_size = 5;<br>
a.line_style = 1;<br>
<br>
// début des courbes<br>
plot(x,plot_lin);<br>
e1 = gce();<br>
p1 = e1.children;<br>
p1.thickness = 1;<br>
p1.line_style = 1;<br>
p1.foreground = 3;<br>
<br>
plot(x,plot_raci);<br>
e2 = gce();<br>
p2 = e2.children;<br>
p2.thickness = 1;<br>
p2.line_style = 1;<br>
p2.foreground = 2;<br>
drawnow();<br>
_______________________________________________<br>
users mailing list<br>
<a moz-do-not-send="true"
href="mailto:users@lists.scilab.org">users@lists.scilab.org</a><br>
<a moz-do-not-send="true"
href="http://lists.scilab.org/mailman/listinfo/users"
target="_blank" rel="noreferrer">http://lists.scilab.org/mailman/listinfo/users</a></blockquote>
<br>
_______________________________________________<br>
users mailing list<br>
<a moz-do-not-send="true" href="mailto:users@lists.scilab.org">users@lists.scilab.org</a><br>
<a moz-do-not-send="true"
href="http://lists.scilab.org/mailman/listinfo/users"
target="_blank" rel="noreferrer">http://lists.scilab.org/mailman/listinfo/users</a></blockquote>
</div>
<br>
<fieldset class="mimeAttachmentHeader"></fieldset>
<br>
<pre wrap="">_______________________________________________
users mailing list
<a class="moz-txt-link-abbreviated" href="mailto:users@lists.scilab.org">users@lists.scilab.org</a>
<a class="moz-txt-link-freetext" href="http://lists.scilab.org/mailman/listinfo/users">http://lists.scilab.org/mailman/listinfo/users</a>
</pre>
</blockquote>
<br>
<pre class="moz-signature" cols="72">--
Paul BIGNIER
Development engineer
-----------------------------------------------------------
Scilab Enterprises
143bis rue Yves Le Coz - 78000 Versailles, France
Phone: +33.1.80.77.04.68
<a class="moz-txt-link-freetext" href="http://www.scilab-enterprises.com">http://www.scilab-enterprises.com</a></pre>
</body>
</html>