(* Title: HOL/Multivariate_Analysis/Linear_Algebra.thy
Author: Amine Chaieb, University of Cambridge
*)
header {* Elementary linear algebra on Euclidean spaces *}
theory Linear_Algebra
imports
Euclidean_Space
"~~/src/HOL/Library/Infinite_Set"
begin
lemma cond_application_beta: "(if b then f else g) x = (if b then f x else g x)"
by auto
notation inner (infix "\<bullet>" 70)
lemma square_bound_lemma:
fixes x :: real
shows "x < (1 + x) * (1 + x)"
proof -
have "(x + 1/2)\<^sup>2 + 3/4 > 0"
using zero_le_power2[of "x+1/2"] by arith
then show ?thesis
by (simp add: field_simps power2_eq_square)
qed
lemma square_continuous:
fixes e :: real
shows "e > 0 \<Longrightarrow> \<exists>d. 0 < d \<and> (\<forall>y. abs (y - x) < d \<longrightarrow> abs (y * y - x * x) < e)"
using isCont_power[OF isCont_ident, of x, unfolded isCont_def LIM_eq, rule_format, of e 2]
apply (auto simp add: power2_eq_square)
apply (rule_tac x="s" in exI)
apply auto
apply (erule_tac x=y in allE)
apply auto
done
text{* Hence derive more interesting properties of the norm. *}
lemma norm_eq_0_dot: "norm x = 0 \<longleftrightarrow> x \<bullet> x = (0::real)"
by simp (* TODO: delete *)
lemma norm_triangle_sub:
fixes x y :: "'a::real_normed_vector"
shows "norm x \<le> norm y + norm (x - y)"
using norm_triangle_ineq[of "y" "x - y"] by (simp add: field_simps)
lemma norm_le: "norm x \<le> norm y \<longleftrightarrow> x \<bullet> x \<le> y \<bullet> y"
by (simp add: norm_eq_sqrt_inner)
lemma norm_lt: "norm x < norm y \<longleftrightarrow> x \<bullet> x < y \<bullet> y"
by (simp add: norm_eq_sqrt_inner)
lemma norm_eq: "norm x = norm y \<longleftrightarrow> x \<bullet> x = y \<bullet> y"
apply (subst order_eq_iff)
apply (auto simp: norm_le)
done
lemma norm_eq_1: "norm x = 1 \<longleftrightarrow> x \<bullet> x = 1"
by (simp add: norm_eq_sqrt_inner)
text{* Squaring equations and inequalities involving norms. *}
lemma dot_square_norm: "x \<bullet> x = (norm x)\<^sup>2"
by (simp only: power2_norm_eq_inner) (* TODO: move? *)
lemma norm_eq_square: "norm x = a \<longleftrightarrow> 0 \<le> a \<and> x \<bullet> x = a\<^sup>2"
by (auto simp add: norm_eq_sqrt_inner)
lemma real_abs_le_square_iff: "\<bar>x\<bar> \<le> \<bar>y\<bar> \<longleftrightarrow> (x::real)\<^sup>2 \<le> y\<^sup>2"
proof
assume "\<bar>x\<bar> \<le> \<bar>y\<bar>"
then have "\<bar>x\<bar>\<^sup>2 \<le> \<bar>y\<bar>\<^sup>2" by (rule power_mono, simp)
then show "x\<^sup>2 \<le> y\<^sup>2" by simp
next
assume "x\<^sup>2 \<le> y\<^sup>2"
then have "sqrt (x\<^sup>2) \<le> sqrt (y\<^sup>2)" by (rule real_sqrt_le_mono)
then show "\<bar>x\<bar> \<le> \<bar>y\<bar>" by simp
qed
lemma norm_le_square: "norm x \<le> a \<longleftrightarrow> 0 \<le> a \<and> x \<bullet> x \<le> a\<^sup>2"
apply (simp add: dot_square_norm real_abs_le_square_iff[symmetric])
using norm_ge_zero[of x]
apply arith
done
lemma norm_ge_square: "norm x \<ge> a \<longleftrightarrow> a \<le> 0 \<or> x \<bullet> x \<ge> a\<^sup>2"
apply (simp add: dot_square_norm real_abs_le_square_iff[symmetric])
using norm_ge_zero[of x]
apply arith
done
lemma norm_lt_square: "norm x < a \<longleftrightarrow> 0 < a \<and> x \<bullet> x < a\<^sup>2"
by (metis not_le norm_ge_square)
lemma norm_gt_square: "norm x > a \<longleftrightarrow> a < 0 \<or> x \<bullet> x > a\<^sup>2"
by (metis norm_le_square not_less)
text{* Dot product in terms of the norm rather than conversely. *}
lemmas inner_simps = inner_add_left inner_add_right inner_diff_right inner_diff_left
inner_scaleR_left inner_scaleR_right
lemma dot_norm: "x \<bullet> y = ((norm (x + y))\<^sup>2 - (norm x)\<^sup>2 - (norm y)\<^sup>2) / 2"
unfolding power2_norm_eq_inner inner_simps inner_commute by auto
lemma dot_norm_neg: "x \<bullet> y = (((norm x)\<^sup>2 + (norm y)\<^sup>2) - (norm (x - y))\<^sup>2) / 2"
unfolding power2_norm_eq_inner inner_simps inner_commute
by (auto simp add: algebra_simps)
text{* Equality of vectors in terms of @{term "op \<bullet>"} products. *}
lemma vector_eq: "x = y \<longleftrightarrow> x \<bullet> x = x \<bullet> y \<and> y \<bullet> y = x \<bullet> x"
(is "?lhs \<longleftrightarrow> ?rhs")
proof
assume ?lhs
then show ?rhs by simp
next
assume ?rhs
then have "x \<bullet> x - x \<bullet> y = 0 \<and> x \<bullet> y - y \<bullet> y = 0"
by simp
then have "x \<bullet> (x - y) = 0 \<and> y \<bullet> (x - y) = 0"
by (simp add: inner_diff inner_commute)
then have "(x - y) \<bullet> (x - y) = 0"
by (simp add: field_simps inner_diff inner_commute)
then show "x = y" by simp
qed
lemma norm_triangle_half_r:
"norm (y - x1) < e / 2 \<Longrightarrow> norm (y - x2) < e / 2 \<Longrightarrow> norm (x1 - x2) < e"
using dist_triangle_half_r unfolding dist_norm[symmetric] by auto
lemma norm_triangle_half_l: