223 lines
9.4 KiB
Text
223 lines
9.4 KiB
Text
/-
|
||
Copyright (c) 2016 Jeremy Avigad. All rights reserved.
|
||
Released under Apache 2.0 license as described in the file LICENSE.
|
||
Author: Jeremy Avigad
|
||
|
||
Real inner product spaces.
|
||
|
||
Note: We can enter ⟨v, w⟩ as \<v, w\>. This file overwrites the notation for dependent pairs.
|
||
-/
|
||
import theories.analysis.normed_space theories.analysis.sqrt
|
||
open nat real classical
|
||
noncomputable theory
|
||
|
||
structure inner_product_space [class] (V : Type) extends real_vector_space V :=
|
||
(inner : V → V → ℝ)
|
||
(inner_add_left : ∀ u v w, inner (add u v) w = inner u w + inner v w)
|
||
(inner_smul_left : ∀ r v w, inner (smul r v) w = r * inner v w)
|
||
(inner_comm : ∀ v w, inner v w = inner w v)
|
||
(inner_self_nonneg : ∀ v, inner v v ≥ 0)
|
||
(eq_zero_of_inner_self_eq_zero : ∀ {v}, inner v v = 0 → v = zero)
|
||
|
||
namespace analysis
|
||
|
||
variables {V : Type} [inner_product_space V]
|
||
|
||
definition inner (v w : V) : ℝ := inner_product_space.inner v w
|
||
|
||
notation `⟨` v `, ` w `⟩` := inner v w
|
||
|
||
proposition inner_comm (v w : V) : ⟨v, w⟩ = ⟨w, v⟩ := inner_product_space.inner_comm v w
|
||
|
||
proposition inner_add_left (u v w : V) : ⟨u + v, w⟩ = ⟨u, w⟩ + ⟨v, w⟩ :=
|
||
inner_product_space.inner_add_left u v w
|
||
|
||
proposition inner_add_right (u v w : V) : ⟨u, v + w⟩ = ⟨u, v⟩ + ⟨u, w⟩ :=
|
||
by rewrite [inner_comm, inner_add_left, inner_comm, inner_comm w]
|
||
|
||
proposition inner_smul_left (r : ℝ) (v w : V) : ⟨r • v, w⟩ = r * ⟨v, w⟩ :=
|
||
inner_product_space.inner_smul_left r v w
|
||
|
||
proposition inner_smul_right (r : ℝ) (v w : V) : ⟨v, r • w⟩ = r * ⟨v, w⟩ :=
|
||
by rewrite [inner_comm, inner_smul_left, inner_comm]
|
||
|
||
proposition inner_self_nonneg (v : V) : ⟨v, v⟩ ≥ 0 := inner_product_space.inner_self_nonneg v
|
||
|
||
proposition eq_zero_of_inner_self_eq_zero {v : V} (H : ⟨v, v⟩ = 0) : v = 0 :=
|
||
inner_product_space.eq_zero_of_inner_self_eq_zero H
|
||
|
||
proposition inner_neg_left (u v : V) : ⟨-u, v⟩ = -⟨u, v⟩ :=
|
||
by rewrite [-neg_one_smul_real, inner_smul_left, -neg_eq_neg_one_mul]
|
||
|
||
proposition inner_neg_right (u v : V) : ⟨u, -v⟩ = -⟨u, v⟩ :=
|
||
by rewrite [inner_comm, inner_neg_left, inner_comm]
|
||
|
||
proposition inner_sub_left (u v w : V) : ⟨u - v, w⟩ = ⟨u, w⟩ - ⟨v, w⟩ :=
|
||
by rewrite [*sub_eq_add_neg, inner_add_left, inner_neg_left]
|
||
|
||
proposition inner_sub_right (u v w : V) : ⟨u, v - w⟩ = ⟨u, v⟩ - ⟨u, w⟩ :=
|
||
by rewrite [*sub_eq_add_neg, inner_add_right, inner_neg_right]
|
||
|
||
proposition inner_zero_left (v : V) : ⟨0, v⟩ = 0 :=
|
||
have (0 : ℝ) • v = 0, from zero_smul v,
|
||
using this, by rewrite [-this, inner_smul_left, zero_mul]
|
||
|
||
proposition inner_zero_right (v : V) : ⟨v, 0⟩ = 0 :=
|
||
by rewrite [inner_comm, inner_zero_left]
|
||
|
||
definition orthogonal (u v : V) : Prop := ⟨u, v⟩ = 0
|
||
|
||
infix ` ⊥ `:50 := orthogonal
|
||
|
||
proposition orthogonal_comm {u v : V} (H : u ⊥ v) : v ⊥ u :=
|
||
by unfold orthogonal at *; rewrite [inner_comm, H]
|
||
|
||
/- first, we define norm internally, to show that an inner product space is a normed space -/
|
||
|
||
private definition ip_norm (v : V) : ℝ := sqrt ⟨v, v⟩
|
||
|
||
private proposition ip_norm_zero : ip_norm (0 : V) = 0 :=
|
||
by rewrite [↑ip_norm, inner_zero_left, sqrt_zero]
|
||
|
||
private proposition ip_norm_squared (v : V) : (ip_norm v)^2 = ⟨v, v⟩ :=
|
||
sqrt_squared (inner_self_nonneg v)
|
||
|
||
private proposition ip_norm_nonneg (v : V) : ip_norm v ≥ 0 := !sqrt_nonneg
|
||
|
||
private proposition eq_zero_of_ip_norm_eq_zero {v : V} (H : ip_norm v = 0) : v = 0 :=
|
||
have ⟨v, v⟩ = 0, by rewrite [-ip_norm_squared, H, pow_two, zero_mul],
|
||
eq_zero_of_inner_self_eq_zero this
|
||
|
||
private proposition ip_norm_smul (r : ℝ) (v : V) : ip_norm (r • v) = abs r * ip_norm v :=
|
||
begin
|
||
rewrite [↑ip_norm, inner_smul_left, inner_smul_right, -mul.assoc],
|
||
rewrite [sqrt_mul (mul_self_nonneg r) (inner_self_nonneg v), -pow_two, sqrt_squared']
|
||
end
|
||
|
||
private proposition ip_norm_pythagorean {u v : V} (ortho : u ⊥ v) :
|
||
(ip_norm (u + v))^2 = (ip_norm u)^2 + (ip_norm v)^2 :=
|
||
by rewrite [↑orthogonal at ortho, *ip_norm_squared, inner_add_right, *inner_add_left,
|
||
inner_comm v u, *ortho, zero_add, add_zero]
|
||
|
||
private definition ip_proj_on (u : V) {v : V} (H : v ≠ 0) : V :=
|
||
(⟨u, v⟩ / (ip_norm v)^2) • v
|
||
|
||
private proposition ip_proj_on_orthogonal (u : V) {v : V} (H : v ≠ 0) :
|
||
ip_proj_on u H ⊥ (u - ip_proj_on u H) :=
|
||
begin
|
||
rewrite [↑ip_proj_on, ↑orthogonal, inner_sub_right, +inner_smul_left, inner_smul_right],
|
||
rewrite [ip_norm_squared at {3}],
|
||
rewrite [div_mul_cancel _ (assume H', H (eq_zero_of_inner_self_eq_zero H'))],
|
||
rewrite [inner_comm v u, sub_self]
|
||
end
|
||
|
||
private proposition ip_norm_proj_on_eq (u : V) {v : V} (H : v ≠ 0) :
|
||
ip_norm (ip_proj_on u H) = abs ⟨u, v⟩ / ip_norm v :=
|
||
have H1 : ip_norm v ≠ 0, from assume H', H (eq_zero_of_ip_norm_eq_zero H'),
|
||
begin+
|
||
rewrite [↑ip_proj_on, ip_norm_smul, abs_div, abs_of_nonneg (squared_nonneg (ip_norm v)), pow_two],
|
||
rewrite [div_mul_eq_mul_div, -div_mul_div, div_self H1, mul_one]
|
||
end
|
||
|
||
private proposition ip_norm_squared_pythagorean (u : V) {v : V} (H : v ≠ 0) :
|
||
(ip_norm u)^2 = (ip_norm (u - ip_proj_on u H))^2 + (ip_norm (ip_proj_on u H))^2 :=
|
||
calc
|
||
(ip_norm u)^2 = (ip_norm (u - ip_proj_on u H + ip_proj_on u H))^2 :
|
||
sub_add_cancel
|
||
... = (ip_norm (u - ip_proj_on u H))^2 + (ip_norm (ip_proj_on u H))^2 :
|
||
ip_norm_pythagorean (orthogonal_comm (ip_proj_on_orthogonal u H))
|
||
|
||
private proposition ip_norm_proj_on_le (u : V) {v : V} (H : v ≠ 0) :
|
||
ip_norm (ip_proj_on u H) ≤ ip_norm u :=
|
||
have (ip_norm u)^2 ≥ (ip_norm (ip_proj_on u H))^2,
|
||
begin
|
||
rewrite [ip_norm_squared_pythagorean u H],
|
||
apply le_add_of_nonneg_left (squared_nonneg (ip_norm (u - ip_proj_on u H)))
|
||
end,
|
||
le_of_squared_le_squared !ip_norm_nonneg this
|
||
|
||
private proposition ip_cauchy_schwartz (u v : V) : abs ⟨u, v⟩ ≤ ip_norm u * ip_norm v :=
|
||
by_cases
|
||
(suppose v = (0 : V),
|
||
begin
|
||
rewrite [this, inner_zero_right, abs_zero, ip_norm_zero, mul_zero],
|
||
exact le.refl (0 : ℝ)
|
||
end)
|
||
(assume vnz : v ≠ 0,
|
||
have ip_norm v ≠ 0, from assume H, vnz (eq_zero_of_ip_norm_eq_zero H),
|
||
have ip_norm v > 0, from lt_of_le_of_ne !sqrt_nonneg (ne.symm this),
|
||
using this, begin
|
||
note H := ip_norm_proj_on_le u vnz,
|
||
rewrite [ip_norm_proj_on_eq u vnz at H],
|
||
exact le_mul_of_div_le this H
|
||
end)
|
||
|
||
private proposition ip_cauchy_schwartz' (u v : V) : ⟨u, v⟩ ≤ ip_norm u * ip_norm v :=
|
||
le.trans !le_abs_self !ip_cauchy_schwartz
|
||
|
||
private proposition ip_norm_triangle (u v : V) : ip_norm (u + v) ≤ ip_norm u + ip_norm v :=
|
||
have H : ⟨u, v⟩ ≤ ip_norm u * ip_norm v, from ip_cauchy_schwartz' u v,
|
||
have (ip_norm (u + v))^2 ≤ (ip_norm u + ip_norm v)^2, from
|
||
calc
|
||
(ip_norm (u + v))^2 = (ip_norm u)^2 + (ip_norm v)^2 + ⟨u, v⟩ + ⟨u, v⟩ :
|
||
by rewrite [↑ip_norm, *sqrt_squared !inner_self_nonneg, inner_add_left,
|
||
*inner_add_right, *inner_comm v u, -add.assoc, -*add.right_comm _ _ ⟨v, v⟩]
|
||
... ≤ (ip_norm u)^2 + (ip_norm v)^2 + ip_norm u * ip_norm v + ⟨u, v⟩ :
|
||
add_le_add_right (add_le_add_left H _) _
|
||
... ≤ (ip_norm u)^2 + (ip_norm v)^2 + ip_norm u * ip_norm v + ip_norm u * ip_norm v :
|
||
add_le_add_left H _
|
||
... = (ip_norm u + ip_norm v)^2 :
|
||
by rewrite [*pow_two, right_distrib, *left_distrib, -add.assoc,
|
||
*add.right_comm _ (ip_norm v * ip_norm v),
|
||
mul.comm (ip_norm v) (ip_norm u)],
|
||
le_of_squared_le_squared (add_nonneg !ip_norm_nonneg !ip_norm_nonneg) this
|
||
|
||
definition inner_product_space.to_normed_space [trans_instance] :
|
||
normed_vector_space V :=
|
||
⦃ normed_vector_space, _inst_1,
|
||
norm := ip_norm,
|
||
norm_zero := ip_norm_zero,
|
||
eq_zero_of_norm_eq_zero := @eq_zero_of_ip_norm_eq_zero V _,
|
||
norm_triangle := ip_norm_triangle,
|
||
norm_smul := ip_norm_smul
|
||
⦄
|
||
|
||
/- now we restate the new theorems using the norm notation -/
|
||
|
||
proposition norm_squared (v : V) : ∥ v ∥^2 = ⟨v, v⟩ := ip_norm_squared v
|
||
|
||
proposition norm_pythagorean {u v : V} (ortho : u ⊥ v) : ∥ u + v ∥^2 = ∥ u ∥^2 + ∥ v ∥^2 :=
|
||
ip_norm_pythagorean ortho
|
||
|
||
definition proj_on (u : V) {v : V} (H : v ≠ 0) : V := (⟨u, v⟩ / ∥ v ∥^2) • v
|
||
|
||
proposition proj_on_orthogonal (u : V) {v : V} (H : v ≠ 0) :
|
||
proj_on u H ⊥ (u - proj_on u H) :=
|
||
ip_proj_on_orthogonal u H
|
||
|
||
proposition norm_proj_on_eq (u : V) {v : V} (H : v ≠ 0) :
|
||
∥ proj_on u H ∥ = abs ⟨u, v⟩ / ∥ v ∥ :=
|
||
ip_norm_proj_on_eq u H
|
||
|
||
proposition norm_squared_pythagorean (u : V) {v : V} (H : v ≠ 0) :
|
||
∥ u ∥^2 = ∥ u - proj_on u H ∥^2 + ∥ proj_on u H ∥^2 :=
|
||
ip_norm_squared_pythagorean u H
|
||
|
||
proposition norm_proj_on_le (u : V) {v : V} (H : v ≠ 0) :
|
||
∥ proj_on u H ∥ ≤ ∥ u ∥ := ip_norm_proj_on_le u H
|
||
|
||
theorem cauchy_schwartz (u v : V) : abs ⟨u, v⟩ ≤ ∥ u ∥ * ∥ v ∥ := ip_cauchy_schwartz u v
|
||
|
||
theorem cauchy_schwartz' (u v : V) : ⟨u, v⟩ ≤ ∥ u ∥ * ∥ v ∥ := ip_cauchy_schwartz' u v
|
||
|
||
theorem eq_proj_on_cauchy_schwartz {u v : V} (H : v ≠ 0) (H₁ : abs ⟨u, v⟩ = ∥ u ∥ * ∥ v ∥) :
|
||
u = proj_on u H :=
|
||
assert ∥ v ∥ ≠ 0, from assume H', H (eq_zero_of_norm_eq_zero H'),
|
||
assert ∥ u ∥ = ∥ proj_on u H ∥, by rewrite [norm_proj_on_eq, H₁, mul_div_cancel _ this],
|
||
have ∥ u - proj_on u H ∥^2 + ∥ u ∥^2 = 0 + ∥ u ∥^2,
|
||
by rewrite [zero_add, norm_squared_pythagorean u H at {2}, this],
|
||
have ∥ u - proj_on u H ∥^2 = 0, from eq_of_add_eq_add_right this,
|
||
show u = proj_on u H,
|
||
from eq_of_sub_eq_zero (eq_zero_of_norm_eq_zero (eq_zero_of_squared_eq_zero this))
|
||
|
||
end analysis
|