1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2012
    Messages : 48
    Points : 26
    Points
    26

    Par défaut sélection aléatoire de x et y pour définir r rayon et l'angle phi d'un vecteur

    Bonsoir à tous,

    J'ai écrit un programme qui doit me permet de sélectionner aléatoirement dans un disque de rayon R centré sur 0, un couple (x,y) pour déduire un couple (r,phi):
    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
    %Selection aleatoire de x,y dans la surface de diametre d%
    clear  all
    close all
     
    d=4; % diametre de la source cm
    datome= 125E-12;
    satome=2*pi*(datome/2)^2;
    s=2*pi*(d/2)^2;
    nbsite=s/satome;
    rmin=-d/2;
    rmax=d/2;
    for i=1:1E6;
    p1=rand(1);
    p2=rand(1);
    x(i)=rmin+(rmax-rmin)*p1;
    y(i)=rmin+(rmax-rmin)*p1;
    r(i)=sqrt(x(i)^2+y(i)^2);
    phi(i)=acos(x(i)/r(i))*(180/pi);
    R(1E6)=2;
    if r(i)<=d/2;
        if r(i)>0
        R(i)=r(i);
    end
    end 
    end
    Le problème est que je n'explore qu'un quart des phi possible ...
    J'aimerai pouvoir explorer tous les r compris entre 0 et R ainsi que tous les phi compris en -pi et pi
    J'aimerai ensuite représenté tous les points (x,y) dans un disque de rayon R
    Vos conseils et remarques sont les bien venus

    Maxime

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2012
    Messages : 48
    Points : 26
    Points
    26

    Par défaut

    J'ai identifié mon erreur c'est situé dans la définition de phi ... qui doit être calculé avec atan et non acos
    Bref pour le calcule, j'ai décidé d'utiliser la fonction cart2pol(x,y) qui marche bien pour ce que je cherche à obtenir
    Maintenant j'aimerai représenter sur un graphique les points que j'ai définis par (x,y,r,phi)
    j'ai tenter un polarplot mais la réponse n'est pas bonne :
    Nom : polarplot_x_y.jpg
Affichages : 24
Taille : 12,8 Ko

    je ne comprend pas pourquoi je n'explore pas l'angle total ....

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2012
    Messages : 48
    Points : 26
    Points
    26

    Par défaut

    J'ai résolu mon problème en triturent les fonction atan atan2 et atand.
    Le code suivant permet de sélectionner aléatoirement x et y pour calculer r et phi.
    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
    %Selection aleatoire de x,y dans la surface de diametre d%
    clear  all
    close all
    tic
    d=4; % diametre de la source cm
    rmin=-d/2;
    rmax=d/2;
     
    % on peut estimer les r et phi à partir d'une selection aléatoire de x et y
    for i=1:1E6;
    p1=rand(1); % on produit un nombre aléatoire pour x
    p2=rand(1); % on produit un nombre aléatoire pour y   
    x(i)=rmin+(rmax-rmin)*p1;
    y(i)=rmin+(rmax-rmin)*p2;
    R(i)=sqrt(x(i)^2+y(i)^2); % on calcul r le rayon
    phi(i)=atand(y(i)/x(i)); % on calcul phi l'angle du vecteur OP
    end
    toc
    Pour la réponse graphique grâce à polar(phi,r):
    Nom : polarplot_x_y.jpg
Affichages : 26
Taille : 12,0 Ko

  4. #4
    Rédacteur/Modérateur

    Avatar de Jerome Briot
    Homme Profil pro
    Ingénieur R&D freelance
    Inscrit en
    novembre 2006
    Messages
    19 587
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur R&D freelance

    Informations forums :
    Inscription : novembre 2006
    Messages : 19 587
    Points : 52 959
    Points
    52 959

    Par défaut

    Pour commencer, tu peux te passer de la boucle for-end :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    p1 = rand(1,1E6); % on produit 1E6 nombres aléatoires pour x
    p2 = rand(1,1E6); % on produit 1E6 nombres aléatoires pour y   
    x = rmin+(rmax-rmin)*p1;
    y = rmin+(rmax-rmin)*p2;
    R = sqrt(x.^2+y.^2); % on calcule r les rayons
    phi = atand(y./x); % on calcule phi les angles des vecteurs OP
    Ensuite, tu ne fais pas le bon calcul pour l'angle. La fonction atand renvoi la valeur de l'angle en degré, d'où le "d" à la la fin du nom de la fonction. Or on travaille généralement en radian. C'est la cas avec la fonction polar par exemple dont le premier argument s’exprime en radian.

    Il faudrait plutôt écrire :

    En faisant ceci, tu trouveras des valeurs dans l'intervalle [-pi/2 pi/2] :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> [min(phi) max(phi)]
     
    ans =
     
       -1.5659    1.5288
    Si tu veux couvrir tout le domaine angulaire, utilise plutôt atan2 :
    Les valeurs seront alors dans l'intervalle [-pi pi] :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >> [min(phi) max(phi)]
     
    ans =
     
       -3.1224    3.0342
    Pour finir, je ne vois pas l’intérêt de passer par les coordonnées cartésiennes.

    Pourquoi ne pas directement faire ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    R = (rand(1,1E6)-0.5)*d;
    phi = (rand(1,1E6)-0.5)*2*pi;
    Images attachées Images attachées  
    Mes compétences :
    • conception mécanique 3D (Autodesk Fusion 360)
    • développement informatique (MATLAB, Python, C, VBA)
    • impression 3D (Ultimaker)
    • programmation de microcontrôleur (Microchip PIC et 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
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    janvier 2012
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : janvier 2012
    Messages : 48
    Points : 26
    Points
    26

    Par défaut

    Merci pour tous ces conseils
    j'ai conservé l'approche que j'avais posé sur mon schéma papier, j'ai développé mon problème en partant d'un repère cartésien mais cela a été pédagogique, j'ai appris beaucoup sur l'utilisation des fonctions.
    C'est bien ce que je cherchais à obtenir

    L'étape suivante est la représentation de la fonction de distribution d'évaporation des particules en chaque point définit par (R,phi) j'aime les challenges

    Merci beaucoup

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

Discussions similaires

  1. JCombobox méthode pour définir l'action de sélection
    Par Fab8679 dans le forum Composants
    Réponses: 5
    Dernier message: 24/08/2013, 21h35
  2. Sélection aléatoire d'un commercial de l'agence pour chaque client
    Par Noirceuil dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 05/08/2008, 00h29
  3. Aide pour définir des index (traitement long)
    Par m-mas dans le forum MS SQL-Server
    Réponses: 7
    Dernier message: 25/05/2006, 20h39
  4. Sélection aléatoire d'une seule ligne.
    Par Pat bol 002 dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 05/01/2005, 19h30
  5. Réponses: 7
    Dernier message: 07/09/2004, 14h16

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