Special relativity · The opening asymmetry

The same relative motion, two accounts of one current.

Why does moving the magnet instead of the conductor create an explanatory asymmetry, and how does the transformation remove it? Both descriptions are internally coherent. They agree on what is measured to first order in v/c.

Magnet and conductor

Magnet and conductor

Static worked example

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?

Three relations the model could have

The result appears when you choose, say you have one in mind, or skip.

Set the description
Mode
Description frame
Experiment settings the magnetic field strength and segment length

Changes here apply with Apply settings.

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

Both descriptions of the same event. The electromotive-force ratio names the simultaneity slice that fixed the path.
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 rest1 V
Electromotive force, conductor rest1 V (slice: magnet rest K)
Excess γ − 15.5633 × 10⁻¹⁶
Endpoint offset0 s
Circuit currentCurrent 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.

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.

Open the two descriptions

A path across the motion is comparable

An electromotive force is work per unit charge along a stated path, not a field component. The default segment lies along ŷ, across a boost along x̂, so the endpoint events have Δx = 0. They are simultaneous in both frames, the length is unchanged, and the ratio of the two electromotive forces is exactly γ.

E=vBℓ,E′=γvBℓ,E⊥′=γ(v×B)⊥\begin{gathered}\mathcal{E}=vB\ell, \\ \mathcal{E}'=\gamma vB\ell, \\ \mathbf{E}'_\perp=\gamma(\mathbf{v}\times\mathbf{B})_\perp\end{gathered}
Explain this equation

At 10 m/s with B = 1 T and ℓ = 0.1 m the magnet-frame value is 1 V. The excess γ − 1 is 5.563×10⁻¹⁶ from the cancellation-free form; a float64 evaluation of γ − 1 is not that number. At 0.6c the ratio is 1.25. Those two electromotive forces are not the same number, and they are not supposed to be: the correct comparison is the transformation law. Lorentz's ether plus local time produces the same first-order formulae and is not declared refuted here.

Before you draw a conclusion

A common wrong turn this instrument speaks to

  • The Michelson–Morley experiment is why Einstein wrote the paper.

    The paper opens with a moving magnet and conductor, and beside them mentions unnamed, unsuccessful attempts to detect the earth's motion through the light medium. It names no experiment and no experimenter for them, and it says nothing of how Einstein came to the problem.

    Read the full entry, with its sources

Embed this laboratory on another page. It starts from its worked defaults, not your current settings.