4.3 Linear differential equations as almost-banded systems
To solve \(\sum _k a_k(x)u^{(k)}=f\) with boundary conditions, the ultraspherical spectral method [OT13], as implemented in ApproxFun [AF], represents \(u\) in \(T\) and the residual in \(C^{(N)}\). Each term \(a_kD^k\) becomes multiplication composed with differentiation and conversion, so the residual matrix is banded with bandwidths fixed by \(\deg a_k\) and \(N\). Boundary conditions add a few dense rows. This chapter proves the exact algebra of that assembly and the truncation errors for analytic data. Solver convergence is separate: Chapter 4.4 treats first-order problems with polynomial coefficients, assuming invertibility of the infinite preconditioned operator.
For polynomial coefficients \(a_k\) over a commutative ring, assemble the endomorphism \(L=\sum _{k=0}^N M[a_k]D^k\) on the polynomial module, where \(D\) is polynomial differentiation.
The assembled operator satisfies \(Lp=\sum _{k=0}^Na_kD^kp\) for every polynomial \(p\). Its coefficient map between any source and target polynomial bases reconstructs that exact residual. If each summand has bandwidths bounded by \((\ell ,u)\) in those common bases, then their sum has bandwidths \((\ell ,u)\). This is an algebraic assembly theorem with explicit term-bandwidth hypotheses, not a general all-order ultraspherical bandwidth or ODE solvability theorem.
theorem Polynomial.differentialOperator_apply.{u_1} {R : Type u_1} [CommRing R] (a : ℕ → Polynomial R) (N : ℕ)
(p : Polynomial R) :
(Polynomial.differentialOperator a N) p = ∑ k ∈ Finset.range (N + 1), a k * (⇑Polynomial.derivative)^[k] p
Lean proof
/-- Polynomial operator assembly has exactly the expected differential action. -/
theorem differentialOperator_apply (a : ℕ → R[X]) (N : ℕ) (p : R[X]) :
differentialOperator a N p = ∑ k ∈ Finset.range (N + 1), a k * derivative^[k] p := by
simp [differentialOperator, LinearMap.mulLeft_apply, Module.End.pow_apply]
theorem Polynomial.differentialOperator_one_apply.{u_1} {R : Type u_1} [CommRing R] (a : ℕ → Polynomial R) (p : Polynomial R) :
(Polynomial.differentialOperator a 1) p = a 0 * p + a 1 * Polynomial.derivative p
Lean proof
/-- The first-order case is multiplication plus multiplication after one derivative. -/
theorem differentialOperator_one_apply (a : ℕ → R[X]) (p : R[X]) :
differentialOperator a 1 p = a 0 * p + a 1 * derivative p := by
simp [differentialOperator_apply, Finset.sum_range_succ]
theorem Polynomial.differentialOperator_isBanded.{u_1} {R : Type u_1} [CommRing R] (b c : Module.Basis ℕ R (Polynomial R))
(a : ℕ → Polynomial R) (N l u : ℕ)
(h : ∀ k ≤ N, (c.toMatrix fun j => a k * (⇑Polynomial.derivative)^[k] (b j)).IsBanded l u) :
(c.toMatrix fun j => (Polynomial.differentialOperator a N) (b j)).IsBanded l u
Lean proof
/-- Uniform bandwidth bounds on the assembled terms bound their sum. In the
ultraspherical method these term bounds come from derivative, conversion, and
multiplication bandwidths, not from an arbitrary square truncation. -/
theorem differentialOperator_isBanded (b c : Module.Basis ℕ R R[X])
(a : ℕ → R[X]) (N l u : ℕ)
(h : ∀ k ≤ N, (c.toMatrix (fun j ↦ a k * derivative^[k] (b j))).IsBanded l u) :
(c.toMatrix (fun j ↦ differentialOperator a N (b j))).IsBanded l u := by
intro i j hij
simp only [Module.Basis.toMatrix_apply, differentialOperator_apply, map_sum, Finsupp.finsetSum_apply]
apply Finset.sum_eq_zero
intro k hk
exact h k (Nat.lt_succ_iff.mp (Finset.mem_range.mp hk)) i j hij
Let \(N\ge 1\) and \(L=\sum _{k=0}^N a_kD^k\), with real polynomial coefficients and \(d_k=\operatorname {natDegree}a_k\). In Chebyshev input and \(B_N\) output, each term has bandwidths \((d_k,d_k+2N-k)\). Hence \(L\) has bandwidths \((\ell ,u)\) whenever \(d_k\le \ell \) and \(d_k+2N-k\le u\) for every \(k\le N\). A common degree bound \(d\) gives \((d,d+2N)\). For input supported on the first \(m\) coefficients, all residual coefficients at indices \(i\ge m+d\) vanish. These are exact polynomial statements.
theorem Polynomial.ultrasphericalBasis_differential_term_isBanded {k N : ℕ} (hN : 1 ≤ N) (hk : k ≤ N) (p : Polynomial ℝ) :
((Polynomial.ultrasphericalBasis N).toMatrix fun j =>
p * (⇑Polynomial.derivative)^[k] (Polynomial.chebyshevBasis j)).IsBanded
p.natDegree (p.natDegree + 2 * N - k)
Lean proof
/-- A term `p D^k` represented at level N has the derivative/conversion bandwidth
plus the polynomial multiplication bandwidth. -/
theorem ultrasphericalBasis_differential_term_isBanded {k N : ℕ} (hN : 1 ≤ N) (hk : k ≤ N)
(p : ℝ[X]) :
((ultrasphericalBasis N).toMatrix
(fun j ↦ p * derivative^[k] (chebyshevBasis j))).IsBanded
p.natDegree (p.natDegree + 2 * N - k) := by
have h := chebyshevBasis.toMatrix_comp_isBanded (ultrasphericalBasis N)
(ultrasphericalBasis N) (derivative ^ k) (LinearMap.mulLeft ℝ p)
(by simpa only [Module.End.pow_apply] using ultrasphericalBasis_derivative_to_level_isBanded hk)
(ultrasphericalBasis_mul_isBanded hN p)
have he : (2 * N - k) + p.natDegree = p.natDegree + 2 * N - k := by omega
simpa only [LinearMap.mulLeft_apply, Module.End.pow_apply, Nat.zero_add, he] using h
theorem Polynomial.ultraspherical_differentialOperator_isBanded (a : ℕ → Polynomial ℝ) {N l u : ℕ} (hN : 1 ≤ N)
(hl : ∀ k ≤ N, (a k).natDegree ≤ l) (hu : ∀ k ≤ N, (a k).natDegree + 2 * N - k ≤ u) :
((Polynomial.ultrasphericalBasis N).toMatrix fun j =>
(Polynomial.differentialOperator a N) (Polynomial.chebyshevBasis j)).IsBanded
l u
Lean proof
/-- Full all-order assembly, with separate bounds for each coefficient degree.
The analytic existence or uniqueness of an ODE solution is not assumed or asserted. -/
theorem ultraspherical_differentialOperator_isBanded
(a : ℕ → ℝ[X]) {N l u : ℕ} (hN : 1 ≤ N)
(hl : ∀ k ≤ N, (a k).natDegree ≤ l)
(hu : ∀ k ≤ N, (a k).natDegree + 2 * N - k ≤ u) :
((ultrasphericalBasis N).toMatrix
(fun j ↦ differentialOperator a N (chebyshevBasis j))).IsBanded l u := by
apply differentialOperator_isBanded
intro k hk
exact (ultrasphericalBasis_differential_term_isBanded hN hk (a k)).mono (hl k hk) (hu k hk)
theorem Polynomial.ultraspherical_differentialOperator_isBanded_of_degree_le (a : ℕ → Polynomial ℝ) {N d : ℕ} (hN : 1 ≤ N)
(hd : ∀ k ≤ N, (a k).natDegree ≤ d) :
((Polynomial.ultrasphericalBasis N).toMatrix fun j =>
(Polynomial.differentialOperator a N) (Polynomial.chebyshevBasis j)).IsBanded
d (d + 2 * N)
Lean proof
/-- A common coefficient-degree bound d gives residual bandwidths (d,d+2N). -/
theorem ultraspherical_differentialOperator_isBanded_of_degree_le
(a : ℕ → ℝ[X]) {N d : ℕ} (hN : 1 ≤ N)
(hd : ∀ k ≤ N, (a k).natDegree ≤ d) :
((ultrasphericalBasis N).toMatrix
(fun j ↦ differentialOperator a N (chebyshevBasis j))).IsBanded d (d + 2 * N) := by
apply ultraspherical_differentialOperator_isBanded a hN hd
intro k hk
have := hd k hk
omega
theorem Polynomial.ultraspherical_differentialOperator_coeff_eq_zero (a : ℕ → Polynomial ℝ) {N d m : ℕ} (hN : 1 ≤ N)
(hd : ∀ k ≤ N, (a k).natDegree ≤ d) (v : ℕ →₀ ℝ) (hv : ∀ j ∈ v.support, j < m) {i : ℕ} (hi : m + d ≤ i) :
((Polynomial.chebyshevBasis.coefficientMap (Polynomial.ultrasphericalBasis N) (Polynomial.differentialOperator a N))
v)
i =
0
Lean proof
/-- With m input coefficients and coefficient degrees at most d, m+d residual
rows capture the whole polynomial result. This justifies rectangular padding. -/
theorem ultraspherical_differentialOperator_coeff_eq_zero
(a : ℕ → ℝ[X]) {N d m : ℕ} (hN : 1 ≤ N)
(hd : ∀ k ≤ N, (a k).natDegree ≤ d) (v : ℕ →₀ ℝ)
(hv : ∀ j ∈ v.support, j < m) {i : ℕ} (hi : m + d ≤ i) :
chebyshevBasis.coefficientMap (ultrasphericalBasis N) (differentialOperator a N) v i = 0 :=
chebyshevBasis.coefficientMap_eq_zero_of_bandwidth (ultrasphericalBasis N)
(differentialOperator a N) (ultraspherical_differentialOperator_isBanded_of_degree_le a hN hd)
v hv hi
theorem Polynomial.chebyshevBasis_eval_one (v : ℕ →₀ ℝ) :
Polynomial.eval 1 (Polynomial.chebyshevBasis.repr.symm v) = ∑ j ∈ v.support, v j
Lean proof
/-- Evaluation at the right endpoint is the row of ones. -/
theorem chebyshevBasis_eval_one (v : ℕ →₀ ℝ) :
(chebyshevBasis.repr.symm v).eval 1 = ∑ j ∈ v.support, v j := by
simpa [chebyshevBasis_apply, Chebyshev.T_eval_one] using
chebyshevBasis_functional_apply (leval (1 : ℝ)) v
/-- Evaluation at the left endpoint is the alternating row. -/
theorem chebyshevBasis_eval_neg_one (v : ℕ →₀ ℝ) :
(chebyshevBasis.repr.symm v).eval (-1) =
∑ j ∈ v.support, v j * (-1 : ℝ) ^ j := by
simpa [chebyshevBasis_apply, Chebyshev.T_eval_neg_one] using
chebyshevBasis_functional_apply (leval (-1 : ℝ)) v
For source and target bases \(b,c\), a linear residual map \(L\) and a linear map \(B\) of \(q\) boundary constraints, the bordered coefficient map sends finite coefficients \(v\) to \((Bp,\operatorname {repr}_c(Lp))\), where \(p=\operatorname {repr}_b^{-1}v\).
The bordered equation with right-hand side \((\beta ,\operatorname {repr}_c f)\) is equivalent to \(Bp=\beta \) and \(Lp=f\) for the reconstructed finite expansion. This holds for module bases over a commutative semiring. In particular it applies to polynomial differential operators and their boundary functionals. It asserts neither invertibility nor convergence of a truncated ODE solver.
theorem Module.Basis.borderedCoefficientMap_apply.{u_1, u_2, u_3, u_4, u_5} {R : Type u_1} {M : Type u_2} {N : Type u_3}
{ι : Type u_4} {κ : Type u_5} [CommSemiring R] [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N]
(b : Module.Basis ι R M) (c : Module.Basis κ R N) {q : ℕ} (B : M →ₗ[R] Fin q → R) (L : M →ₗ[R] N) (v : ι →₀ R) :
(b.borderedCoefficientMap c B L) v = (B (b.repr.symm v), c.repr (L (b.repr.symm v)))
Lean proof
/-- Bordering computes precisely the boundary data and residual of the
reconstructed finite expansion. -/
theorem borderedCoefficientMap_apply (b : Basis ι R M) (c : Basis κ R N)
{q : ℕ} (B : M →ₗ[R] (Fin q → R)) (L : M →ₗ[R] N) (v : ι →₀ R) :
b.borderedCoefficientMap c B L v =
(B (b.repr.symm v), c.repr (L (b.repr.symm v))) := rfl
theorem Module.Basis.borderedCoefficientMap_eq_iff.{u_1, u_2, u_3, u_4, u_5} {R : Type u_1} {M : Type u_2} {N : Type u_3}
{ι : Type u_4} {κ : Type u_5} [CommSemiring R] [AddCommMonoid M] [Module R M] [AddCommMonoid N] [Module R N]
(b : Module.Basis ι R M) (c : Module.Basis κ R N) {q : ℕ} (B : M →ₗ[R] Fin q → R) (L : M →ₗ[R] N) (v : ι →₀ R)
(β : Fin q → R) (f : N) :
(b.borderedCoefficientMap c B L) v = (β, c.repr f) ↔ B (b.repr.symm v) = β ∧ L (b.repr.symm v) = f
Lean proof
/-- A bordered coefficient equation is equivalent to the original boundary
and residual equations; it makes no invertibility assumption. -/
theorem borderedCoefficientMap_eq_iff (b : Basis ι R M) (c : Basis κ R N)
{q : ℕ} (B : M →ₗ[R] (Fin q → R)) (L : M →ₗ[R] N)
(v : ι →₀ R) (β : Fin q → R) (f : N) :
b.borderedCoefficientMap c B L v = (β, c.repr f) ↔
B (b.repr.symm v) = β ∧ L (b.repr.symm v) = f := by
rw [borderedCoefficientMap_apply, Prod.mk.injEq, c.repr.injective.eq_iff]
Solve \(u'+xu=0\), \(u(-1)=1\), whose solution is \(e^{(1-x^2)/2}\). Each matrix below is one stated in Chapter 4.2: differentiation \(T\to U\), conversion \(T\to U\), and multiplication by \(x\) in the \(U\) basis. The residual block is banded, and the boundary row is \(u(-1)=\sum _j(-1)^jv_j\).
N = 30
D = zeros(N+1, N); for n in 1:N-1; D[n, n+1] = n; end # T_n' = n U_{n-1}
S = zeros(N+1, N); S[1,1] = 1; S[2,2] = 1/2 # T -> U
for n in 0:N-3; S[n+3, n+3] += 1/2; S[n+1, n+3] -= 1/2; end
M = zeros(N+1, N+1) # x U_n = (U_{n+1}+U_{n-1})/2
for i in 1:N; M[i+1, i] = 1/2; M[i, i+1] = 1/2; end
L = D + M*S
v = [[(-1)^j for j in 0:N-1]'; L[1:N-1, :]] \ [1.0; zeros(N-1)]
u(x) = sum(v[j+1]*cos(j*acos(x)) for j in 0:N-1)
err(x) = abs(u(x) - exp((1 - x^2)/2))
maximum(err, range(-1, 1, length=201)) # about 1e-15
The residual block L[1:N-1,:] has 84 nonzeros out of 870. Exactness of the assembled operator on polynomials is established by the preceding results. The numerical error illustrates the solve; it is not a floating-point error bound.
For analytic solutions the same matrices act on the full coefficient sequence. Higher derivatives of Chebyshev series land in \(C^{(k)}\) with geometric errors, and truncating a represented solution leaves geometrically small residual and boundary defects.
Reference details: Classical derivatives of normally convergent polynomial series and related results
Theorem
4.3.7Classical derivatives of normally convergent polynomial series
On an open \(U\subseteq \mathbb C\), suppose \(\sum _nu_n{\lt}\infty \) and \(|a_nP_n(z)|\le u_n\) for every \(n\) and \(z\in U\). Every function \(f:U\to \mathbb C\) represented by this series is analytic. For every \(m\ge 0\), the sum belongs to \(\mathcal D^m(U)\): it admits an order-\(m\) derivative chain on \(U\), with initial function \(z\mapsto \sum _n a_nP_n(z)\).
Lean Formalisation
theorem Polynomial.analyticOnOpen_of_hasSum_polynomial {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
{f : ↥U → ℂ} (hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (P n)) (f z)) : AnalyticOnOpen U f
Lean proof
/-- A normally convergent polynomial expansion is analytic on its typed domain. -/
theorem analyticOnOpen_of_hasSum_polynomial {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
{f : U → ℂ} (hf : ∀ z : U, HasSum (fun n ↦ a n * (P n).eval z.val) (f z)) :
AnalyticOnOpen U f :=
(analyticOnOpen_iff U f (fun z ↦ ∑' n, a n * (P n).eval z)
(fun z ↦ (hf z).tsum_eq)).2 (analyticOnNhd_polynomial_tsum hu hb)
theorem Polynomial.exists_iteratedDerivInput_of_polynomialSeries {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
(m : ℕ) : ∃ f, ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (P n)) (↑f z)
Lean proof
/-- Normal convergence supplies a derivative input of every finite order. -/
theorem exists_iteratedDerivInput_of_polynomialSeries {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n) (m : ℕ) :
∃ f : IteratedDerivInput U m,
∀ z : U, HasSum (fun n ↦ a n * (P n).eval z.val) (f.val z) := by
have hs (z : U) : HasSum (fun n ↦ a n * (P n).eval z.val)
(∑' n, a n * (P n).eval z.val) :=
((Summable.of_nonneg_of_le (fun n ↦ norm_nonneg (a n * (P n).eval z.val))
(fun n ↦ hb n z.val z.property) hu).of_norm).hasSum
exact ⟨.ofAnalytic _ (analyticOnOpen_of_hasSum_polynomial hu hb hs) m, hs⟩
Let \(U\subseteq \mathbb C\) be open and \(f:U\to \mathbb C\). For complex polynomial coefficients \(A_0,\ldots ,A_m\) and a point \(z\in U\) at which all derivatives of orders \(0,\ldots ,m\) exist in the sense of Definition 1.1.19, define \(\mathcal Lf(z)=\sum _{k=0}^m A_k(z)J_kf(z)\). The highest derivative need only exist at \(z\); no value is assigned at points without the required jet.
def Polynomial.differentialOperatorOnFunctions (A : ℕ → Polynomial ℂ) (m : ℕ) {U : TopologicalSpace.Opens ℂ} (f : ↥U → ℂ)
(z : DerivativeJetPoint U m f) : ℂ
Lean definition
/-- A finite differential expression, only at points possessing its derivative jet. -/
noncomputable def differentialOperatorOnFunctions (A : ℕ → ℂ[X]) (m : ℕ)
{U : TopologicalSpace.Opens ℂ} (f : U → ℂ) (z : DerivativeJetPoint U m f) : ℂ :=
∑ k : Fin (m + 1), (A k.val).eval z.val.val * derivativeJet z k
For \(f\in \mathcal D^m(U)\), the action equals \(\sum _{k=0}^m A_k(z)D_U^kf(z)\), where \(D_U^kf\) is obtained from the order-\(k\) truncation of the derivative chain of \(f\). Every polynomial \(p\) restricted to \(U\) belongs to \(\mathcal D^m(U)\), and \(\mathcal Lp(z)=(Lp)(z)\), where \(L\) is polynomial differential assembly.
Lean Formalisation
theorem Polynomial.differentialOperatorOnFunctions_ofIterated (A : ℕ → Polynomial ℂ) (m : ℕ) {U : TopologicalSpace.Opens ℂ}
(f : IteratedDerivInput U m) (z : ↥U) :
Polynomial.differentialOperatorOnFunctions A m (↑f) (DerivativeJetPoint.ofIterated f z) =
∑ k, Polynomial.eval (↑z) (A ↑k) * iteratedDerivOnOpen (f.truncate ⋯) z
Lean proof
/-- Actual derivative chains supply the pointwise differential action. -/
theorem differentialOperatorOnFunctions_ofIterated
(A : ℕ → ℂ[X]) (m : ℕ) {U : TopologicalSpace.Opens ℂ}
(f : IteratedDerivInput U m) (z : U) :
differentialOperatorOnFunctions A m f.val (.ofIterated f z) =
∑ k : Fin (m + 1), (A k.val).eval z.val *
iteratedDerivOnOpen (f.truncate (Nat.le_of_lt_succ k.isLt)) z := by
unfold differentialOperatorOnFunctions
apply Finset.sum_congr rfl
intro k _
change (A k.val).eval z.val * derivativeJet (DerivativeJetPoint.ofIterated f z) k = _
rw [derivativeJet_ofIterated]
def Polynomial.iteratedDerivInputOnOpen (p : Polynomial ℂ) (U : TopologicalSpace.Opens ℂ) (m : ℕ) : IteratedDerivInput U m
Lean definition
/-- Polynomial functions supply actual derivative chains on every open domain. -/
def iteratedDerivInputOnOpen (p : ℂ[X]) (U : TopologicalSpace.Opens ℂ) (m : ℕ) :
IteratedDerivInput U m :=
.ofAnalytic (fun z ↦ p.eval z.val)
((analyticOnOpen_iff U _ (fun z ↦ p.eval z) (fun _ ↦ rfl)).2
(p.differentiable.differentiableOn.analyticOnNhd U.isOpen)) m
theorem Polynomial.iteratedDerivInputOnOpen_val (p : Polynomial ℂ) (U : TopologicalSpace.Opens ℂ) (m : ℕ) :
↑(p.iteratedDerivInputOnOpen U m) = fun z => Polynomial.eval (↑z) p
Lean proof
@[simp] theorem iteratedDerivInputOnOpen_val (p : ℂ[X]) (U : TopologicalSpace.Opens ℂ) (m : ℕ) :
(p.iteratedDerivInputOnOpen U m).val = fun z : U ↦ p.eval z.val := rfl
theorem Polynomial.differentialOperatorOnFunctions_eval (A : ℕ → Polynomial ℂ) (m : ℕ) (p : Polynomial ℂ)
(U : TopologicalSpace.Opens ℂ) (z : ↥U) :
Polynomial.differentialOperatorOnFunctions A m (↑(p.iteratedDerivInputOnOpen U m))
(DerivativeJetPoint.ofIterated (p.iteratedDerivInputOnOpen U m) z) =
Polynomial.eval (↑z) ((Polynomial.differentialOperator A m) p)
Lean proof
/-- Classical differential action agrees with polynomial differential action. -/
theorem differentialOperatorOnFunctions_eval (A : ℕ → ℂ[X]) (m : ℕ)
(p : ℂ[X]) (U : TopologicalSpace.Opens ℂ) (z : U) :
differentialOperatorOnFunctions A m (p.iteratedDerivInputOnOpen U m).val
(.ofIterated (p.iteratedDerivInputOnOpen U m) z) =
(differentialOperator A m p).eval z.val := by
rw [differentialOperatorOnFunctions_eq_extension A m (p.iteratedDerivInputOnOpen U m)
(fun z ↦ p.eval z) (p.differentiable.differentiableOn.analyticOnNhd U.isOpen) (fun _ ↦ rfl)]
simp only [iteratedDeriv_eval, differentialOperator_apply, eval_finsetSum, eval_mul]
The polynomial and function actions agree on polynomials, and polynomial assembly commutes with changing the coefficient ring. If \(U\subset \mathbb {C}\) is open and \(|a_nP_n(z)|\le u_n\) on \(U\) with \(\sum _n u_n{\lt}\infty \), then \(\mathcal LS=\sum _n a_n LP_n\) on \(U\). If the coefficient matrix reconstruction is absolutely convergent at \(z\), its weighted contribution series represents \(\mathcal LS(z)\). If each coefficient row converges, this is also the coefficient-times-mode series. This includes bases over a ring \(R\) evaluated through \(\sigma :R\to \mathbb C\).
Lean Formalisation
theorem Polynomial.differentialOperator_map.{u_1, u_2} {R : Type u_1} [CommRing R] {S : Type u_2} [CommRing S] (σ : R →+* S)
(A : ℕ → Polynomial R) (m : ℕ) (p : Polynomial R) :
Polynomial.map σ ((Polynomial.differentialOperator A m) p) =
(Polynomial.differentialOperator (fun k => Polynomial.map σ (A k)) m) (Polynomial.map σ p)
Lean proof
/-- Polynomial differential assembly commutes with changing the coefficient ring. -/
theorem differentialOperator_map {S : Type*} [CommRing S] (σ : R →+* S)
(A : ℕ → R[X]) (m : ℕ) (p : R[X]) :
(differentialOperator A m p).map σ =
differentialOperator (fun k ↦ (A k).map σ) m (p.map σ) := by
simp only [differentialOperator_apply, Polynomial.map_sum, Polynomial.map_mul,
iterate_derivative_map]
theorem Polynomial.hasSum_differentialOperator_series {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
(A : ℕ → Polynomial ℂ) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (P n)) (↑f z)) (z : ↥U) :
HasSum (fun n => a n * Polynomial.eval (↑z) ((Polynomial.differentialOperator A m) (P n)))
(Polynomial.differentialOperatorOnFunctions A m (↑f) (DerivativeJetPoint.ofIterated f z))
Lean proof
/-- Termwise application represents the actual differential action. -/
theorem hasSum_differentialOperator_series {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
(A : ℕ → ℂ[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (P n).eval z.val) (f.val z)) (z : U) :
HasSum (fun n ↦ a n * (differentialOperator A m (P n)).eval z.val)
(differentialOperatorOnFunctions A m f.val (.ofIterated f z)) := by
rw [differentialOperatorOnFunctions_eq_extension A m f
(fun z ↦ ∑' n, a n * (P n).eval z) (analyticOnNhd_polynomial_tsum hu hb)
(fun z ↦ (hf z).tsum_eq)]
exact hasSum_differentialOperator_series_tsum U.isOpen hu hb A m z.property
theorem Polynomial.hasSum_seriesCoefficientMap_differentialOperator (b c : Module.Basis ℕ ℂ (Polynomial ℂ)) {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (b n)‖ ≤ u n) (A : ℕ → Polynomial ℂ) (m : ℕ)
(f : IteratedDerivInput U m) (hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (b n)) (↑f z)) (z : ↥U)
(habs :
Summable fun p =>
‖a p.1 * (c.repr ((Polynomial.differentialOperator A m) (b p.1))) p.2 * Polynomial.eval (↑z) (c p.2)‖) :
HasSum (fun i => Polynomial.regroupCoefficients (Polynomial.RegroupCoefficientInput.ofSummableNorm habs Prod.snd i))
(Polynomial.differentialOperatorOnFunctions A m (↑f) (DerivativeJetPoint.ofIterated f z))
Lean proof
/-- Absolute coefficient reconstruction agrees with the classical differential action. -/
theorem hasSum_seriesCoefficientMap_differentialOperator
(b c : Module.Basis ℕ ℂ ℂ[X]) {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (b n).eval z‖ ≤ u n)
(A : ℕ → ℂ[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (b n).eval z.val) (f.val z)) (z : U)
(habs : Summable (fun p : ℕ × ℕ ↦
‖a p.1 * c.repr (differentialOperator A m (b p.1)) p.2 * (c p.2).eval z.val‖)) :
HasSum (fun i ↦ regroupCoefficients (RegroupCoefficientInput.ofSummableNorm habs Prod.snd i))
(differentialOperatorOnFunctions A m f.val (.ofIterated f z)) := by
rw [differentialOperatorOnFunctions_eq_extension A m f
(fun z ↦ ∑' n, a n * (b n).eval z) (analyticOnNhd_polynomial_tsum hu hb)
(fun z ↦ (hf z).tsum_eq)]
exact hasSum_seriesCoefficientMap_differentialOperator_tsum b c U.isOpen hu hb A m z.property habs
theorem Polynomial.hasSum_seriesCoefficientMap_differentialOperator_eval₂.{u_1} {R : Type u_1} [CommRing R]
(b c : Module.Basis ℕ R (Polynomial R)) (σ : R →+* ℂ) {a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ}
(hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval₂ σ z (b n)‖ ≤ u n) (A : ℕ → Polynomial R) (m : ℕ)
(f : IteratedDerivInput U m) (hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval₂ σ (↑z) (b n)) (↑f z)) (z : ↥U)
(habs :
Summable fun p =>
‖a p.1 * σ ((c.repr ((Polynomial.differentialOperator A m) (b p.1))) p.2) * Polynomial.eval₂ σ (↑z) (c p.2)‖) :
HasSum (fun i => Polynomial.regroupCoefficients (Polynomial.RegroupCoefficientInput.ofSummableNorm habs Prod.snd i))
(Polynomial.differentialOperatorOnFunctions (fun k => Polynomial.map σ (A k)) m (↑f)
(DerivativeJetPoint.ofIterated f z))
Lean proof
/-- The reconstruction also respects coefficient-ring evaluation maps. -/
theorem hasSum_seriesCoefficientMap_differentialOperator_eval₂
{R : Type*} [CommRing R] (b c : Module.Basis ℕ R R[X]) (σ : R →+* ℂ)
{a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (b n).eval₂ σ z‖ ≤ u n)
(A : ℕ → R[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (b n).eval₂ σ z.val) (f.val z)) (z : U)
(habs : Summable (fun p : ℕ × ℕ ↦
‖a p.1 * σ (c.repr (differentialOperator A m (b p.1)) p.2) *
(c p.2).eval₂ σ z.val‖)) :
HasSum (fun i ↦ regroupCoefficients (RegroupCoefficientInput.ofSummableNorm habs Prod.snd i))
(differentialOperatorOnFunctions (fun k ↦ (A k).map σ) m f.val (.ofIterated f z)) := by
have hb' : ∀ n z, z ∈ U → ‖a n * ((b n).map σ).eval z‖ ≤ u n := by
simpa only [eval_map] using hb
rw [differentialOperatorOnFunctions_eq_extension _ m f
(fun z ↦ ∑' n, a n * ((b n).map σ).eval z) (analyticOnNhd_polynomial_tsum hu hb')
(fun z ↦ by simpa only [eval_map] using (hf z).tsum_eq)]
simpa only [eval_map] using
hasSum_seriesCoefficientMap_differentialOperator_eval₂_tsum b c σ U.isOpen hu hb A m z.property habs
theorem Polynomial.hasSum_seriesCoefficientMap_differentialOperator_eval₂_of_rows.{u_1} {R : Type u_1} [CommRing R]
(b c : Module.Basis ℕ R (Polynomial R)) (σ : R →+* ℂ) {a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ}
(hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval₂ σ z (b n)‖ ≤ u n) (A : ℕ → Polynomial R) (m : ℕ)
(f : IteratedDerivInput U m) (hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval₂ σ (↑z) (b n)) (↑f z)) (z : ↥U)
(habs :
Summable fun p =>
‖a p.1 * σ ((c.repr ((Polynomial.differentialOperator A m) (b p.1))) p.2) * Polynomial.eval₂ σ (↑z) (c p.2)‖)
(rows : (i : ℕ) → b.SeriesCoefficientInput c (Polynomial.differentialOperator A m) σ i)
(hrows : ∀ (i : ℕ), ↑(rows i) = a) :
HasSum
(fun i => b.seriesCoefficientMap c (Polynomial.differentialOperator A m) σ (rows i) * Polynomial.eval₂ σ (↑z) (c i))
(Polynomial.differentialOperatorOnFunctions (fun k => Polynomial.map σ (A k)) m (↑f)
(DerivativeJetPoint.ofIterated f z))
Lean proof
/-- Convergent coefficient rows give the coordinate form of analytic residual
reconstruction. Weighted contributions alone need not have convergent rows. -/
theorem hasSum_seriesCoefficientMap_differentialOperator_eval₂_of_rows
{R : Type*} [CommRing R] (b c : Module.Basis ℕ R R[X]) (σ : R →+* ℂ)
{a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (b n).eval₂ σ z‖ ≤ u n)
(A : ℕ → R[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (b n).eval₂ σ z.val) (f.val z)) (z : U)
(habs : Summable (fun p : ℕ × ℕ ↦
‖a p.1 * σ (c.repr (differentialOperator A m (b p.1)) p.2) *
(c p.2).eval₂ σ z.val‖))
(rows : ∀ i, b.SeriesCoefficientInput c (differentialOperator A m) σ i)
(hrows : ∀ i, (rows i).val = a) :
HasSum (fun i ↦ b.seriesCoefficientMap c (differentialOperator A m) σ (rows i) *
(c i).eval₂ σ z.val)
(differentialOperatorOnFunctions (fun k ↦ (A k).map σ) m f.val (.ofIterated f z)) := by
have hb' : ∀ n z, z ∈ U → ‖a n * ((b n).map σ).eval z‖ ≤ u n := by
simpa only [eval_map] using hb
have hf' : ∀ z : U, HasSum (fun n ↦ a n * ((b n).map σ).eval z.val) (f.val z) := by
simpa only [eval_map] using hf
have hs := hasSum_differentialOperator_series hu hb' (fun k ↦ (A k).map σ) m f hf' z
simp only [← differentialOperator_map, eval_map] at hs
have h := b.hasSum_seriesCoefficientMap_of_rows c (differentialOperator A m) σ a z.val habs rows hrows
rw [hs.tsum_eq] at h
exact h
If \(\rho {\gt}1\) and \(|a_n|\le C\rho ^{-n}\), the complex Chebyshev sum \(S_a=\sum _n a_nT_n\) can be differentiated termwise to every order on \(E_\rho \). For \(k\ge 0\) its positive-order derivative is
Assume \(\rho {\gt}1\) and \(|a_n|\le C\rho ^{-n}\) for every \(n\); choose \(1{\lt}r{\lt}\rho \), \(z\in E_r\), and \(\delta {\gt}0\) with its circle about \(z\) contained in \(E_r\). Then
Polynomial multiplication in the Chebyshev basis has finite bandwidth. For every \(m\ge 0\) and real polynomial coefficients \(A_k\), the matrix from \(T\) to \(B_m\) for \(\sum _{k=0}^mA_kD^k\) has finite bandwidth. Thus for every complex coefficient sequence \(a\), each row series \(\sum _j M_{ij}a_j\) has only finitely many nonzero terms and converges, including for the order-zero multiplication operator.
Lean Formalisation
theorem Polynomial.exists_isBanded_chebyshev_mul (p : Polynomial ℝ) :
∃ d, (Polynomial.chebyshevBasis.toMatrix fun j => p * Polynomial.chebyshevBasis j).IsBanded d d
Lean proof
theorem exists_isBanded_chebyshev_mul (p : ℝ[X]) :
∃ d, (chebyshevBasis.toMatrix (fun j ↦ p * chebyshevBasis j)).IsBanded d d := by
classical
let d := (chebyshevBasis.repr p).support.sup id
refine ⟨d, ?_⟩
intro i j hij
change chebyshevBasis.repr (p * chebyshevBasis j) i = 0
have hp : ∑ k ∈ (chebyshevBasis.repr p).support,
(chebyshevBasis.repr p k) • chebyshevBasis k = p := by
simpa only [Finsupp.linearCombination_apply, Finsupp.sum] using
chebyshevBasis.linearCombination_repr p
rw [← hp, Finset.sum_mul, map_sum, Finsupp.finsetSum_apply]
apply Finset.sum_eq_zero
intro k hk
simp only [smul_mul_assoc, map_smul, Finsupp.smul_apply, smul_eq_mul]
have hk' : k ≤ d := Finset.le_sup (f := id) hk
have hdiff : ((k : ℤ) - j).natAbs = if j ≤ k then k - j else j - k := by
split_ifs with h
· exact Int.natAbs_natCast_sub_natCast_of_ge h
· exact Int.natAbs_natCast_sub_natCast_of_le (by omega)
have h1 : i ≠ k + j := by rcases hij with h | h <;> omega
have h2 : i ≠ ((k : ℤ) - j).natAbs := by
rw [hdiff]
split_ifs <;> rcases hij with h | h <;> omega
have he := two_mul_chebyshevBasis_repr_mul k j i
simp only [ite_eq_right h1, ite_eq_right h2, add_zero] at he
have hz : chebyshevBasis.repr (chebyshevBasis k * chebyshevBasis j) i = 0 := by linarith
rw [hz, mul_zero]
theorem Polynomial.exists_isBanded_ultraspherical_differentialOperator (A : ℕ → Polynomial ℝ) (m : ℕ) :
∃ l u,
((Polynomial.ultrasphericalBasis m).toMatrix fun j =>
(Polynomial.differentialOperator A m) (Polynomial.chebyshevBasis j)).IsBanded
l u
Lean proof
theorem exists_isBanded_ultraspherical_differentialOperator (A : ℕ → ℝ[X]) (m : ℕ) :
∃ l u, ((ultrasphericalBasis m).toMatrix
(fun j ↦ differentialOperator A m (chebyshevBasis j))).IsBanded l u := by
classical
cases m with
| zero =>
obtain ⟨d, hd⟩ := exists_isBanded_chebyshev_mul (A 0)
refine ⟨d, d, ?_⟩
simpa only [ultrasphericalBasis_zero, differentialOperator_apply, Nat.zero_add, Finset.sum_range_one,
Function.iterate_zero, id_eq] using hd
| succ m =>
let d := (Finset.range (m + 1 + 1)).sup (fun k ↦ (A k).natDegree)
exact ⟨d, d + 2 * (m + 1), ultraspherical_differentialOperator_isBanded_of_degree_le A
(by omega) (fun k hk ↦ Finset.le_sup (f := fun k ↦ (A k).natDegree)
(Finset.mem_range.mpr (by omega)))⟩
def Polynomial.ultrasphericalDifferentialSeriesInput (A : ℕ → Polynomial ℝ) (m : ℕ) (a : ℕ → ℂ) (i : ℕ) :
Polynomial.chebyshevBasis.SeriesCoefficientInput (Polynomial.ultrasphericalBasis m)
(Polynomial.differentialOperator A m) Complex.ofRealHom i
Lean definition
/-- Every polynomial differential operator has finite ultraspherical rows,
including the order-zero multiplication operator. -/
def ultrasphericalDifferentialSeriesInput (A : ℕ → ℝ[X]) (m : ℕ)
(a : ℕ → ℂ) (i : ℕ) :
chebyshevBasis.SeriesCoefficientInput (ultrasphericalBasis m)
(differentialOperator A m) ofRealHom i := ⟨a, by
obtain ⟨l, u, h⟩ := exists_isBanded_ultraspherical_differentialOperator A m
exact (Module.Basis.SeriesCoefficientInput.ofBanded _ _ _ _ a h i).property⟩
theorem Polynomial.ultrasphericalDifferentialSeriesInput_val (A : ℕ → Polynomial ℝ) (m : ℕ) (a : ℕ → ℂ) (i : ℕ) :
↑(Polynomial.ultrasphericalDifferentialSeriesInput A m a i) = a
Lean proof
@[simp] theorem ultrasphericalDifferentialSeriesInput_val (A : ℕ → ℝ[X]) (m : ℕ)
(a : ℕ → ℂ) (i : ℕ) :
(ultrasphericalDifferentialSeriesInput A m a i).val = a := rfl
Let \(L=\sum _{k=0}^m A_kD^k\) have real polynomial coefficients. On a normally convergent complex Chebyshev expansion, the existing matrix from \(T\) to \(B_m\), under the weighted reconstruction condition of Theorem 4.3.10, represents the analytic differential expression \(\mathcal LS\). For \(m\ge 1\) and \(\operatorname {natDegree} A_k\le d\), each output coefficient uses only indices \(j{\lt}i+d+2m+1\). This is the same matrix as finite polynomial assembly, without introducing a second complex basis definition.
Lean Formalisation
theorem Polynomial.ultraspherical_series_differentialOperator_eq_sum (A : ℕ → Polynomial ℝ) {m d : ℕ} (hm : 1 ≤ m)
(hd : ∀ k ≤ m, (A k).natDegree ≤ d) (a : ℕ → ℂ) (i : ℕ) :
Polynomial.chebyshevBasis.seriesCoefficientMap (Polynomial.ultrasphericalBasis m)
(Polynomial.differentialOperator A m) Complex.ofRealHom
(Polynomial.ultrasphericalDifferentialSeriesInput A m a i) =
∑ j ∈ Finset.range (i + (d + 2 * m) + 1),
a j *
↑(((Polynomial.ultrasphericalBasis m).repr
((Polynomial.differentialOperator A m) (Polynomial.chebyshevBasis j)))
i)
Lean proof
/-- Infinite residual assembly uses the proven finite row window. -/
theorem ultraspherical_series_differentialOperator_eq_sum
(A : ℕ → ℝ[X]) {m d : ℕ} (hm : 1 ≤ m)
(hd : ∀ k ≤ m, (A k).natDegree ≤ d) (a : ℕ → ℂ) (i : ℕ) :
chebyshevBasis.seriesCoefficientMap (ultrasphericalBasis m)
(differentialOperator A m) ofRealHom (ultrasphericalDifferentialSeriesInput A m a i) =
∑ j ∈ Finset.range (i + (d + 2 * m) + 1),
a j * ((ultrasphericalBasis m).repr (differentialOperator A m (chebyshevBasis j)) i : ℂ) := by
have he : ultrasphericalDifferentialSeriesInput A m a i =
Module.Basis.SeriesCoefficientInput.ofBanded _ _ _ _ a
(ultraspherical_differentialOperator_isBanded_of_degree_le A hm hd) i :=
Subtype.ext rfl
rw [he]
exact chebyshevBasis.seriesCoefficientMap_eq_sum_of_isBanded (ultrasphericalBasis m)
(differentialOperator A m) ofRealHom a
(ultraspherical_differentialOperator_isBanded_of_degree_le A hm hd) i
theorem Polynomial.hasSum_ultraspherical_differentialOperator_series {a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ}
(hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (Polynomial.Chebyshev.T ℂ ↑n)‖ ≤ u n)
(A : ℕ → Polynomial ℝ) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (Polynomial.Chebyshev.T ℂ ↑n)) (↑f z)) (z : ↥U)
(w : ℕ → ℝ) (hw : ∀ (i : ℕ), ‖Polynomial.eval₂ Complex.ofRealHom (↑z) ((Polynomial.ultrasphericalBasis m) i)‖ ≤ w i)
(ha :
Summable fun j =>
‖a j‖ *
∑
i ∈
((Polynomial.ultrasphericalBasis m).repr
((Polynomial.differentialOperator A m) (Polynomial.chebyshevBasis j))).support,
‖↑(((Polynomial.ultrasphericalBasis m).repr
((Polynomial.differentialOperator A m) (Polynomial.chebyshevBasis j)))
i)‖ *
w i) :
HasSum
(fun i =>
Polynomial.chebyshevBasis.seriesCoefficientMap (Polynomial.ultrasphericalBasis m)
(Polynomial.differentialOperator A m) Complex.ofRealHom
(Polynomial.ultrasphericalDifferentialSeriesInput A m a i) *
Polynomial.eval₂ Complex.ofRealHom (↑z) ((Polynomial.ultrasphericalBasis m) i))
(Polynomial.differentialOperatorOnFunctions (fun k => Polynomial.map Complex.ofRealHom (A k)) m (↑f)
(DerivativeJetPoint.ofIterated f z))
Lean proof
/-- The normally convergent expansion's ultraspherical residual represents its
actual differential action, also for order-zero multiplication. -/
theorem hasSum_ultraspherical_differentialOperator_series
{a : ℕ → ℂ} {u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (Chebyshev.T ℂ n).eval z‖ ≤ u n)
(A : ℕ → ℝ[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (Chebyshev.T ℂ n).eval z.val) (f.val z))
(z : U) (w : ℕ → ℝ)
(hw : ∀ i, ‖(ultrasphericalBasis m i).eval₂ ofRealHom z.val‖ ≤ w i)
(ha : Summable (fun j ↦ ‖a j‖ *
∑ i ∈ ((ultrasphericalBasis m).repr (differentialOperator A m (chebyshevBasis j))).support,
‖(((ultrasphericalBasis m).repr (differentialOperator A m (chebyshevBasis j))) i : ℂ)‖ * w i)) :
HasSum (fun i ↦ chebyshevBasis.seriesCoefficientMap (ultrasphericalBasis m)
(differentialOperator A m) ofRealHom (ultrasphericalDifferentialSeriesInput A m a i) *
(ultrasphericalBasis m i).eval₂ ofRealHom z.val)
(differentialOperatorOnFunctions (fun k ↦ (A k).map ofRealHom) m f.val (.ofIterated f z)) := by
have he (n : ℕ) (v : ℂ) : (chebyshevBasis n).eval₂ ofRealHom v =
(Chebyshev.T ℂ n).eval v := by
rw [chebyshevBasis_apply, eval₂_eq_eval_map, Chebyshev.map_T]
exact hasSum_seriesCoefficientMap_differentialOperator_eval₂_of_rows chebyshevBasis
(ultrasphericalBasis m) ofRealHom hu (by simpa only [he] using hb) A m f
(by simpa only [he] using hf) z
(chebyshevBasis.summable_norm_seriesCoefficientMap_terms (ultrasphericalBasis m)
(differentialOperator A m) ofRealHom a z.val w hw ha)
(ultrasphericalDifferentialSeriesInput A m a) (fun _ ↦ rfl)
For \(\rho {\gt}1\), \(|a_n|\le C\rho ^{-n}\) and \(1{\lt}r{\lt}\rho \), the residual and boundary inequalities of Theorem 4.3.17 hold for the Chebyshev truncations with
\[ t_N=\frac{C(r/\rho )^N}{1-r/\rho }, \]
provided the evaluation points and the specified positive-radius circles lie in \(E_r\).
Lean Formalisation
theorem Polynomial.Chebyshev.norm_differentialOperator_complexChebyshevSeries_sub_sum_le {a : ℕ → ℂ} {C ρ r δ : ℝ} (hρ : 1 < ρ)
(hr : 1 < r) (hrρ : r < ρ) (ha : ∀ (n : ℕ), ‖a n‖ ≤ C / ρ ^ n) (A : ℕ → Polynomial ℂ) (m : ℕ)
(z : ↑(Complex.bernsteinEllipse ⟨ρ, hρ⟩)) (hz : ↑z ∈ Complex.bernsteinEllipse ⟨r, hr⟩) (hδ : 0 < δ)
(hball : Metric.sphere (↑z) δ ⊆ Complex.bernsteinEllipse ⟨r, hr⟩) (N : ℕ) :
‖Polynomial.differentialOperatorOnFunctions A m (↑(Polynomial.Chebyshev.complexChebyshevSeriesDerivInput hρ ha m))
(DerivativeJetPoint.ofIterated (Polynomial.Chebyshev.complexChebyshevSeriesDerivInput hρ ha m) z) -
Polynomial.eval (↑z)
((Polynomial.differentialOperator A m) (∑ n ∈ Finset.range N, a n • Polynomial.Chebyshev.T ℂ ↑n))‖ ≤
(∑ k ∈ Finset.range (m + 1), ‖Polynomial.eval (↑z) (A k)‖ * ↑k.factorial / δ ^ k) * (C * (r / ρ) ^ N / (1 - r / ρ))
Lean proof
/-- Residual errors are bounded on the actual geometric derivative domain. -/
theorem norm_differentialOperator_complexChebyshevSeries_sub_sum_le
{a : ℕ → ℂ} {C ρ r δ : ℝ} (hρ : 1 < ρ) (hr : 1 < r) (hrρ : r < ρ)
(ha : ∀ n, ‖a n‖ ≤ C / ρ ^ n) (A : ℕ → ℂ[X]) (m : ℕ)
(z : bernsteinEllipse ⟨ρ, hρ⟩) (hz : z.val ∈ bernsteinEllipse ⟨r, hr⟩) (hδ : 0 < δ)
(hball : Metric.sphere z.val δ ⊆ bernsteinEllipse ⟨r, hr⟩) (N : ℕ) :
‖differentialOperatorOnFunctions A m (complexChebyshevSeriesDerivInput hρ ha m).val
(.ofIterated (complexChebyshevSeriesDerivInput hρ ha m) z) -
(differentialOperator A m (∑ n ∈ Finset.range N, a n • T ℂ n)).eval z.val‖ ≤
(∑ k ∈ Finset.range (m + 1), ‖(A k).eval z.val‖ * k.factorial / δ ^ k) *
(C * (r / ρ) ^ N / (1 - r / ρ)) := by
have h := norm_boundary_complexChebyshevSeries_sub_sum_le hρ hr hrρ ha
(Finset.range (m + 1)) (fun k ↦ (A k).eval z.val) id (fun _ ↦ z.val) (fun _ ↦ δ)
(fun _ _ ↦ hz) (fun _ _ ↦ hδ) (fun _ _ ↦ hball) N
have he : ∀ w : bernsteinEllipse ⟨ρ, hρ⟩,
(∑' n, a n * (T ℂ n).eval w.val) = (complexChebyshevSeriesDerivInput hρ ha m).val w := by
intro w
exact (complexChebyshevSeries_eq_tsum (ComplexChebyshevSeriesPoint.ofGeometric hρ ha w)
(summable_chebyshevSeries_of_geometric hρ ha w.property)).symm
rw [differentialOperatorOnFunctions_eq_extension A m (complexChebyshevSeriesDerivInput hρ ha m)
_ (analyticOnNhd_chebyshev_tsum hρ ha) he]
simp_rw [iteratedDeriv_complexChebyshevSeries_eq] at h
simp only [id_eq] at h
rw [(Finset.range (m + 1)).sum_coe_sort
(fun k ↦ (A k).eval z.val * iteratedDeriv k (fun w ↦ ∑' n, a n * (T ℂ n).eval w) z.val)] at h
simpa only [differentialOperator_apply, iterate_derivative_sum, iterate_derivative_smul,
eval_finsetSum, eval_mul, eval_smul, smul_eq_mul, id_eq] using h
Let \(U\subset \mathbb C\) be open and \(P_n\in \mathbb C[x]\). Suppose \(\sum _n u_n{\lt}\infty \) and \(|a_nP_n(z)|\le u_n\) for every \(z\in U\). Then \(S=\sum _n a_nP_n\) satisfies, for every integer \(k\ge 0\),
\[ S^{(k)}(z)=\sum _n a_n P_n^{(k)}(z), \]
with locally uniform convergence of the differentiated finite sums, hence uniform convergence on every compact subset of \(U\). If \(z\in U\), \(\delta {\gt}0\), and the circle of radius \(\delta \) about \(z\) lies in \(U\), then
No new majorant for each derivative order is assumed.
Reference: Weierstrass’s theorem on locally uniform limits of analytic functions.
Lean Formalisation
theorem Polynomial.iteratedDeriv_eval (p : Polynomial ℂ) (k : ℕ) :
(iteratedDeriv k fun z => Polynomial.eval z p) = fun z => Polynomial.eval z ((⇑Polynomial.derivative)^[k] p)
Lean proof
/-- Analytic iterated derivatives agree with iterates of polynomial differentiation. -/
theorem iteratedDeriv_eval (p : ℂ[X]) (k : ℕ) :
iteratedDeriv k (fun z ↦ p.eval z) = fun z ↦ (derivative^[k] p).eval z := by
induction k with
| zero => rfl
| succ k ih =>
funext z
rw [iteratedDeriv_succ, ih, Polynomial.deriv]
simp only [Function.iterate_succ_apply']
theorem Polynomial.tendstoLocallyUniformlyOn_iteratedDeriv.{u_1} {ι : Type u_1} {Q : ι → Polynomial ℂ} {f : ℂ → ℂ}
{φ : Filter ι} {U : Set ℂ} (hU : IsOpen U) (h : TendstoLocallyUniformlyOn (fun i z => Polynomial.eval z (Q i)) f φ U)
(k : ℕ) :
TendstoLocallyUniformlyOn (fun i z => Polynomial.eval z ((⇑Polynomial.derivative)^[k] (Q i))) (iteratedDeriv k f) φ U
Lean proof
/-- Polynomial local uniform convergence passes to derivatives of every order. -/
theorem tendstoLocallyUniformlyOn_iteratedDeriv {ι : Type*} {Q : ι → ℂ[X]}
{f : ℂ → ℂ} {φ : Filter ι} {U : Set ℂ} (hU : IsOpen U)
(h : TendstoLocallyUniformlyOn (fun i z ↦ (Q i).eval z) f φ U) (k : ℕ) :
TendstoLocallyUniformlyOn (fun i z ↦ (derivative^[k] (Q i)).eval z)
(iteratedDeriv k f) φ U := by
induction k with
| zero => simpa using h
| succ k ih =>
have hd := ih.deriv (Eventually.of_forall fun i ↦ (derivative^[k] (Q i)).differentiableOn) hU
have he (p : ℂ[X]) : deriv (fun z ↦ p.eval z) = fun z ↦ p.derivative.eval z :=
_root_.funext (fun _ ↦ p.deriv)
simpa only [Function.comp_def, he, Function.iterate_succ_apply', iteratedDeriv_succ] using hd
theorem Polynomial.tendstoLocallyUniformlyOn_iterated_derivative_series {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : Set ℂ} (hU : IsOpen U) (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
(k : ℕ) :
TendstoLocallyUniformlyOn (fun s z => ∑ n ∈ s, a n * Polynomial.eval z ((⇑Polynomial.derivative)^[k] (P n)))
(iteratedDeriv k fun z => ∑' (n : ℕ), a n * Polynomial.eval z (P n)) Filter.atTop U
Lean proof
/-- Every derivative of a normally convergent polynomial expansion is the
locally uniform limit of the corresponding differentiated finite sums. -/
theorem tendstoLocallyUniformlyOn_iterated_derivative_series {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : Set ℂ} (hU : IsOpen U) (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n) (k : ℕ) :
TendstoLocallyUniformlyOn
(fun s : Finset ℕ ↦ fun z ↦ ∑ n ∈ s, a n * (derivative^[k] (P n)).eval z)
(iteratedDeriv k (fun z ↦ ∑' n, a n * (P n).eval z)) atTop U := by
let Q (s : Finset ℕ) : ℂ[X] := ∑ n ∈ s, a n • P n
have hq : TendstoLocallyUniformlyOn (fun s z ↦ (Q s).eval z)
(fun z ↦ ∑' n, a n * (P n).eval z) atTop U := by
simpa only [Q, eval_finsetSum, eval_smul, smul_eq_mul] using
(tendstoUniformlyOn_tsum hu hb).tendstoLocallyUniformlyOn
have h := tendstoLocallyUniformlyOn_iteratedDeriv hU hq k
have he (s : Finset ℕ) : derivative^[k] (Q s) = ∑ n ∈ s, a n • derivative^[k] (P n) := by
simp only [Q, iterate_derivative_sum, iterate_derivative_smul]
simpa only [he, eval_finsetSum, eval_smul, smul_eq_mul] using h
theorem Polynomial.tendstoUniformlyOn_iterated_derivative_series {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ} {U K : Set ℂ}
(hU : IsOpen U) (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n) (hK : IsCompact K)
(hKU : K ⊆ U) (k : ℕ) :
TendstoUniformlyOn (fun s z => ∑ n ∈ s, a n * Polynomial.eval z ((⇑Polynomial.derivative)^[k] (P n)))
(iteratedDeriv k fun z => ∑' (n : ℕ), a n * Polynomial.eval z (P n)) Filter.atTop K
Lean proof
/-- On a compact subset, all differentiated finite sums converge uniformly. -/
theorem tendstoUniformlyOn_iterated_derivative_series {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U K : Set ℂ} (hU : IsOpen U) (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
(hK : IsCompact K) (hKU : K ⊆ U) (k : ℕ) :
TendstoUniformlyOn
(fun s : Finset ℕ ↦ fun z ↦ ∑ n ∈ s, a n * (derivative^[k] (P n)).eval z)
(iteratedDeriv k (fun z ↦ ∑' n, a n * (P n).eval z)) atTop K :=
(tendstoLocallyUniformlyOn_iff_forall_isCompact hU).mp
(tendstoLocallyUniformlyOn_iterated_derivative_series hU hu hb k) K hKU hK
theorem Polynomial.hasSum_iterated_derivative_series {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ} {U : Set ℂ} (hU : IsOpen U)
(hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n) (k : ℕ) {z : ℂ} (hz : z ∈ U) :
HasSum (fun n => a n * Polynomial.eval z ((⇑Polynomial.derivative)^[k] (P n)))
(iteratedDeriv k (fun w => ∑' (n : ℕ), a n * Polynomial.eval w (P n)) z)
Lean proof
/-- Termwise differentiation to arbitrary order under the original majorant. -/
theorem hasSum_iterated_derivative_series {P : ℕ → ℂ[X]} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : Set ℂ} (hU : IsOpen U) (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n) (k : ℕ)
{z : ℂ} (hz : z ∈ U) :
HasSum (fun n ↦ a n * (derivative^[k] (P n)).eval z)
(iteratedDeriv k (fun w ↦ ∑' n, a n * (P n).eval w) z) := by
change Tendsto (fun s : Finset ℕ ↦ ∑ n ∈ s, a n * (derivative^[k] (P n)).eval z)
atTop (nhds (iteratedDeriv k (fun w ↦ ∑' n, a n * (P n).eval w) z))
exact (tendstoLocallyUniformlyOn_iterated_derivative_series (P := P) (a := a)
hU hu hb k).tendsto_at hz
theorem Polynomial.norm_iterated_derivative_series_sub_sum_le {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ} {U : Set ℂ}
(hU : IsOpen U) (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n) (k : ℕ) {z : ℂ}
(hz : z ∈ U) {δ : ℝ} (hδ : 0 < δ) (hball : Metric.sphere z δ ⊆ U) (N : ℕ) :
‖iteratedDeriv k (fun w => ∑' (n : ℕ), a n * Polynomial.eval w (P n)) z -
∑ n ∈ Finset.range N, a n * Polynomial.eval z ((⇑Polynomial.derivative)^[k] (P n))‖ ≤
(↑k.factorial * ∑' (n : ℕ), u (n + N)) / δ ^ k
Lean proof
/-- An order-k truncation error is bounded by k!/delta^k times the original
majorant tail, including k=0. -/
theorem norm_iterated_derivative_series_sub_sum_le {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : Set ℂ} (hU : IsOpen U) (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
(k : ℕ) {z : ℂ} (hz : z ∈ U) {δ : ℝ} (hδ : 0 < δ)
(hball : Metric.sphere z δ ⊆ U) (N : ℕ) :
‖iteratedDeriv k (fun w ↦ ∑' n, a n * (P n).eval w) z -
∑ n ∈ Finset.range N, a n * (derivative^[k] (P n)).eval z‖ ≤
k.factorial * (∑' n, u (n + N)) / δ ^ k := by
have hd (n : ℕ) : ‖a n * (derivative^[k] (P n)).eval z‖ ≤ k.factorial * u n / δ ^ k := by
have h := Complex.norm_iteratedDeriv_le_of_forall_mem_sphere_norm_le
(f := fun w : ℂ ↦ a n * (P n).eval w) (C := u n) (c := z) (R := δ) k hδ
((P n).differentiable.const_mul (a n)).diffContOnCl
(fun w hw ↦ hb n w (hball hw))
simpa only [iteratedDeriv_const_mul_field, iteratedDeriv_eval] using h
have h := norm_series_sub_sum_le_tail (hasSum_iterated_derivative_series (P := P) (a := a) hU hu hb k hz)
((hu.mul_left (k.factorial : ℝ)).div_const (δ ^ k)) hd N
simpa only [tsum_div_const, tsum_mul_left] using h
Let \(p_N=\sum _{n{\lt}N}a_nP_n\) and \(t_N=\sum _{n\ge N}u_n\). For \(z\in U\) and a radius-\(\delta \) circle contained in \(U\), with \(\delta {\gt}0\),
This includes value, derivative, and Robin conditions.
Lean Formalisation
theorem Polynomial.norm_differentialOperator_series_sub_sum_le {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
(A : ℕ → Polynomial ℂ) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (P n)) (↑f z)) (z : ↥U) {δ : ℝ} (hδ : 0 < δ)
(hball : Metric.sphere (↑z) δ ⊆ ↑U) (N : ℕ) :
‖Polynomial.differentialOperatorOnFunctions A m (↑f) (DerivativeJetPoint.ofIterated f z) -
Polynomial.eval (↑z) ((Polynomial.differentialOperator A m) (∑ n ∈ Finset.range N, a n • P n))‖ ≤
(∑ k ∈ Finset.range (m + 1), ‖Polynomial.eval (↑z) (A k)‖ * ↑k.factorial / δ ^ k) * ∑' (n : ℕ), u (n + N)
Lean proof
/-- Differential residual error on the genuine derivative domain. -/
theorem norm_differentialOperator_series_sub_sum_le {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
(A : ℕ → ℂ[X]) (m : ℕ) (f : IteratedDerivInput U m)
(hf : ∀ z : U, HasSum (fun n ↦ a n * (P n).eval z.val) (f.val z))
(z : U) {δ : ℝ} (hδ : 0 < δ) (hball : Metric.sphere z.val δ ⊆ U) (N : ℕ) :
‖differentialOperatorOnFunctions A m f.val (.ofIterated f z) -
(differentialOperator A m (∑ n ∈ Finset.range N, a n • P n)).eval z.val‖ ≤
(∑ k ∈ Finset.range (m + 1), ‖(A k).eval z.val‖ * k.factorial / δ ^ k) *
(∑' n, u (n + N)) := by
rw [differentialOperatorOnFunctions_eq_extension A m f
(fun z ↦ ∑' n, a n * (P n).eval z) (analyticOnNhd_polynomial_tsum hu hb)
(fun z ↦ (hf z).tsum_eq)]
exact norm_differentialOperator_series_sub_sum_le_tsum U.isOpen hu hb A m z.property hδ hball N
theorem Polynomial.norm_boundary_series_sub_sum_le.{u_1} {P : ℕ → Polynomial ℂ} {a : ℕ → ℂ} {u : ℕ → ℝ}
{U : TopologicalSpace.Opens ℂ} (hu : Summable u) (hb : ∀ (n : ℕ), ∀ z ∈ U, ‖a n * Polynomial.eval z (P n)‖ ≤ u n)
(f : ↥U → ℂ) (hf : ∀ (z : ↥U), HasSum (fun n => a n * Polynomial.eval (↑z) (P n)) (f z)) {ι : Type u_1} (s : Finset ι)
(c : ι → ℂ) (k : ι → ℕ) (z : ι → ℂ) (δ : ι → ℝ) (hz : ∀ i ∈ s, z i ∈ U) (hδ : ∀ i ∈ s, 0 < δ i)
(hball : ∀ i ∈ s, Metric.sphere (z i) (δ i) ⊆ ↑U) (N : ℕ) :
‖∑ i, c ↑i * iteratedDerivOnOpen (IteratedDerivInput.ofAnalytic f ⋯ (k ↑i)) ⟨z ↑i, ⋯⟩ -
∑ i ∈ s, c i * ∑ n ∈ Finset.range N, a n * Polynomial.eval (z i) ((⇑Polynomial.derivative)^[k i] (P n))‖ ≤
(∑ i ∈ s, ‖c i‖ * ↑(k i).factorial / δ i ^ k i) * ∑' (n : ℕ), u (n + N)
Lean proof
/-- Boundary combinations use only certified derivatives at the finitely many
points that actually occur, retaining the empty-sum and empty-domain cases. -/
theorem norm_boundary_series_sub_sum_le {P : ℕ → ℂ[X]} {a : ℕ → ℂ}
{u : ℕ → ℝ} {U : TopologicalSpace.Opens ℂ} (hu : Summable u)
(hb : ∀ n z, z ∈ U → ‖a n * (P n).eval z‖ ≤ u n)
(f : U → ℂ) (hf : ∀ z : U, HasSum (fun n ↦ a n * (P n).eval z.val) (f z))
{ι : Type*} (s : Finset ι) (c : ι → ℂ) (k : ι → ℕ) (z : ι → ℂ) (δ : ι → ℝ)
(hz : ∀ i ∈ s, z i ∈ U) (hδ : ∀ i ∈ s, 0 < δ i)
(hball : ∀ i ∈ s, Metric.sphere (z i) (δ i) ⊆ U) (N : ℕ) :
‖(∑ i : s, c i.val * iteratedDerivOnOpen
(IteratedDerivInput.ofAnalytic f (analyticOnOpen_of_hasSum_polynomial hu hb hf) (k i.val))
⟨z i.val, hz i.val i.property⟩) -
∑ i ∈ s, c i * ∑ n ∈ Finset.range N, a n * (derivative^[k i] (P n)).eval (z i)‖ ≤
(∑ i ∈ s, ‖c i‖ * (k i).factorial / (δ i) ^ k i) * (∑' n, u (n + N)) := by
have hd (i : s) : iteratedDerivOnOpen
(IteratedDerivInput.ofAnalytic f (analyticOnOpen_of_hasSum_polynomial hu hb hf) (k i.val))
⟨z i.val, hz i.val i.property⟩ =
iteratedDeriv (k i.val) (fun w ↦ ∑' n, a n * (P n).eval w) (z i.val) :=
congrFun (iteratedDerivOnOpen_eq_iteratedDeriv _
(fun w ↦ ∑' n, a n * (P n).eval w) (analyticOnNhd_polynomial_tsum hu hb)
(fun w ↦ (hf w).tsum_eq)) ⟨z i.val, hz i.val i.property⟩
simp_rw [hd]
rw [s.sum_coe_sort (fun i ↦ c i * iteratedDeriv (k i) (fun w ↦ ∑' n, a n * (P n).eval w) (z i))]
exact norm_boundary_series_sub_sum_le_tsum U.isOpen hu hb s c k z δ hz hδ hball N