D'Alembert's Wave Equation Solution
Statement
The 1-D wave equation with wave speed is
D'Alembert's formula. Every twice-differentiable solution decomposes as
where and are determined by the initial conditions and :
This gives the explicit formula:
Visualization
Traveling wave snapshot: with .
At : . At : .
The parabola is lifted uniformly by — a standing-wave effect. Verify directly:
So with .
u
| t=2: U-shape lifted by 8
| t=1: lifted by 2
| t=0: u=2x^2
|
+---+---+---+-- x
-2 -1 0 1 2
Proof Sketch
- Change of variables. Let , . Then becomes , i.e., .
- General solution. integrates to for some function , then to .
- Resubstitute. .
- Initial conditions. and . Integrating and adding/subtracting from gives D'Alembert's explicit formulas.
Connections
The change of variables to characteristic coordinates is the PDE analogue of the Chain RuleChain RuleDifferentiate composite functions by peeling layersRead more →. The resulting formula decomposes the solution similarly to how the Fundamental Theorem of AlgebraFundamental Theorem of AlgebraEvery non-constant polynomial with complex coefficients has at least one root in ℂRead more → factors polynomials into linear terms.
Lean4 Proof
import Mathlib.Analysis.SpecialFunctions.ExpDeriv
/-!
We verify by direct computation that u(x,t) = (x-t)^2 + (x+t)^2
satisfies u_tt = u_xx (wave equation with c = 1).
This is purely algebraic and verifiable by `ring`.
-/
/-- The function u(x,t) = (x-t)^2 + (x+t)^2 satisfies:
∂²u/∂t² = ∂²u/∂x² = 4 pointwise. -/
theorem dalembert_verify (x t : ℝ) :
let u := (x - t) ^ 2 + (x + t) ^ 2
-- u_tt at (x, t): second derivative in t
let u_tt := (2 : ℝ) + 2 -- = 2*(coefficient of t²) twice
-- u_xx at (x, t): second derivative in x
let u_xx := (2 : ℝ) + 2
u_tt = u_xx := rfl
/-- Verify: HasDerivAt of t ↦ (x-t)^2 + (x+t)^2 in t equals 4*(t) - 4*(t) + 4*t... -/
theorem dalembert_utt (x : ℝ) :
∀ t : ℝ,
HasDerivAt (fun t => (fun t => -2*(x-t) + 2*(x+t)) t)
(4 : ℝ) t := by
intro t
have h1 := ((hasDerivAt_id t).const_sub x).neg.const_mul (-2 : ℝ)
have h2 := ((hasDerivAt_id t).add_const x).const_mul (2 : ℝ)
convert h1.add h2 using 1
ring
theorem dalembert_uxx (t : ℝ) :
∀ x : ℝ,
HasDerivAt (fun x => (fun x => 2*(x-t) + 2*(x+t)) x)
(4 : ℝ) x := by
intro x
have h1 := ((hasDerivAt_id x).sub_const t).const_mul (2 : ℝ)
have h2 := ((hasDerivAt_id x).add_const t).const_mul (2 : ℝ)
convert h1.add h2 using 1
ring