<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /></head><body style='font-size: 10pt; font-family: Verdana,Geneva,sans-serif'>
<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 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 href="mailto:users@lists.scilab.org">users@lists.scilab.org</a><br /> <a 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 href="mailto:users@lists.scilab.org">users@lists.scilab.org</a><br /> <a href="http://lists.scilab.org/mailman/listinfo/users" target="_blank" rel="noreferrer">http://lists.scilab.org/mailman/listinfo/users</a></blockquote>
</div>
</body></html>