« Découvrir Scilab/Optimisation d'une fonction » : différence entre les versions

m
<source> -> <syntaxhighlight> (phab:T237267)
m (<source> -> <syntaxhighlight> (phab:T237267))
 
 
L'optimisation non linéaire est le cas général. On utilise pour cela la fonction <code>optim</code> :
<sourcesyntaxhighlight lang="scilab">
[fopt, xopt] = optim(costf, x0)
</syntaxhighlight>
</source>
* <code>costf</code> est la « fonction de coût » de ƒ ; c'est une fonction qui renvoit la valeur de la fonction ƒ en '''x''' et le gradient de ƒ en '''x''', défini sous la forme<br /><code>function [f, g, ind] = costf(x, ind)</code><br />où <code>f</code> désigne ƒ('''x'''), <code>g</code> est le gradient et <code>ind</code> est un index, un entier permettant de modifier le comportement de <code>costf</code> ;
* <code>fopt</code> = ƒ(<code>xopt</code>), valeur estimée du minimum.
On peut indiquer des bornes inférieures et supérieure de '''x''', sous al forme de vecteurs '''x'''<sub>inf</sub> et '''x'''<sub>sup</sub> :
<sourcesyntaxhighlight lang="scilab">
[fopt, xopt] = optim(f, x0, "b", xinf, xsup)
</syntaxhighlight>
</source>
 
La fonction <code>optim()</code> est une [[w:fr:Méthode de quasi-Newton|méthode de quasi-Newton]] utilisant les [[w:fr:Critères de Wolfe|critères de Wolfe]].
[[Fichier:Minimum fonction scilab.svg|vignette|upright=2|Minimum de la fonction pseudo-convexe différentiable <math>y = x^2 + 5 \sin x</math> avec scilab.]]
 
<sourcesyntaxhighlight lang="scilab">
function [f, g, ind] = cout(x, ind)
f = x.*x + 5*sin(x);
plot(x, y);
plot(xopt, fopt, "k+");
</syntaxhighlight>
</source>
 
Si l'on ne connaît pas de forme analytique de la fonction dérivée, on peut utiliser la fonction <code>numderivative()</code> :
 
<sourcesyntaxhighlight lang="scilab">
function [y] = fonction(x)
y = x.*x + 5*sin(x);
plot(xopt, fopt, "k+");
 
</syntaxhighlight>
</source>
 
== Optimisation linéaire ==
 
La syntaxe la plus simple permet de résoudre le problème sur la frontière du polyèdre, donc avec des égalités partout :
<sourcesyntaxhighlight lang="scilab">
xopt = karmarkar(Ae, be, c)
</syntaxhighlight>
</source>
résout
: <math>\begin{cases}
 
La solution s'obtient donc par
<sourcesyntaxhighlight lang="scilab">
Aeq = [1, -1, 0 ; 1, 1,1];
beq = [0 ; 2];
c = [-1 ; -1 ; 0];
xopt = karmarkar(Aeq, beq, c)
</syntaxhighlight>
</source>
et le résultat est :
<sourcesyntaxhighlight lang="scilab">
xopt =
 
0.9999949
0.0000102
</syntaxhighlight>
</source>
 
On peut y ajouter un système d'inéquations<ref>les cinq paramètres vides <code>[]</code> sont des paramètres que nous ne présentons pas ici à l'exception du premier, '''x<sub>0</sub>''' ci-dessous. Ils sont décrits dans la page d'aide : {{lien web | url = https://help.scilab.org/docs/6.0.0/fr_FR/karmarkar.html | titre = karmarkar: Solves a linear optimization problem. | langue = en | site = help.scilab.org | consulté le = 2017-02-13}}</ref> :
<sourcesyntaxhighlight lang="scilab">
xopt = karmarkar(Ae, be, c, [], [], [], [], [], Ai, bi)
</syntaxhighlight>
</source>
résout
: <math>\begin{cases}
\end{cases}</math>
et si l'on n'a que des inéquations :
<sourcesyntaxhighlight lang="scilab">
xopt = karmarkar([], [], c, [], [], [], [], [], Ai, bi)
</syntaxhighlight>
</source>
résout
: <math>\begin{cases}
 
On peut indiquer un vecteur de départ '''x<sub>0</sub>''' :
<sourcesyntaxhighlight lang="scilab">
xopt = karmarkar(A, b, c, x0)
xopt = karmarkar(A, b, c, x0, [], [], [], [], Ai, bi)
xopt = karmarkar([], [], c, x0, [], [], [], [], Ai, bi)
</syntaxhighlight>
</source>
et l'on peut demander de calculer la valeur de ƒ('''x<sub>opt</sub>''') :
<sourcesyntaxhighlight lang="scilab">
[xopt,fopt] = karmarkar(…)
</syntaxhighlight>
</source>
 
; Voir aussi
 
La commande <code>qpsolve</code>, sous la forme :
<sourcesyntaxhighlight lang="scilab">
[x] = qpsolve(Q, p, C, b, ci, cs, me)
</syntaxhighlight>
</source>
utilise la fonction Fortran <code>qpgen1.f</code> (également appelée <code>QP.solve.f</code>), developpée par Berwin A. Turlach selon l'algorithme de Goldfarb/Idnani.
 
 
La commande <code>qld</code>, sous la forme :
<sourcesyntaxhighlight lang="scilab">
[x, lagr] = qld(Q, p, C, b, ci, cs, me)
</syntaxhighlight>
</source>
utilise la méthode de Powell modifiée par Schittkowski.
 
1 535

modifications