Corno
Corno
Jimmy Corno∗
School of Physics
Georgia Institute of Technology,
Atlanta, GA 30332-0430, U.S.A
(Dated: December 11, 2003)
A numerical model of the magnetron desk toy is used to study periodic orbits and fixed points.
PACS numbers:
Keywords: periodic orbits, chaos, turbulence, magnetron
I. INTRODUCTION
My project is an investigation of an interesting but probably unimportant dynamical system. The system appears to
be chaotic, though it has a few easy-to-find fixed points and (possibly) stable orbits. It is, unfortunately for me, all
original work, as I have been unable to find similar work cited anywhere.
Although I found some interesting results, my confidence in those results is very low. There were some issues with
the system that will be discussed in secion IIID.
The magnetron consists of two rotors, each with three arms, lined up on a board. They rotate in the plane without
friction. At the end of each arm of each rotor is a bar magnet whose moment is lined up with the arm. As the rotors
spin, the bar magnets interact with each other to transfer momentum from one rotor to the other.
The really interesting interactions occur as two magnets pass at the closest point. Changes in the motion of the
system can occur very rapidly in this region due to the strong repulsive force of two magnets facing each other.
A. The Equations
For the purpose of simplicity, the bar magnets are modelled as point magnetic dipoles and friction is ignored. The
magnetic field at ~r due to a point magnetic dipole at r~0 is given by
~ r) = µ0 m 3n̂(n̂ · m̂) − m̂
B(~ (1)
4π |~r − r~0 |3
F~ = (m ~ B
~ · ∇) ~ (2)
and
" #
3µ0 m2 2y1 y2 dy + y2 (d~ · m̂1 ) + x1 x2 dy + y1 x2 dx 5(d~ · m
~ 1 )(y2 d2y + x2 dx dy )
F2y = − (5)
4π ~5
|d| ~7
|d|
where I have used x1 = cos(θ1 ). This force must be calulated nine times for each torque calculation (once for each
pair of interacting magnets). These forces create torques
τ1n = −x1n (F~1non 21 + F~1non 22 + F~1non 23 )y + y1n (F~1non 21 + F~1non 22 + F~1non 23 )x (6)
where x11 = cos(θ1 ), y12 = sin(θ1 + 23 π), etc. So, using τ = I θ̈, we get
θ˙1 = ω1 (7)
1
ω˙1 = (τ11 + τ12 + τ13 ). (8)
I
3
The equations are very long and ugly, but they are not terribly difficult to implement. It helps to calculate the force
in cartesion coordinates and switch to polar coordinates for the equations of motion (as should be evident from the
way the equations are written). The load is also lightened with the use of some simple trig substitutions for the
positions of the magnets (which I did), and small angle approximations could be used for the integration (which I
did not do).
A. Numerical implementation
I used a Runge-Kutta-Fehlberg 5th-order algorithm for my integration (Fehlberg because the system was written to
allow adaptive step sizes). Nothing fancy, just the four coupled ODE’s. Explicit use of energy conservation was not
practical, but an energy calculating method was included as an accuracy check. Although the system was written to
include an adaptive step method, use of the adaptive step proved to be unreasonably slow.
Three of the fixed points are easily found by symmetry. Another fixed point can be observed in the toy itself, as it is
the rest position of the rotors. The numerical value of its position can be found by including friction in the system (I
used an unrealistic drag force proportional to angular velocity). There is also one (apparently) stable periodic orbit
that can easily be observed in the toy. That one is discussed in sec:triumph.
C. Desymmetrization
My system has plenty of symmetry, but nothing I was able to utilize. The bar magnets are all identical, so the
rotors are symmetrical under rotations of 32 π. It should therefore be possible to reduce the system to a fundamental
domain where θ = − 32 π · · · 23 π, but I do not see any benefit in doing that.
D. Numerical troubles
Despite my best efforts at fixing it, the program has some serious problems. First, the unstable fixed points are not
fixed; the system drifts away from them every time. But most importantly, energy is not conserved. The problem is
particularly evident when the potential energy is comparable to the kinetic energy. In that case, the energy can vary
by more than 10%. The problem is definitely not in the energy calculator; that is the simplest part of the program.
The step size is also not a problem; the error doesn’t change when the step size is changed. That leaves only the
implementation of the forces or the integrator, and I know the integrator works. Yet I was unable to find any errors
in the equations, even after rederiving them several times. I am completely stumped. My only recourse may be to
reformulate the equations with Hamiltonian or Lagrangian mechanics, but it was not possible with my time
constraints.
The program apparently models the system well, with the exception of my energy problem and the lack of a realistic
friction force. The behavior of the model mimics the behavior of the toy for the most part. The stable fixed points
are there, though they may not be in the correct places. I also believe I have found a very stable periodic orbit
(besides those around the stable fixed points). It can be observed in the toy itself with a little manipulation. When
the first rotor is spinning with any decent angular velocity and the second rotor is near θ = 0, the second rotor will
oscillate slightly while the first rotor spins almost undisturbed. It is very stable motion for small oscillations; I have
never seen it deviate, even after thousands of revolutions. I even got a very pretty Poincare map.
My Poincare section here was θ1 = 0, which was also the starting condition. It is interesting to note that the map is
nice even for huge variations in θ2 . At that point it wasn’t even oscillating anymore. To look at the raw data, it
4
appeared that the motion was random. This would be a beautiful result if I had any confidence in the program.
Though energy was largely conserved, it was dominated by kinetic energy, so the whole thing could still be way off.
V. DISCUSSION
The ultimate goal of the project was to use a working numerical model of the toy to study the chaotic dynamics. I
came nowhere near this goal, of course, as I do not have a working model of the toy. It is all very depressing. My
only hope is that with some free time in the next few months I can work it out and find something interesting.
Acknowledgments
I would like to thank Greg Huber for some useful physical insights into the problem.
5
APPENDIX A: MAGNETRON.JAVA
/*Jimmy Corno
*December 10, 2003
*Stat Mech 2
*
*Runge-Kutta-Fehlberg 4th-5th order integrator for the magnetic spinner toy
*("magnetron"). The motion is all in terms of the angles of the first magnet
*on each rotor (theta1 and theta2).
*/
import java.io.*;
class Magnetron {
static double x11, x12, x13, x21, x22, x23; //Cartesian positions of
static double y11, y12, y13, y21, y22, y23; //magnets
/*These doubles will be used to avoid the use of all but 4 sines and
*cosines with every step, since the magnets have a fixed angular
*separation.*/
static double sin120 = Math.sin(Math.PI*2.0/3.0);
static double cos120 = Math.cos(Math.PI*2.0/3.0);
static double sin240 = -sin120;
static double cos240 = cos120;
static double time, stopTime;
h = 0.001;
time = 0.0;
stopTime = 1.0;
stopN = 60000;
do {
// if ( !retry && (n%1000 == 0) ) {
// p.println( time + "," + omega2 + ","
// + theta2 );
// }
7
advance();
theta1tmp = theta1;
theta2tmp = theta2;
omega1tmp = omega1;
omega2tmp = omega2;
f0 = omega1tmp;
g0 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j0 = omegaPrime[0];
k0 = omegaPrime[1];
f1 = omega1tmp;
g1 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j1 = omegaPrime[0];
k1 = omegaPrime[1];
f2 = omega1tmp;
g2 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j2 = omegaPrime[0];
k2 = omegaPrime[1];
8
f3 = omega1tmp;
g3 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j3 = omegaPrime[0];
k3 = omegaPrime[1];
f4 = omega1tmp;
g4 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j4 = omegaPrime[0];
k4 = omegaPrime[1];
f5 = omega1tmp;
g5 = omega2tmp;
omegaPrime = alpha( theta1tmp, theta2tmp, omega1tmp, omega2tmp );
j5 = omegaPrime[0];
k5 = omegaPrime[1];
time = time + h;
n++;
public static double[] F_AonB (double xA, double yA, double xB, double yB) {
return F;
return Alpha;
return B;
public static double energy ( double t1, double t2, double o1, double o2 ) {
x11 = Math.cos( t1 );
y11 = Math.sin( t1 );
x21 = Math.cos( t2 );
y21 = Math.sin( t2 );