# fsolve to find circle intersections

38 views (last 30 days)

Show older comments

ricard molins
on 8 Apr 2015

Answered: Richard Zapor
on 13 Aug 2023

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

##### 0 Comments

### Accepted Answer

Mohammad Abouali
on 12 Apr 2015

Edited: Mohammad Abouali
on 14 Apr 2015

% Center of the circles

C1=[0,0];

C2=[5,0];

% Radius of the circles

R1=3;

R2=5;

% x1(x,y) on the first circle satisfy the following equation:

%(x1(1)-C1(1))^2+(x1(2)-C1(2))^2-R1^2=0

% x2(x,y) on the second circle satisfy the following equation:

%(x2(1)-C2(1))^2+(x2(2)-C2(2))^2-R2^2=0;

% once intersecting we have:

% x1(1)=x2(1);

% x1(2)=x2(2);

% then

F=@(x) ([(x(1)-C1(1))^2+(x(2)-C1(2))^2-R1^2; ...

(x(1)-C2(1))^2+(x(2)-C2(2))^2-R2^2]);

opt=optimoptions(@fsolve);

opt.Algorithm='levenberg-marquardt';

opt.Display='off';

x=fsolve(F,[C1(1),C1(1)+R1],opt);

fprintf('First intersection point: (%f,%f)\n',x(1),x(2));

x=fsolve(F,[C1(1),C1(1)-R1],opt);

fprintf('Second intersection point: (%f,%f)\n',x(1),x(2));

when you run it you get:

First intersection point: (0.900000,2.861818)

Second intersection point: (0.900000,-2.861818)

The main difference here is that the initial guess or starting points is located on one of the circles (so it satisfies one of the equations and not the other. (0,0) that you start doesn't satisfies any of the equations. The convergence rate would be much worse there. setting starting guess as (x,y)=(C(1), C(2)+R) helps it, and that is always the point right on top of one of the circles. Not necessarily the intersection. And Setting the initial guess like this is by no mean any restriction, and in fact choosing proper initial guess is always encouraged.

Alternatively you could have posed this as a constrained optimization problem. Then you had more flexibility for the initial guess.

##### 4 Comments

Salman Khan
on 22 May 2017

Seif eddine Seghiri
on 20 Apr 2020

### More Answers (2)

Roger Stafford
on 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 Comments

Anders Simonsen
on 3 Apr 2017

Thanks Roger, it works like a charm, especially for those who don't have the "fsolve" function.

Richard Zapor
on 13 Aug 2023

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.

##### 0 Comments

### See Also

### Categories

### Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!