fsolve to find circle intersections
Mostra commenti meno recenti
I'm trying to find the intersection points of two circles using fsolve. Currently I'm using this code but the fsolve command doesn't reach a conclusion, probably because I'm not choosing a good initial guess.
function F = myfun1( X)
x= X(1)
y = X(2)
F=[(x-1).^2 +(y-2).^2 - 1.5^2 ;
(x-3).^2 +(y-2.5).^2 - 1^2 ;
];
end
And I'm calling it by using:
xo = [0,0];
X= fsolve (@myfun1,xo,options)
fsolve stops iterating because "last step was ineffective"
thanks in advance for any help provided
Risposta accettata
Più risposte (2)
Roger Stafford
il 8 Apr 2015
In case you are interested, there is a much more direct way of finding the two intersection points of two circles than using 'fsolve'.
Let P1 = [x1;y1] and P2 = [x2;y2] be column vectors for the coordinates of the two centers of the circles and let r1 and r2 be their respective radii.
d2 = sum((P2-P1).^2);
P0 = (P1+P2)/2+(r1^2-r2^2)/d2/2*(P2-P1);
t = ((r1+r2)^2-d2)*(d2-(r2-r1)^2);
if t <= 0
fprintf('The circles don''t intersect.\n')
else
T = sqrt(t)/d2/2*[0 -1;1 0]*(P2-P1);
Pa = P0 + T; % Pa and Pb are circles' intersection points
Pb = P0 - T;
end
3 Commenti
ricard molins
il 12 Apr 2015
Anders Simonsen
il 3 Apr 2017
Thanks Roger, it works like a charm, especially for those who don't have the "fsolve" function.
Gergely Hunyady
il 19 Ott 2019
Thanks. Working fine, much faster than fsolve
Richard Zapor
il 13 Ago 2023
0 voti
By first applying coordinate transformations a reduced algebra solution is possible. Given Circle (x1,y1,R) and Circle (x2,y2,P) find the two intersection points of the circles. Define d=distance(C1,C2). There are multiple conditions for Zero and One intersection points. Here we assume two points thus d<P+R, d+P>R, and d-P>-R.
- Translate to place (x1,y1) at the origin.
- Rotate to place (x2,y2) at (0,d) where d=distance(C1,C2).
- Y=(R^2−P^2+d^2)/(2*d)
- X=sqrt(R^2−Y^2)
- xy=[+X Y ;−X Y] Two solution points in transformed space
- theta=atan2(x2−x1,y2−y1) A Matlab quadrant atan where -pi<atan2()<=pi
- xy=xy*rot(theta)+[x1 y1] where rot(t)=[cos(t) -sin(t); sin(t) cos(t)]
In the transformed space many simplifications occur. R^2=X^2+Y^2, P^2=X^2+(d-Y)^2 so after subtracting gives R^2-P^2=Y^2-(d-Y)^2= Y^2-d^2+2dY-Y^2 = 2dY-d^2 thus Y=(R^2-P^2+d^2)/(2*d) and X follows as X=sqrt(R^2-Y^2). Now de-rotate and de-translate to acheive the points in the original coordinate system.

Categorie
Scopri di più su Mathematics in Centro assistenza e File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!