IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

MATLAB Discussion :

Souci avec fmincon


Sujet :

MATLAB

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut Souci avec fmincon
    Salut

    J'ai un souci avec l'utilisation de fmincon

    voici mon code:

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    clear all
    clc;
     
    %%             LECTURA DE LOS DATOS
     
    %Leyendo los nodos con sus respectivas coordenadas
     
    %        fich=fopen('jano1.1.node');      % 128  elementos
            fich=fopen('malla1.node');
     
      nnum=fscanf(fich,'%i',3);
      Nnodos=nnum(1);
     datoscompletos=fscanf(fich,'%f',[5,Nnodos]);
     datoscompletos=datoscompletos';
     fclose(fich);
     
    coordinate=[datoscompletos(:,2) datoscompletos(:,3)];
     
    X=coordinate(:,1);
    Y=coordinate(:,2);
    Z=datoscompletos(:,4);
     
     tri=delaunay(X,Y);
     element=tri;
     trisurf(tri,X,Y,Z)
     
     
     for j=16 %1:1%size(element,1)
     
    %     syms x y;
    %     cp=[x  y];
        x1=coordinate(element(j,1),1);y1=coordinate(element(j,1),2);z1=Z(element(j,1));
        x2=coordinate(element(j,2),1);y2=coordinate(element(j,2),2);z2=Z(element(j,2));
        x3=coordinate(element(j,3),1);y3=coordinate(element(j,3),2);z3=Z(element(j,3));
     
        %x=coordinate
     
        cl=coordinate(element(j,1),: );
        cm=coordinate(element(j,2),: );
        cn=coordinate(element(j,3),: );
     
        v0 = cn - cl;
        v1 = cm - cl;
        %v2 = cp - cl; % variable
     
        dot00 = dot(v0, v0);
        dot01 = dot(v0, v1);
        %dot02 = dot(v0, v2);
        dot11 = dot(v1, v1);
        %dot12 = dot(v1, v2);  % variable
     
        K = 1 / (dot00 * dot11 - dot01 * dot01);
     
        a= [(dot(v1,v1)*(x3-x1)- dot(v0,v1)*(x2-x1))/K];
        b= [(dot(v1,v1)*(y3-y1)- dot(v0,v1)*(y2-y1))/K];
        c= [(dot(v0,v0)*(x2-x1)- dot(v0,v1)*(x2-x1))/K];
        f= [(dot(v0,v0)*(y2-y1)- dot(v0,v1)*(y2-y1))/K];
     
        c1=(x1^2-x1*x3)+(y1^2-y1*y3);
        c2=(x1^2-x1*x2)+(y1^2-y1*y2);
     
        D1= ((dot(v1,v1)*c1-dot(v0,v1)*c2))/K;
        D2= ((dot(v0,v0)*c2-dot(v0,v1)*c1))/K;
     
        % plano ax+by+cz+d
     
        Pa=(y2-y1)*(z3-z1)-(z2-z1)*(y3-y1);
        Pb=-(x2-x1)*(z3-z1)-(z2-z1)*(x3-x1);
        Pc=(x2-x1)*(y2-y1)-(y2-y1)*(x3-x1);
        Pd=-(Pa*x1+Pb*y1+Pc*z1);
     
        pp1=Pa/Pc;
        pp2=Pb/Pc;
        pp3=Pd/Pc;
     
    AA=[a  ,  b    ;
        c  ,  f    ;
        -(a+c),  -(b+f)  ];
     
    BB=[-D1;
        -D2;
        (D1+D2)-1];
     
     
    options=optimset('MaxFunEvals',500)
     
    partida= [x1;y1];
     
     [x,fval,flag,output]=fmincon(@(x)-dot(x,[pp1pp2])-pp3,partida,AA,BB,[],[],[],[],[],options)
     
    end
    L'idée est de lire dans un fichier texte certaines données. Ces données correspondent à des coordonnées de point. Ces points vont etre triangularisé (en deux dimensions) par la méthode de Delaunay. On va ainsi avoir un tableau qui decrit les points qui vont former les triangles (TRI).

    Le but ensuite est de chercher un minimum dans chaque triangle. Pour l'instant , il est vrai que le minimum du triangle devrait etre un sommet (mais plus tard ce ne sera pas le cas, car je rajouterai une deuxieme partie à la formule), mais ce n'est pas le cas. Je dois avoir un probleme au niveau de la declaration de fmincon. Regardez en premier cette ligne pour voir si quelque chose vous choque. Je suis encore debutant matlab...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [x,fval,flag,output]=fmincon(@(x)-dot(x,[pp1pp2])-pp3,partida,AA,BB,[],[],[],[],[],options)
    Merci d'avance

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mai 2008
    Messages
    2 040
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 2 040
    Par défaut
    Salut.
    si quelque chose vous choque.
    Il faut ouvrir (puis fermer)le fichier et utiliser fid à la place de son nom.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fid = fopen('fich.txt');...fclose(fid)
    Ton instruction devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nnum=fscanf(fid,'%i',3);....

  3. #3
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    @phryte : c'est bien ce qu'il fait, sauf qu'il nomme la sortie de fopen fich ce qui peut porter à confusion pour ceux qui ont l'habitude de nommer le file identifier fid

    @didougna : je ne comprends pas quel est ton souci exactement avec fmincon
    As-tu un message d'erreur ou est-ce que ce sont les résultats obtenus que tu trouve incorrects ?

    Nota : je n'ai pas regardé le reste du code

  4. #4
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    Bonjour, et merci de vos reponses.

    Je n'ai pas de souci pour l'ouverture du fichier, j'ai verifié avec quelques valeurs.

    Je n'ai pas de message d'erreur. Je vais vous eclaircir un peu plus ce qu'est sensé faire l'algorithme:

    Nous avons un graphique donnant le prix d'une terre Z en fonction de ses coordonnées (X,Y). Ce graphique est donc en trois dimensions (X,Y,Z). Comme nous n'avons pas assez de valeur pour faire une regression correcte, nous avons triangulé l'espace grace à la fonction delaunay.

    Jusque la il n'y a pas de souci, et le rendu graphique est correct.

    Le but etant de rechercher l'endroit où le prix de la terre est le plus bas, on va chercher le z minimun pour chaque triangle, dans le but de créer une matrice rassemblant les minimum de tous les triangles.

    Logiquement, le z minimun d'un triangle devrait se trouver à l'un de ses sommets.

    Pour initialiser fmincon, on doit lui donner un point de depart, dans mon cas j'ai choisi un des sommets (X1,Y1). Le probleme est e que lorsque je lance fmincon, la solution qu'il me sort est l'un des sommet, mais toujours le meme, c'est a dire en fait le sommet (X1,Y1) comme si en fait il ne se passait rien.

    Je n'arrive vraiment plus a avancer la, merci de votre aide précieuse. N'hésitez pas a poser des questions, je reponds avec un petit décallage car je suis au chili...

  5. #5
    Membre habitué
    Inscrit en
    Juin 2008
    Messages
    12
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 12
    Par défaut
    Mon souci a un peu évolué.

    Maintenant j'ai un probleme avec le nombre d'iteration, en réalité il ne fait qu'une seule itération.

    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
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     %% Programa para el problema de Empresas
     
     
    clear all
    clc;
     
    %%             LECTURA DE LOS DATOS
     
    %Leyendo los nodos con sus respectivas coordenadas
     
    %        fich=fopen('jano1.1.node');      % 128  elementos
            fich=fopen('malla1.node');
     
      nnum=fscanf(fich,'%i',3);
      Nnodos=nnum(1);
     datoscompletos=fscanf(fich,'%f',[5,Nnodos]);
     datoscompletos=datoscompletos';
     fclose(fich);
     
    coordinate=[datoscompletos(:,2) datoscompletos(:,3)];
     
    X=coordinate(:,1);
    Y=coordinate(:,2);
    Z=datoscompletos(:,4);
     
     tri=delaunay(X,Y);
     element=tri;
     trisurf(tri,X,Y,Z)
     
     
     for j=4 %1:1%size(element,1)
     
    %     syms x y;
    %     cp=[x  y];
        x1=coordinate(element(j,1),1);y1=coordinate(element(j,1),2);z1=Z(element(j,1));
        x2=coordinate(element(j,2),1);y2=coordinate(element(j,2),2);z2=Z(element(j,2));
        x3=coordinate(element(j,3),1);y3=coordinate(element(j,3),2);z3=Z(element(j,3));
     
        %x=coordinate
     
        cl=coordinate(element(j,1),:);
        cm=coordinate(element(j,2),:);
        cn=coordinate(element(j,3),:);
     
        v0 = cn - cl;
        v1 = cm - cl;
        %v2 = cp - cl; % variable
     
        dot00 = dot(v0, v0);
        dot01 = dot(v0, v1);
        %dot02 = dot(v0, v2);
        dot11 = dot(v1, v1);
        %dot12 = dot(v1, v2);  % variable
     
        K = 1 / (dot00 * dot11 - dot01 * dot01);
     
        a= [(dot(v1,v1)*(x3-x1)- dot(v0,v1)*(x2-x1))*K];
        b= [(dot(v1,v1)*(y3-y1)- dot(v0,v1)*(y2-y1))*K];
        c= [(dot(v0,v0)*(x2-x1)- dot(v0,v1)*(x3-x1))*K];
        f= [(dot(v0,v0)*(y2-y1)- dot(v0,v1)*(y3-y1))*K];
     
        c1=(x1^2-x1*x3)+(y1^2-y1*y3);
        c2=(x1^2-x1*x2)+(y1^2-y1*y2);
     
        D1= ((dot(v1,v1)*c1-dot(v0,v1)*c2))*K;
        D2= ((dot(v0,v0)*c2-dot(v0,v1)*c1))*K;
     
        % plano ax+by+cz+d
     
        Pa=(y2-y1)*(z3-z1)-(z2-z1)*(y3-y1);
        Pb=-((x2-x1)*(z3-z1)-(z2-z1)*(x3-x1));
        Pc=(x2-x1)*(y3-y1)-(y2-y1)*(x3-x1);
        Pd=-(Pa*x1+Pb*y1+Pc*z1);
     
        pp1=Pa/Pc;
        pp2=Pb/Pc;
        pp3=Pd/Pc;
     
    AA=[-a  ,  -b    ;
        -c  ,  -f    ;
        (a+c), (b+f)  ];
     
    BB=[D1;
        D2;
        1-(D1+D2)];
     
    options=optimset('MaxFunEvals',500);
     
     
     
    options = optimset('LargeScale','off');
     
     partida= [x3;y3];
      [x,fval,exitflag,output,]=fmincon(@(x)-dot(x,[pp1pp2])-pp3,partida,AA,BB,[],[],[],[],[],options)
     
     
     
     end

    resultat:

    Optimization terminated: Magnitude of directional derivative in search
    direction less than 2*options.TolFun and maximum constraint violation
    is less than options.TolCon.
    Active inequalities (to within options.TolCon = 1e-006):
    lower upper ineqlin ineqnonlin
    2
    3

    x =

    1.0e+004 *

    1.0954
    0.9649


    fval =

    5.2700


    exitflag =

    5


    output =

    iterations: 1
    funcCount: 7
    stepsize: 1
    algorithm: 'medium-scale: SQP, Quasi-Newton, line-search'
    firstorderopt: 9.0911e-005
    cgiterations: []
    message: [1x172 char]

  6. #6
    Expert confirmé
    Avatar de Caro-Line
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    9 458
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 9 458
    Par défaut
    Citation Envoyé par didougna Voir le message
    Maintenant j'ai un probleme avec le nombre d'iteration, en réalité il ne fait qu'une seule itération.
    ça n'est pas vraiment étonnant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for j=4%1:1%size(element,1)
    Donc il ne fait la boucle que pour j=4
    Tu devrais peut-être supprimer le 4 et le % qui suit et aussi le 1% avant le size(element,1).

    De temps en temps quand on a le nez trop souvent dans son code on ne voit plus les erreurs évidentes

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. quelques soucis avec word 2000
    Par ramchou dans le forum Word
    Réponses: 3
    Dernier message: 06/09/2004, 19h13
  2. SOucis avec une reequete imbriquee
    Par Ni4k dans le forum Langage SQL
    Réponses: 6
    Dernier message: 30/03/2004, 09h56
  3. souci avec un algorithme
    Par slider16 dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 22/03/2004, 18h17
  4. [DEBUTANT] petits soucis avec un prgm de chat
    Par LechucK dans le forum MFC
    Réponses: 8
    Dernier message: 19/01/2004, 17h52
  5. Réponses: 4
    Dernier message: 16/02/2003, 13h16

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo