fsolve to find circle intersections
Ältere Kommentare anzeigen
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
Akzeptierte Antwort
Weitere Antworten (2)
Roger Stafford
am 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 Kommentare
ricard molins
am 12 Apr. 2015
Anders Simonsen
am 3 Apr. 2017
Thanks Roger, it works like a charm, especially for those who don't have the "fsolve" function.
Gergely Hunyady
am 19 Okt. 2019
Thanks. Working fine, much faster than fsolve
Richard Zapor
am 13 Aug. 2023
0 Stimmen
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.

Kategorien
Mehr zu Mathematics finden Sie in Hilfe-Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!