src/HOL/Analysis/Cartesian_Euclidean_Space.thy
changeset 68050 7eacc812ad1c
parent 68045 ce8ad77cd3fa
child 68054 ebd179b82e20
equal deleted inserted replaced
68045:ce8ad77cd3fa 68050:7eacc812ad1c
   298 lemma box_vec_eq_empty [simp]:
   298 lemma box_vec_eq_empty [simp]:
   299   shows "cbox (vec a) (vec b) = {} \<longleftrightarrow> cbox a b = {}"
   299   shows "cbox (vec a) (vec b) = {} \<longleftrightarrow> cbox a b = {}"
   300         "box (vec a) (vec b) = {} \<longleftrightarrow> box a b = {}"
   300         "box (vec a) (vec b) = {} \<longleftrightarrow> box a b = {}"
   301   by (auto simp: Basis_vec_def mem_box box_eq_empty inner_axis)
   301   by (auto simp: Basis_vec_def mem_box box_eq_empty inner_axis)
   302 
   302 
   303 lemma norm_eq_0_imp: "norm x = 0 ==> x = (0::real ^'n)" by (metis norm_eq_zero)
       
   304 
       
   305 lemma norm_axis_1 [simp]: "norm (axis m (1::real)) = 1"
   303 lemma norm_axis_1 [simp]: "norm (axis m (1::real)) = 1"
   306   by (simp add: inner_axis' norm_eq_1)
   304   by (simp add: inner_axis' norm_eq_1)
   307 
   305 
   308 lemma vector_mul_eq_0[simp]: "(a *s x = 0) \<longleftrightarrow> a = (0::'a::idom) \<or> x = 0"
   306 lemma vector_mul_eq_0[simp]: "(a *s x = 0) \<longleftrightarrow> a = (0::'a::idom) \<or> x = 0"
   309   by vector
   307   by vector
   311 lemma vector_mul_lcancel[simp]: "a *s x = a *s y \<longleftrightarrow> a = (0::real) \<or> x = y"
   309 lemma vector_mul_lcancel[simp]: "a *s x = a *s y \<longleftrightarrow> a = (0::real) \<or> x = y"
   312   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib)
   310   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_ssub_ldistrib)
   313 
   311 
   314 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::real) = b \<or> x = 0"
   312 lemma vector_mul_rcancel[simp]: "a *s x = b *s x \<longleftrightarrow> (a::real) = b \<or> x = 0"
   315   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib)
   313   by (metis eq_iff_diff_eq_0 vector_mul_eq_0 vector_sub_rdistrib)
   316 
       
   317 lemma vector_mul_lcancel_imp: "a \<noteq> (0::real) ==>  a *s x = a *s y ==> (x = y)"
       
   318   by (metis vector_mul_lcancel)
       
   319 
       
   320 lemma vector_mul_rcancel_imp: "x \<noteq> 0 \<Longrightarrow> (a::real) *s x = b *s x ==> a = b"
       
   321   by (metis vector_mul_rcancel)
       
   322 
   314 
   323 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x"
   315 lemma component_le_norm_cart: "\<bar>x$i\<bar> \<le> norm x"
   324   apply (simp add: norm_vec_def)
   316   apply (simp add: norm_vec_def)
   325   apply (rule member_le_L2_set, simp_all)
   317   apply (rule member_le_L2_set, simp_all)
   326   done
   318   done
   602   apply (erule_tac x="i" in allE)
   594   apply (erule_tac x="i" in allE)
   603   apply (auto simp add: if_distrib cond_application_beta axis_def
   595   apply (auto simp add: if_distrib cond_application_beta axis_def
   604     sum.delta[OF finite] cong del: if_weak_cong)
   596     sum.delta[OF finite] cong del: if_weak_cong)
   605   done
   597   done
   606 
   598 
   607 lemma matrix_vector_mul_component: "((A::real^_^_) *v x)$k = (A$k) \<bullet> x"
   599 lemma matrix_vector_mul_component: "(A *v x)$k = (A$k) \<bullet> x"
   608   by (simp add: matrix_vector_mult_def inner_vec_def)
   600   by (simp add: matrix_vector_mult_def inner_vec_def)
   609 
   601 
   610 lemma dot_lmul_matrix: "((x::real ^_) v* A) \<bullet> y = x \<bullet> (A *v y)"
   602 lemma dot_lmul_matrix: "((x::real ^_) v* A) \<bullet> y = x \<bullet> (A *v y)"
   611   apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps)
   603   apply (simp add: inner_vec_def matrix_vector_mult_def vector_matrix_mult_def sum_distrib_right sum_distrib_left ac_simps)
   612   apply (subst sum.swap)
   604   apply (subst sum.swap)
   641 
   633 
   642 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B"
   634 lemma transpose_iff [iff]: "transpose A = transpose B \<longleftrightarrow> A = B"
   643   by (metis transpose_transpose)
   635   by (metis transpose_transpose)
   644 
   636 
   645 lemma matrix_mult_transpose_dot_column:
   637 lemma matrix_mult_transpose_dot_column:
   646   fixes A :: "real^'n^'n"
       
   647   shows "transpose A ** A = (\<chi> i j. (column i A) \<bullet> (column j A))"
   638   shows "transpose A ** A = (\<chi> i j. (column i A) \<bullet> (column j A))"
   648   by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def column_def inner_vec_def)
   639   by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def column_def inner_vec_def)
   649 
   640 
   650 lemma matrix_mult_transpose_dot_row:
   641 lemma matrix_mult_transpose_dot_row:
   651   fixes A :: "real^'n^'n"
       
   652   shows "A ** transpose A = (\<chi> i j. (row i A) \<bullet> (row j A))"
   642   shows "A ** transpose A = (\<chi> i j. (row i A) \<bullet> (row j A))"
   653   by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def row_def inner_vec_def)
   643   by (simp add: matrix_matrix_mult_def vec_eq_iff transpose_def row_def inner_vec_def)
   654 
   644 
   655 text\<open>Two sometimes fruitful ways of looking at matrix-vector multiplication.\<close>
   645 text\<open>Two sometimes fruitful ways of looking at matrix-vector multiplication.\<close>
   656 
   646 
   702   by (simp add: mat_def matrix_def axis_def)
   692   by (simp add: mat_def matrix_def axis_def)
   703 
   693 
   704 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r"
   694 lemma matrix_scaleR: "(matrix (( *\<^sub>R) r)) = mat r"
   705   by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong)
   695   by (simp add: mat_def matrix_def axis_def if_distrib cong: if_cong)
   706 
   696 
   707 lemma matrix_vector_mul_linear: "linear(\<lambda>x. A *v (x::real ^ _))"
   697 lemma matrix_vector_mul_linear: "linear(\<lambda>x. A *v (x::('a::real_algebra_1) ^ _))"
   708   by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff
   698   by (simp add: linear_iff matrix_vector_mult_def vec_eq_iff field_simps sum.distrib scaleR_right.sum)
   709       field_simps sum_distrib_left sum.distrib)
       
   710 
   699 
   711 lemma
   700 lemma
   712   fixes A :: "real^'n^'m"
   701   fixes A :: "'a::{euclidean_space,real_algebra_1}^'n^'m"
   713   shows matrix_vector_mult_linear_continuous_at [continuous_intros]: "isCont (( *v) A) z"
   702   shows matrix_vector_mult_linear_continuous_at [continuous_intros]: "isCont (( *v) A) z"
   714     and matrix_vector_mult_linear_continuous_on [continuous_intros]: "continuous_on S (( *v) A)"
   703     and matrix_vector_mult_linear_continuous_on [continuous_intros]: "continuous_on S (( *v) A)"
   715   by (simp_all add: linear_linear linear_continuous_at linear_continuous_on matrix_vector_mul_linear)
   704   by (simp_all add: linear_linear linear_continuous_at linear_continuous_on matrix_vector_mul_linear)
   716 
   705 
   717 lemma vector_matrix_left_distrib [algebra_simps]:
   706 lemma vector_matrix_left_distrib [algebra_simps]:
   793   assumes "invertible A"
   782   assumes "invertible A"
   794   shows "inj (( *v) A)"
   783   shows "inj (( *v) A)"
   795   by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid)
   784   by (metis assms inj_on_inverseI invertible_def matrix_vector_mul_assoc matrix_vector_mul_lid)
   796 
   785 
   797 lemma scalar_invertible:
   786 lemma scalar_invertible:
   798   fixes A :: "real^'m^'n"
   787   fixes A :: "('a::real_algebra_1)^'m^'n"
   799   assumes "k \<noteq> 0" and "invertible A"
   788   assumes "k \<noteq> 0" and "invertible A"
   800   shows "invertible (k *\<^sub>R A)"
   789   shows "invertible (k *\<^sub>R A)"
   801 proof -
   790 proof -
   802   obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1"
   791   obtain A' where "A ** A' = mat 1" and "A' ** A = mat 1"
   803     using assms unfolding invertible_def by auto
   792     using assms unfolding invertible_def by auto
   807   thus "invertible (k *\<^sub>R A)"
   796   thus "invertible (k *\<^sub>R A)"
   808     unfolding invertible_def by auto
   797     unfolding invertible_def by auto
   809 qed
   798 qed
   810 
   799 
   811 lemma scalar_invertible_iff:
   800 lemma scalar_invertible_iff:
   812   fixes A :: "real^'m^'n"
   801   fixes A :: "('a::real_algebra_1)^'m^'n"
   813   assumes "k \<noteq> 0" and "invertible A"
   802   assumes "k \<noteq> 0" and "invertible A"
   814   shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A"
   803   shows "invertible (k *\<^sub>R A) \<longleftrightarrow> k \<noteq> 0 \<and> invertible A"
   815   by (simp add: assms scalar_invertible)
   804   by (simp add: assms scalar_invertible)
   816 
   805 
   817 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x"
   806 lemma vector_transpose_matrix [simp]: "x v* transpose A = A *v x"