Chercher avec matlab ...

Résolu/Fermé
sofyann17 Messages postés 2 Date d'inscription samedi 12 septembre 2009 Statut Membre Dernière intervention 17 septembre 2009 - 12 sept. 2009 à 13:31
sofyann17 Messages postés 2 Date d'inscription samedi 12 septembre 2009 Statut Membre Dernière intervention 17 septembre 2009 - 17 sept. 2009 à 14:17
Bonjour,avec matlab ,je veut savoir comment extraire des points donnés d'une matrice de cooordonnées (x,y),qui verifient la condition x^2+y^2=1 (equation de cercle)
est ce que la commande "find" fera l'affaire en integrant cette condition

est ce que ya t il un moyen d'inserer dans le script une tolerence qui me permet d'extraire meme les points
proche du perimetre du cercle(c est a dire les point qui verifient presque la condition x^2+y^2=1 ....par exemple un point qui donnent x^2+y^2=0.99999

j'attend impattiamment vos tube d'idées et vos solution et merci d'avance......................

1 réponse

Princess-Sarah Messages postés 78 Date d'inscription mardi 29 avril 2008 Statut Membre Dernière intervention 13 septembre 2009 47
13 sept. 2009 à 19:21
Bonjour sofyann17 !

Il faut bien avouer que ta demande manque cruellement de clarté !
Une matrice de coordonnées (x,y) dis-tu ?
Une matrice est indexée par des entiers naturels, donc ta demande telle qu'elle est formulée manque quelque peu d'explications.

En supposant que tes coordonnées (x,y) sont respectivement stockées dans des matrices X et Y, ce qui serait par exemple le cas si tu cherchais les points d'un grille régulière donnée par un meshgrid qui appartiennent au cercle unité.
Pour une grille régulière sur [-1,1]² avec 100 points de discrétisation sur les axes des abscisses et des ordonnées par exemple, nous aurions :
[X,Y]=meshgrid(linspace(-1,1,100));
Dans ce cas, il te suffit effectivement d'utiliser find de cette manière :
[rows,cols]=find(X.^2+Y.^2==1);

rows et cols te donnant les indices pour lesquels x²+y²=1.

Si de plus tu veux les coordonnées (x,y) de ces points, quelque chose de ce genre devrait faire l'affaire :
x=X(sub2ind(size(X),rows,cols));
y=Y(sub2ind(size(Y),rows,cols));

Si maintenant tu veux ajouter une tolérance, parce qu'il est clair qu'à moins d'avoir une chance énorme, tu n'auras jamais parfaitement x²+y²=1, il te suffit d'utiliser la tolérance que tu désires justement.
Si par exemple, tu cherches les points de coordonnées (x,y) tels que |x²+y²-1|≤tol avec tol=0.001, tu devras faire quelque chose comme cela :
tol=1e-3;
[rows,cols]=find(abs(X.^2+Y.^2-1)<=tol);

Et de la même manière que précédemment, si tu désires avoir les coordonnées (x,y) des points vérifiant cette condition, tu fais simplement ceci :
x=X(sub2ind(size(X),rows,cols));
y=Y(sub2ind(size(Y),rows,cols));

Et si tu souhaites savoir de combien tu t'éloignes de la condition x²+y²=1 pour chaque point, tu peux avoir cette erreur en faisant ceci :
circerr=x.^2+y.^2-1;
La distance (valeur signée) des points de coordonnées (x,y) au cercle unité étant donnée par circdist=sqrt(x.^2+y.^2)-1;. Une distance négative signifiant que tu te situes à l'intérieur du disque unité et une valeur positive signifiant que tu te situes à l'extérieur du disque unité.
Mais si tu veux seulement cette erreur en valeur absolue et que tu ne te soucies pas de savoir où tes points se situent réellement par rapport au cercle unité :
circerr=abs(x.^2+y.^2-1);
Avec circdist=abs(sqrt(x.^2+y.^2)-1); pour la distance.

En supposant maintenant que tes coordonnées (x,y) sont stockées dans une seule matrice Z, cela veut donc dire qu'elle sont stockées dans Z sous forme complexe. Pour faire l'analogie avec ce que j'ai écrit précédemment, Z=X+1i*Y; en fait, où [X,Y]=meshgrid(linspace(-1,1,100));. Dans ce cas, c'est quasi identique, pour avoir les indices pour lesquels x²+y²=1, il suffit de faire cela :
[rows,cols]=find(abs(Z).^2==1);

Et pour avoir les coordonnées de ces points (sous forme complexe) :
z=Z(sub2ind(size(Z),rows,cols));

Si tu veux les abscisses et les ordonnées séparément :
x=real(z);
y=imag(z);

Avec une tolérance tol (ici choisie égale à 0.001), tu dois écrire quelque chose de ce genre :
tol=1e-3;
[rows,cols]=find(abs(abs(Z).^2-1)<=tol);

Pour avoir les coordonnées des points (sous forme complexe) :
z=Z(sub2ind(size(Z),rows,cols));
Pour les avoir séparément sous forme réelle :
x=real(z);
y=imag(z);

Pour les erreurs et distances signées tu as donc ceci :
circerr=abs(z).^2-1;
circdist=abs(z)-1;

Et pour les erreurs et distances en valeur absolue :
circerr=abs(abs(z).^2-1);
circdist=abs(abs(z)-1);

På gjensyn !
7
sofyann17 Messages postés 2 Date d'inscription samedi 12 septembre 2009 Statut Membre Dernière intervention 17 septembre 2009
17 sept. 2009 à 14:17
merci infiniment princesse sarah pour la reponse detailler.....je suis vraiment content....car j'ai essayer ce que t'a mis dans ta reponse (le script [rows,cols]=find(abs(X.^2+Y.^2-1)<=tol) sa a marché bien)
a vrai dire c'était un problème d'écoulement a travers un cylindre, et je doit trouver les solutions avec la méthode des élément fini (ta surement entendue parler) qui se base effectivement sur la discrétisation ,c'est a dire le maillage d'un domaine bien difini..................
quoi que le maillage se fait avec l'outil PDE TOOL de matlab qui fait un maillage triangulaire(je n sais pas si le meshgrid fait la meme chose ).............en tous les cas j'ai trouver des resultats appreciables avec les éléments triangulaires.

maintenant je vais travailler sur le même problème , mais avec les éléments rectangulaire que le matlab ne fait pas a ma connaissance........................donc surement je doit realiser un script matlab pour ce probleme

j'ai commencé deja.....je vais essayer demon mieu de le faire, et si ca marchera pas je posterai la source de probleme dans le forum

**********************************merci encore*************************************
0