Bonjour à tous,
Tout d'abord je dois avouer que je suis novice dans l'utilisation de OCTAVE donc merci d'être indulgent avec ma question ...
J'utilise le code suivant avec la fonction SQP
J'essaie de résoudre un système linéaire du style :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48 # rline = dbstop( 51) #! C:\Octave\3.2.4_gcc-4.4.0\bin\octave-3.2.4.exe -q -f clear all global M LMIN LMAX B global bMin bMax lgCar lgComp function obj = phi (x) global M B obj=norm(((M*x)-B')); endfunction function r=f (x) global M T B LMIN LMAX bMin bMax lgCar lgComp DM1 DM2 DM1=[M, zeros(lgCar, lgCar);zeros(lgCar, lgComp),diag(bMax, 0)]; DM2=[diag(bMin, 0),zeros(lgCar, lgComp);zeros(lgCar, lgCar),M]; r=(DM1*(vertcat(x, ones(lgCar, 1))))-(DM2*(vertcat(ones(lgCar, 1), x))); endfunction function r=g (x) r=sum(x)-1; endfunction MM=[[17 0 82 0 17 85 105] [0 0 98 90 90 86 95] [93 93 0 93 0 1 324] [42 1 52 1 41 57 139]]; M=MM'; LMIN=[29 12 44 14 16 41 136]; LMAX=[54 22 69 46 48 70 165]; B=[50 12 60 46 35 60 150]; lgCar=rows(M); lgComp=columns(M); x02(1:lgComp)=0;x02=x02'; xmin(1:lgComp)=0;xmin=xmin'; xmax(1:lgComp)=1;xmax=xmax'; Inc=10 T(1:lgCar)=Inc bMin=max(B-T,LMIN); bMax=min(B+T,LMAX); [x, obj, info, iter, nf, lambda] = sqp (x02, @phi, @g, @f, xmin, xmax); iter x # pause
M*X = B. X est l'inconnu et B est la cible.
X doit être tel que B0 = M*X doit se rapprocher le plus possible de B avec comme contrainte :
0<=X<=1 et
LMin <= B0 <= LMax
Après plusieurs essais infructueux, j'ai introduit une nouvelle variable : Inc qui permet d'affecter une tolérance autour de B (voir dans le code le calcul de bMin et bMax). La nouvelle contrainte est donc :
bMin <= B0 <= bMax
Certaines valeurs de Inc donne un résultat (exemple Inc=10) par contre pour une valeur plus faible (Inc =9) le système retourne une erreur sur la fonction SQP (voir fichier joint).
Je peux comprendre que certains systèmes n'admettent pas de solutions répondant aux contraintes imposées mais je suis surpris que la fonction ne retourne pas un code Erreur afin de pouvoir l'exploiter et entreprendre une autres stratégie (dans mon cas augmenter Inc par exemple).
Plusieurs questions :
- Ai-je "loupé" quelque chose dans l'utilisation de la fonction SQP ?
- Est-ce que mon approche est erronée et ne devrais-je pas utiliser une autre méthode ? Si oui, laquelle ?
Merci par avance de vous intéresser à mon problème.
Cordialement
Partager