Annus Mirabilis · Interactive critical edition in preparation
Magnet and conductor
Describe the same relative motion of a magnet and a wire in each body's rest frame.
Magnet and conductor
Magnet and conductor
Predict before the numbers
The magnet moves past the wire at 10 m/s instead of the wire moving past the magnet at 10 m/s. Is the electromotive force along the wire larger, the same, or zero?
The result appears when you choose, say you have one in mind, or skip.
Worked example: with the conductor moving at 10 m/s, described from the magnet's rest frame the charge feels a magnetic force of −1.6 × 10⁻¹⁸ N; described from the conductor's rest frame an electric field of −10 V/m gives it −1.6 × 10⁻¹⁸ N.
Accepted snapshot
| B (magnet rest) | 1 T |
|---|---|
| E (magnet rest) | 0 V/m |
| E′_y (conductor rest) | −10 V/m |
| Force on q (magnet rest) | −1.6022 × 10⁻¹⁸ N |
| Force on q (conductor rest) | −1.6022 × 10⁻¹⁸ N |
| Electromotive force, magnet rest | 1 V |
| Electromotive force, conductor rest | 1 V (slice: magnet rest K) |
| Excess γ − 1 | 5.5633 × 10⁻¹⁶ |
| Endpoint offset | 0 s |
| Circuit current | Current in a real circuit is not modeled; this model has no circuit. |
Move a magnet past a wire, or the wire past the magnet, and the same current flows, yet the physics of 1905 explained the two cases in different ways. The paper's transformation gives one explanation, because what counts as an electric or a magnetic force depends on who is moving.
The paper opens with this case. If the magnet moves and the conductor rests, an electric field with a definite energy arises around the magnet and drives a current. If the conductor moves and the magnet rests, no electric field arises; an electromotive force with no energy of its own drives a current of the same size and course. The observed current depends only on the relative motion, while the explanation depends on which body is called moving. Section 6 removes the asymmetry. Transformed to the conductor's rest frame, the magnet's field has an electric component, Y′ = β(Y − (v/V)N), where β is Einstein's letter for today's γ and V for c, and that electric force is what drives the charges. The lab takes a uniform field B = 1 T across a straight segment 0.1 m long, moving at v across the field. In the magnet's frame the work per unit charge is vBℓ, 1 V at 10 m/s. In the conductor's frame it is γvBℓ, larger by γ − 1 = 5.563 × 10−16. At 0.6c the two are 1.799 × 107 V and 2.248 × 107 V, a ratio of 1.25. A segment laid along the motion gets no work in either frame, because the force points across it; the lab reports 0 V, and it refuses to compare the frames until you say which frame's clock fixes the segment's ends.
Put the magnet at rest in K with a magnetic field B along z and no electric field, and let the conductor move at v along x. A charge q riding in the conductor moves through the field, so in K it feels the magnetic force q(v × B). With v along x and B along z that force points along −y, with size qvB. Along a straight segment of length ℓ laid along y, the work per unit charge is vBℓ; with v = 10 m/s, B = 1 T and ℓ = 0.1 m that is 10 × 1 × 0.1 = 1 V. Now describe the same event from the conductor's rest frame k. The charge is at rest there, so no magnetic force can act on it, and whatever pushes it must be an electric field. Section 6 supplies it: in SI units E′y = γ(Ey − vBz) = −γvB, because Ey = 0. The segment lies across the motion, so its length is the same in both frames, and the work per unit charge is γvBℓ. At 10 m/s, γ exceeds 1 by about β²/2, where β = v/c = 3.336 × 10−8, so the excess is 5.563 × 10−16. Computing γ first and then subtracting 1 gives 6.661 × 10−16, about 20 percent too large, because numbers near 1 are stored in steps of about 2.2 × 10−16; so the lab computes γ − 1 as γ²β²/(γ + 1). At 0.6c, γ = 1.25: 0.6 × 299 792 458 × 0.1 = 1.799 × 107 V in K, and 1.25 times that, 2.248 × 107 V, in k. The force on the charge obeys the same factor: for the charge e at 0.6c it is 3.602 × 10−11 N in k and 3.602/1.25 = 2.882 × 10−11 N in K. Turn the segment to lie along x. The force still points along y, across the segment, so it does no work, and the electromotive force is 0 in both frames. There is a second difficulty as well. The segment's two ends, taken at one time in one frame, are not at one time in the other; they differ by γvℓ/c² = 1.25 × 0.6 × 0.1/c = 2.502 × 10−10 s at 0.6c. So until you declare which frame's clock fixes the ends, the lab refuses the comparison instead of printing a number.
Modern qualifications
Einstein writes the electric force as (X, Y, Z) and the magnetic force as (L, M, N), in Gaussian units, with V for the speed of light and β for today's γ. Section 6 sets two accounts side by side: in the old manner of expression ('Alte Ausdrucksweise') a moving unit charge feels, besides the electric force, an electromotive force equal to its velocity crossed with the magnetic force divided by V, to first order in v/V; in the new manner ('Neue Ausdrucksweise') it feels the electric force of the field transformed to its own rest frame. The electromotive force keeps only the role of an auxiliary concept ('eines Hilfsbegriffes'), and questions about the seat of the electromotive forces in unipolar machines lose their point. The magnet-and-conductor case was a textbook example: Föppl's 1894 introduction to Maxwell's theory discussed it, and Holton (1960) pointed to that book as one Einstein read. Lorentz's theory predicts the same currents at the speeds of real apparatus, so the introduction objects to an asymmetry in the explanation, not to a failed prediction.
Show the code
The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
transformSI · src/physics/reference/fields.ts · this site’s source, as built · sha256:f859d250805d361be89f725a650333f29b64903df68aee2219306b812b02a8fa
This function computes the listed outputs when it runs.
In words
This is § 6's transformation in modern SI letters. The components along the boost, E sub x and B sub x, pass through untouched. The transverse components mix: the new E sub y is gamma times (E sub y minus v times B sub z), and the new B sub y is gamma times (B sub y plus v times E sub z over c squared). A frame with no electric field at all therefore measures one, which is the whole content of the magnet-and-conductor observation the paper opens with.
Implementation
export function transformSI(input: {
E: Vec3;
B: Vec3;
boost: number;
c?: number;
}): Readonly<{ E: Vec3; B: Vec3; gamma: number }> {
const c = input.c ?? C_SI;
const v = input.boost;
const g = gamma(v / c);
if (g.status !== "value") {
return Object.freeze({ E: input.E, B: input.B, gamma: Number.NaN });
}
const γ = g.value;
const { E, B } = input;
return Object.freeze({
gamma: γ,
E: Object.freeze({
x: E.x,
y: γ * (E.y - v * B.z),
z: γ * (E.z + v * B.y),
}),
B: Object.freeze({
x: B.x,
y: γ * (B.y + (v * E.z) / (c * c)),
z: γ * (B.z - (v * E.y) / (c * c)),
}),
});
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
dipoleField · src/physics/reference/fields.ts · this site’s source, as built · sha256:306aca8014938f19695a52950d0b765bc46b9f3238c09929e2efc97fbfe98e30
This function computes the listed outputs when it runs.
In words
The magnetic field of a point dipole at a point in space: three times the dipole's component along the line of sight, spread along that line, less the dipole itself, all falling off as the cube of the distance.
Implementation
export function dipoleField(moment: Vec3, position: Vec3, mu0 = MU0): Vec3 {
const r2 = position.x * position.x + position.y * position.y + position.z * position.z;
const r = Math.sqrt(r2);
if (!(r > 0) || !Number.isFinite(r)) {
return Object.freeze({ x: Number.NaN, y: Number.NaN, z: Number.NaN });
}
const r5 = r2 * r2 * r;
const mDotR = moment.x * position.x + moment.y * position.y + moment.z * position.z;
const pre = mu0 / (4 * Math.PI);
return Object.freeze({
x: pre * ((3 * mDotR * position.x) / r5 - moment.x / (r2 * r)),
y: pre * ((3 * mDotR * position.y) / r5 - moment.y / (r2 * r)),
z: pre * ((3 * mDotR * position.z) / r5 - moment.z / (r2 * r)),
});
}The site’s own reference code for this law, in TypeScript. It computes the numbers above when the page runs it, and it is what the page uses wherever a FrankenSim result is not available.
evaluateSr02 · src/physics/reference/fields.ts · this site’s source, as built · sha256:2f5e277be9a7291d9a8733d8b4b11a53f0ed68b407e7b855edade01d59969f4b
This function computes the listed outputs when it runs.
In words
The laboratory's evaluator. It takes the relative speed, the field, the path and the charge, transforms the field to the conductor's frame, computes the force in each frame, and returns the electromotive force each description gives. The two descriptions differ in what they say is happening, an electric force in one and a magnetic force in the other, and agree on what is measured, which is the observation the paper opens with.
Implementation
export function evaluateSr02(input: Sr02Input): Sr02Snapshot {
const row = (key: keyof typeof ROWS) => ROWS[key];
const pack = (
key: keyof typeof ROWS,
make: (id: string, unit: string, kind: string, owner: string) => ScientificResult,
) => {
const r = row(key);
return make(r[0], r[1], r[2], r[3]);
};
if (input.mode === "apparatus") {
const sym = (key: keyof typeof ROWS, symbol: string) =>
pack(key, (id, unit, kind, owner) => asSymbolic(id, unit, kind, owner, symbol));
return Object.freeze({
beta: 0,
magneticFieldMagnet: sym("Bm", "B"),
electricFieldMagnet: sym("Em", "E"),
magneticFieldConductor: sym("Bc", "B'"),
electricFieldConductor: sym("Ec", "E'"),
forceMagnet: sym("Fm", "F"),
forceConductor: sym("Fc", "F'"),
emfMagnet: sym("em", "EMF"),
emfConductor: sym("ec", "EMF'"),
emfExcess: sym("xs", "gamma-1"),
invariantDot: sym("id", "E·B"),
invariantDifference: sym("iv", "E²-c²B²"),
lorentzFactor: sym("g", "gamma"),
pathParallel: sym("pp", "n·v"),
endpointOffset: sym("off", "Delta t'"),
circuitCurrent: sym("I", "I"),
});
}
const c = C_SI;
const v = input.speed;
const refuseAll = (reason: string, condition: string): Sr02Snapshot => {
const out = (key: keyof typeof ROWS) =>
pack(key, (id, unit, kind, owner) => asOutside(id, unit, kind, owner, condition, reason));
return Object.freeze({
beta: v / c,
magneticFieldMagnet: out("Bm"),
electricFieldMagnet: out("Em"),
magneticFieldConductor: out("Bc"),
electricFieldConductor: out("Ec"),
forceMagnet: out("Fm"),
forceConductor: out("Fc"),
emfMagnet: out("em"),
emfConductor: out("ec"),
emfExcess: out("xs"),
invariantDot: out("id"),
invariantDifference: out("iv"),
lorentzFactor: out("g"),
pathParallel: out("pp"),
endpointOffset: out("off"),
circuitCurrent: out("I"),
});
};
if (![v, input.magneticField, input.segmentLength, input.testCharge].every(Number.isFinite)) {
return refuseAll("Speed, field, length and charge must be finite.", "finite inputs");
}
if (Math.abs(v) >= c) {
return refuseAll("No inertial observer at |v| >= c.", "|v| < c");
}
if (input.segmentLength <= 0) {
return refuseAll("The declared path must have positive length.", "ℓ > 0");
}
const beta = v / c;
const g = gamma(beta);
const gmo = gammaMinusOne(beta);
if (g.status !== "value" || gmo.status !== "value") {
return refuseAll("No inertial observer at |v| >= c.", "|v| < c");
}
const γ = g.value;
let Bz = input.magneticField;
if (input.fieldModel === "dipole") {
const r = input.testPointDistance;
const B = dipoleField({ x: 0, y: 0, z: input.dipoleMoment }, { x: r, y: 0, z: 0 });
Bz = -B.z;
}
const E0: Vec3 = Object.freeze({ x: 0, y: 0, z: 0 });
const B0: Vec3 = Object.freeze({ x: 0, y: 0, z: Bz });
const primed = transformSI({ E: E0, B: B0, boost: v, c });
const F = lorentzForce(input.testCharge, E0, B0, { x: v, y: 0, z: 0 });
const Fp = lorentzForce(input.testCharge, primed.E, primed.B, { x: 0, y: 0, z: 0 });
const inv0 = fieldInvariants(E0, B0, c);
const inv1 = fieldInvariants(primed.E, primed.B, c);
void inv1;
const nDotV = input.pathOrientation === "along-motion" ? 1 : 0;
const offset =
input.pathOrientation === "along-motion" ? (γ * v * input.segmentLength) / (c * c) : 0;
// The force per unit charge, v × B with v along x and B along z, points along −y, so only the
// path's component across the motion does work. A path along the motion has zero electromotive
// force in the magnet frame, and in the conductor frame too (E′ is along y), for any slice.
const emfMagnet = Math.abs(v * Bz * input.segmentLength) * (1 - nDotV);
const emfConductor = γ * emfMagnet;
const classification =
nDotV === 0 ? { sign: "zero" as const } : classifyWithTolerance(nDotV, { absolute: 1e-12 });
const val = (key: keyof typeof ROWS, value: number) =>
pack(key, (id, unit, kind, owner) => asValue(id, unit, kind, owner, value));
const na = (key: keyof typeof ROWS, reason: string) =>
pack(key, (id, unit, kind, owner) => asNotApplicable(id, unit, kind, owner, reason));
const und = (key: keyof typeof ROWS) =>
pack(key, (id, unit, kind, owner) => asUnderdetermined(id, unit, kind, owner));
const emfMagnetOut = val("em", emfMagnet);
let emfConductorOut = val("ec", emfConductor);
let excessOut = val("xs", gmo.value);
if (classification.sign === "indeterminate") {
emfConductorOut = und("ec");
excessOut = und("xs");
} else if (classification.sign !== "zero" && !input.sliceDeclared) {
emfConductorOut = na("ec", PATH_REFUSAL_REASON);
excessOut = na("xs", PATH_REFUSAL_REASON);
} else if (classification.sign !== "zero") {
excessOut = na("xs", ALONG_MOTION_ZERO_REASON);
}
return Object.freeze({
beta,
magneticFieldMagnet: val("Bm", Bz),
electricFieldMagnet: val("Em", 0),
magneticFieldConductor: val("Bc", primed.B.z),
electricFieldConductor: val("Ec", primed.E.y),
forceMagnet: val("Fm", F.y),
forceConductor: val("Fc", Fp.y),
emfMagnet: emfMagnetOut,
emfConductor: emfConductorOut,
emfExcess: excessOut,
invariantDot: val("id", inv0.eDotB),
invariantDifference: val("iv", inv0.e2MinusC2B2),
lorentzFactor: val("g", γ),
pathParallel: val("pp", nDotV),
endpointOffset: val("off", offset),
circuitCurrent: na("I", "Current in a real circuit is not modeled; this model has no circuit."),
});
}Choose which body is described as moving, type a speed, and inspect both accounts of the same current. No dragging is required. The ether-plus-local-time account is not declared refuted; at the speeds of real apparatus it agrees to first order in v/c.
Not modeled: conductor resistance and induced currents; self-inductance; magnetization dynamics and extended-magnet fields beyond the ideal dipole; time-varying flux of extended circuits; edge fields; radiation; unipolar machines; electromotive-force comparison across frames for a path with a component along the direction of motion, which needs a declared simultaneity slice this model does not supply.
The explanation
Full explanation
Moving the magnet or the wire gives the same current, but the physics of 1905 explained the two cases differently. Transformed to the wire's frame, the magnet's field has an electric part, and that is what drives the charges.
Show every step of the investigation
Compare the work per unit charge along a segment across the motion in both frames, vBℓ and γvBℓ, then turn the segment along the motion, where the force points across it and the work is zero. The apparatus mode tells the story without computing it.
An explanatory model, not an observation of nature. This embed starts from the laboratory’s worked defaults, not a saved run. Presentation options change the surrounding guide, never the numerical inputs.