2016-09-16 3 views
3

J'ai deux équations:Comment trouver l'intersection de deux ellipses dans Matlab

ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1'; 

et

ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1'; 

et je les ai comploté:

ezplot(ellipseOne, [-10, 10, -10, 10]) 
hold on 
ezplot(ellipseTwo, [-10, 10, -10, 10]) 
title('Ellipses') 
hold off 

Maintenant, je suis en train pour trouver l'intersection des deux ellipses. J'ai essayé:

intersection = solve(ellipseOne, ellipseTwo) 
intersection.x 
intersection.y 

pour trouver les points où ils se croisent, mais Matlab me donne une matrice et une équation comme une réponse que je ne comprends pas. Quelqu'un pourrait-il me diriger dans la bonne direction pour obtenir les coordonnées de l'intersection?

+0

La façon dont vous utilisez ici à résoudre est incorrect; l'appel est supposé être S = solve (eqn, var). La façon la plus simple de gérer cela, puisque les deux équations sont égales à 1, est de mettre les deux équations les unes par rapport aux autres et de les soustraire. Donc ellipseDiff = '((x-1)^2)/6^2 + y^2/3^2 - ((x + 2)^2)/2^2 - ((y-5)^2)/4^2 = 0 '. –

+1

@IanRiley L'utilisation générale de 'solve' est en fait' S = résoudre (eqn1, eqn2, ... eqnM, var1, var2, ... varN); Cette utilisation est réellement correcte. Omettre les variables 'var *' détermine automatiquement les variables. Cependant, la documentation actuelle de 'solve' est comme vous l'avez dit ... ce qui est plutôt bizarre. Faire 'help solve' dans MATLAB R2015b me donne la première façon d'invoquer. Je suppose que la première voie sera finalement obsolète, mais son utilisation est toujours correcte ici. – rayryeng

+0

Huh; bizarre de trouver une telle lacune dans la documentation. Merci pour l'astuce @rayryeng –

Répondre

5

La solution est sous forme symbolique. La dernière étape que vous devez prendre est de le transformer en numérique. Il suffit de convertir le résultat en utilisant double. Cependant, comme il s'agit d'une paire d'équations quadratiques, il existe 4 solutions possibles en raison de l'ambiguïté du signe (c'est-à-dire +/-) et peut éventuellement donner des racines imaginaires. Par conséquent, isoler les vraies solutions et ce qui reste devrait être votre réponse.

Par conséquent:

% Your code 
ellipseOne = '((x-1)^2)/6^2 + y^2/3^2 = 1'; 
ellipseTwo = '((x+2)^2)/2^2 + ((y-5)^2)/4^2 = 1'; 
intersection = solve(ellipseOne, ellipseTwo); 

% Find the points of intersection 
X = double(intersection.x); 
Y = double(intersection.y); 
mask = ~any(imag(X), 2) | ~any(imag(Y), 2); 
X = X(mask); Y = Y(mask); 

Les trois premières lignes de code sont ce que vous avez fait. Les quatre lignes suivantes extraient les racines sous forme numérique, puis je crée un masque logical qui isole uniquement les points qui sont réels. Cela regarde la partie imaginaire de la coordonnée X et Y de toutes les racines et s'il y a un tel composant pour l'une des racines, nous voulons les éliminer. Nous enlevons enfin les racines imaginaires et nous devrions nous retrouver avec deux vraies racines.

Nous obtenons ainsi pour nos points d'intersection:

>> disp([X Y]) 
    -3.3574 2.0623 
    -0.2886 2.9300 

La première colonne est la X coordonnée et la deuxième colonne est la Y coordonnée. Cela semble également être en accord avec l'intrigue. Je vais prendre votre ellipse de traçage code et insérer également les points d'intersection sous forme de points bleus en utilisant la solution ci-dessus:

ezplot(ellipseOne, [-10, 10, -10, 10]) 
hold on 
ezplot(ellipseTwo, [-10, 10, -10, 10]) 
% New - place intersection points 
plot(X, Y, 'b.'); 
title('Ellipses'); 
hold off; 

enter image description here

+1

C'est exactement ce dont j'avais besoin. Merci beaucoup – kneedhelp