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 :

Trouver l'équation d'une surface à partir de données [Débutant]


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut Trouver l'équation d'une surface à partir de données
    Bonjour,

    Je suis dans une impasse.
    J'essaye en vain de trouver l'équation d'une surface que j'ai dessiné dans Excel dont la base de données est celle-ci :

    	-90	-80	-70	-60	-50	-40	-30	-20	-10	0
    0	8170	8170	8170	8170	8170	8170	8170	8170	8170	8170
    10	8100	8220	8340	8440	8540	8620	8680	8730	8760	8770
    20	7950	8180	8390	8590	8760	8900	9020	9110	9160	9170
    30	7750	8050	8340	8600	8830	9020	9180	9300	9360	9390
    40	7450	7820	8160	8470	8740	8980	9160	9300	9380	9400
    50	7060	7470	7840	8190	8490	8750	8960	9110	9190	9220
    60	6570	7000	7390	7760	8080	8350	8570	8730	8820	8840
    70	5980	6410	6820	7180	7510	7790	8010	8160	8240	8270
    80	5320	5740	6130	6490	6800	7060	7270	7400	7480	7500
    90	4600	4980	5350	5670	5950	6190	6360	6470	6530	6550
    A gauche (de 0 à 90) la variable x et en haut (de -90 à 0) la variable y. Pour tout ces couples de points (x,y) j'ai une valeur z.

    Cela ressemble à une équation polynomiale du deuxième degré.

    Avez-vous une idée à me proposer?

    Merci d'avance!

  2. #2
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    Je te conseille de regarder la méthode polyfitn, disponible sur le FEX, qui te permettra de trouver les coefficients d'interpolation de ton polynôme.

  3. #3
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    Salut

    la fonction appropriée dans matlab est lsqcurvefit.
    tu va avoir besoin également d'utiliser la fonction meshgrid pour préparer correctement tes données
    et le plus important et de savoir (supposer) la forme de la fonction souhaité: quand tu parles équation polynomiale du deuxième degré, je suppose que tu fais référence à une forme quadratique.
    fabien

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  5. #5
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par FLB Voir le message
    Salut,
    Je te conseille de regarder la méthode polyfitn, disponible sur le FEX, qui te permettra de trouver les coefficients d'interpolation de ton polynôme.
    Tout d'abord merci pour ta réponse.

    J'avais déjà passé une heure à essayer de le faire fonctionner dans mon cas mais je trouve pas du tout la procédure à suivre.
    Est-ce que tu aurais une piste à me donner à partir des données que j'ai cité ci-dessus?

    Merci

  6. #6
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    J'imagine que vos trois méthodes sont possibles mais j'ai vraiment du mal à les concrétiser..
    Quelle ligne dois-je noter?
    J'ai déjà réussi à faire apparaitre la surface à l'aide de meshgrid et surf mais après...

    Merci en tout cas pour vos réponses

  7. #7
    Modérateur
    Avatar de le fab
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mars 2005
    Messages
    1 882
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 882
    Points : 3 432
    Points
    3 432
    Par défaut
    salut

    bon, déjà si tu as dessiner ta surface et utiliser meshgrid, tu as déjà fais une bonne partie du travail !
    la solution proposée par FLB est une fonction faite pour ce genre de problème et normalement devrait être la plus simple à mettre en oeuvre (c'est d'ailleurs probablement une encapsulation de la méthode que te conseille Dut)
    sinon pour rester dans du matlab pure, prend plutot la méthode que te conseilles Dut, elle est en effet rapide et efficace (je sais pas pourquoi, je n'y pense jamais quand j'ai un pb comme ça à résoudre, je me tourne toujours ves les fonctions d'optimisation)

    lit bien le tutoriel de ol9245, tout est très bien expliqué
    ça parait pas simple au début, mais ça se fait bien

    après juste une remarque quand même : si tu veux mettre des contraintes min et max sur tes coefficients, les méthodes polyfitn et \ ne marcheront pas et tu devra te retourner vers des fonctions d’optimisation (lsqcurvefit voir fmincon pour intégrer plus de contraintes sur les coefficients)

  8. #8
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Freelance mécatronique - Conseil, conception et formation
    Inscrit en
    Novembre 2006
    Messages
    20 302
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Freelance mécatronique - Conseil, conception et formation

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 302
    Points : 52 882
    Points
    52 882
    Par défaut
    Citation Envoyé par le fab Voir le message
    lit bien le tutoriel de ol9245, tout est très bien expliqué
    ça parait pas simple au début, mais ça se fait bien
    Voici un exemple :

    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
    y = -90:10:0;
    x = 0:10:90;
     
    [x,y] = meshgrid(y,x);
     
    z = [8170 8170 8170 8170 8170 8170 8170 8170 8170 8170
        8100 8220 8340 8440 8540 8620 8680 8730 8760 8770
        7950 8180 8390 8590 8760 8900 9020 9110 9160 9170
        7750 8050 8340 8600 8830 9020 9180 9300 9360 9390
        7450 7820 8160 8470 8740 8980 9160 9300 9380 9400
        7060 7470 7840 8190 8490 8750 8960 9110 9190 9220
        6570 7000 7390 7760 8080 8350 8570 8730 8820 8840
        5980 6410 6820 7180 7510 7790 8010 8160 8240 8270
        5320 5740 6130 6490 6800 7060 7270 7400 7480 7500
        4600 4980 5350 5670 5950 6190 6360 6470 6530 6550];
     
    M = [ones(numel(z),1) x(:) y(:) x(:).^2 x(:).*y(:) y(:).^2];
     
    K = M\z(:);
     
    zi = zeros(size(z));
    zi(:) = M*K;
     
    figure
    plot3(x,y,z,'r*')
    hold on
    surf(-90:10:0,0:10:90,zi);
    Ingénieur indépendant en mécatronique - Conseil, conception et formation
    • Conception mécanique (Autodesk Fusion 360)
    • Impression 3D (Ultimaker)
    • Développement informatique (Python, MATLAB, C)
    • Programmation de microcontrôleur (Microchip PIC, ESP32, Raspberry Pi, Arduino…)

    « J'étais le meilleur ami que le vieux Jim avait au monde. Il fallait choisir. J'ai réfléchi un moment, puis je me suis dit : "Tant pis ! J'irai en enfer" » (Saint Huck)

  9. #9
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Je tente donc la méthode de l'ajustement aux moindres carrés.

    Je pose X=0:10:90 et Y=-90:10:0 et j'importe mes données de Z qui donne une matrice :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    8170	8170	8170	8170	8170	8170	8170	8170	8170	8170
    8100	8220	8340	8440	8540	8620	8680	8730	8760	8770
    7950	8180	8390	8590	8760	8900	9020	9110	9160	9170
    7750	8050	8340	8600	8830	9020	9180	9300	9360	9390
    7450	7820	8160	8470	8740	8980	9160	9300	9380	9400
    7060	7470	7840	8190	8490	8750	8960	9110	9190	9220
    6570	7000	7390	7760	8080	8350	8570	8730	8820	8840
    5980	6410	6820	7180	7510	7790	8010	8160	8240	8270
    5320	5740	6130	6490	6800	7060	7270	7400	7480	7500
    4600	4980	5350	5670	5950	6190	6360	6470	6530	6550
    Ensuite je copie colle :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    X = X(:), Y=Y(:), Z=Z(:) ;
    nx = length(X) ; 
    U = ones(nx, 1) ;
    M = [U X Y X.^2 X.*Y Y.^2] ;
    J'obtiens un M =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    M =
     
           1            -90              0           8100              0              0       
           1            -80             10           6400           -800            100       
           1            -70             20           4900          -1400            400       
           1            -60             30           3600          -1800            900       
           1            -50             40           2500          -2000           1600       
           1            -40             50           1600          -2000           2500       
           1            -30             60            900          -1800           3600       
           1            -20             70            400          -1400           4900       
           1            -10             80            100           -800           6400       
           1              0             90              0              0           8100

    Il suffit donc plus qu'à faire le calcul :
    Mais voici une erreur qui apparait :
    ??? Error using ==> mldivide
    Matrix dimensions must agree.
    À partir de ce stade, je ne comprends plus trop ce que je fais. Apparemment il y a une erreur car les deux matrices n'ont pas les mêmes dimensions. Comment arranger le problème?

  10. #10
    FLB
    FLB est déconnecté
    Modérateur
    Avatar de FLB
    Homme Profil pro
    Ing. Aérospatiale
    Inscrit en
    Juin 2003
    Messages
    770
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France

    Informations professionnelles :
    Activité : Ing. Aérospatiale
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2003
    Messages : 770
    Points : 1 185
    Points
    1 185
    Par défaut
    Salut,
    n'oublie pas le

  11. #11
    Candidat au Club
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2013
    Messages : 5
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par FLB Voir le message
    Salut,
    n'oublie pas le
    Oui, ma faute était là.

    Merci beaucoup!

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 16/03/2010, 14h34
  2. Trouver le nom d'une ville à partir de la Longitude et latiude
    Par gpsevasion dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 01/07/2008, 16h58
  3. Réponses: 13
    Dernier message: 30/08/2007, 11h53
  4. Réponses: 4
    Dernier message: 06/06/2007, 12h16
  5. Réponses: 7
    Dernier message: 13/04/2007, 12h16

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