src/HOL/Library/Inner_Product.thy
changeset 44282 f0de18b62d63
parent 44233 aa74ce315bae
child 44902 9ba11d41cd1f
equal deleted inserted replaced
44275:d995733b635d 44282:f0de18b62d63
     3 *)
     3 *)
     4 
     4 
     5 header {* Inner Product Spaces and the Gradient Derivative *}
     5 header {* Inner Product Spaces and the Gradient Derivative *}
     6 
     6 
     7 theory Inner_Product
     7 theory Inner_Product
     8 imports Complex_Main FrechetDeriv
     8 imports FrechetDeriv
     9 begin
     9 begin
    10 
    10 
    11 subsection {* Real inner product spaces *}
    11 subsection {* Real inner product spaces *}
    12 
    12 
    13 text {*
    13 text {*
    41   using inner_add_left [of x "- x" y] by simp
    41   using inner_add_left [of x "- x" y] by simp
    42 
    42 
    43 lemma inner_diff_left: "inner (x - y) z = inner x z - inner y z"
    43 lemma inner_diff_left: "inner (x - y) z = inner x z - inner y z"
    44   by (simp add: diff_minus inner_add_left)
    44   by (simp add: diff_minus inner_add_left)
    45 
    45 
       
    46 lemma inner_setsum_left: "inner (\<Sum>x\<in>A. f x) y = (\<Sum>x\<in>A. inner (f x) y)"
       
    47   by (cases "finite A", induct set: finite, simp_all add: inner_add_left)
       
    48 
    46 text {* Transfer distributivity rules to right argument. *}
    49 text {* Transfer distributivity rules to right argument. *}
    47 
    50 
    48 lemma inner_add_right: "inner x (y + z) = inner x y + inner x z"
    51 lemma inner_add_right: "inner x (y + z) = inner x y + inner x z"
    49   using inner_add_left [of y z x] by (simp only: inner_commute)
    52   using inner_add_left [of y z x] by (simp only: inner_commute)
    50 
    53 
    57 lemma inner_minus_right [simp]: "inner x (- y) = - inner x y"
    60 lemma inner_minus_right [simp]: "inner x (- y) = - inner x y"
    58   using inner_minus_left [of y x] by (simp only: inner_commute)
    61   using inner_minus_left [of y x] by (simp only: inner_commute)
    59 
    62 
    60 lemma inner_diff_right: "inner x (y - z) = inner x y - inner x z"
    63 lemma inner_diff_right: "inner x (y - z) = inner x y - inner x z"
    61   using inner_diff_left [of y z x] by (simp only: inner_commute)
    64   using inner_diff_left [of y z x] by (simp only: inner_commute)
       
    65 
       
    66 lemma inner_setsum_right: "inner x (\<Sum>y\<in>A. f y) = (\<Sum>y\<in>A. inner x (f y))"
       
    67   using inner_setsum_left [of f A x] by (simp only: inner_commute)
    62 
    68 
    63 lemmas inner_add [algebra_simps] = inner_add_left inner_add_right
    69 lemmas inner_add [algebra_simps] = inner_add_left inner_add_right
    64 lemmas inner_diff [algebra_simps]  = inner_diff_left inner_diff_right
    70 lemmas inner_diff [algebra_simps]  = inner_diff_left inner_diff_right
    65 lemmas inner_scaleR = inner_scaleR_left inner_scaleR_right
    71 lemmas inner_scaleR = inner_scaleR_left inner_scaleR_right
    66 
    72 
   146   (@{const_name dist}, SOME @{typ "'a::metric_space \<Rightarrow> 'a \<Rightarrow> real"}) *}
   152   (@{const_name dist}, SOME @{typ "'a::metric_space \<Rightarrow> 'a \<Rightarrow> real"}) *}
   147 
   153 
   148 setup {* Sign.add_const_constraint
   154 setup {* Sign.add_const_constraint
   149   (@{const_name norm}, SOME @{typ "'a::real_normed_vector \<Rightarrow> real"}) *}
   155   (@{const_name norm}, SOME @{typ "'a::real_normed_vector \<Rightarrow> real"}) *}
   150 
   156 
   151 interpretation inner:
   157 lemma bounded_bilinear_inner:
   152   bounded_bilinear "inner::'a::real_inner \<Rightarrow> 'a \<Rightarrow> real"
   158   "bounded_bilinear (inner::'a::real_inner \<Rightarrow> 'a \<Rightarrow> real)"
   153 proof
   159 proof
   154   fix x y z :: 'a and r :: real
   160   fix x y z :: 'a and r :: real
   155   show "inner (x + y) z = inner x z + inner y z"
   161   show "inner (x + y) z = inner x z + inner y z"
   156     by (rule inner_add_left)
   162     by (rule inner_add_left)
   157   show "inner x (y + z) = inner x y + inner x z"
   163   show "inner x (y + z) = inner x y + inner x z"
   165     show "\<forall>x y::'a. norm (inner x y) \<le> norm x * norm y * 1"
   171     show "\<forall>x y::'a. norm (inner x y) \<le> norm x * norm y * 1"
   166       by (simp add: Cauchy_Schwarz_ineq2)
   172       by (simp add: Cauchy_Schwarz_ineq2)
   167   qed
   173   qed
   168 qed
   174 qed
   169 
   175 
   170 interpretation inner_left:
   176 lemmas tendsto_inner [tendsto_intros] =
   171   bounded_linear "\<lambda>x::'a::real_inner. inner x y"
   177   bounded_bilinear.tendsto [OF bounded_bilinear_inner]
   172   by (rule inner.bounded_linear_left)
   178 
   173 
   179 lemmas isCont_inner [simp] =
   174 interpretation inner_right:
   180   bounded_bilinear.isCont [OF bounded_bilinear_inner]
   175   bounded_linear "\<lambda>y::'a::real_inner. inner x y"
   181 
   176   by (rule inner.bounded_linear_right)
   182 lemmas FDERIV_inner =
   177 
   183   bounded_bilinear.FDERIV [OF bounded_bilinear_inner]
   178 declare inner.isCont [simp]
   184 
       
   185 lemmas bounded_linear_inner_left =
       
   186   bounded_bilinear.bounded_linear_left [OF bounded_bilinear_inner]
       
   187 
       
   188 lemmas bounded_linear_inner_right =
       
   189   bounded_bilinear.bounded_linear_right [OF bounded_bilinear_inner]
   179 
   190 
   180 
   191 
   181 subsection {* Class instances *}
   192 subsection {* Class instances *}
   182 
   193 
   183 instantiation real :: real_inner
   194 instantiation real :: real_inner
   258 
   269 
   259 lemma GDERIV_subst: "\<lbrakk>GDERIV f x :> df; df = d\<rbrakk> \<Longrightarrow> GDERIV f x :> d"
   270 lemma GDERIV_subst: "\<lbrakk>GDERIV f x :> df; df = d\<rbrakk> \<Longrightarrow> GDERIV f x :> d"
   260   by simp
   271   by simp
   261 
   272 
   262 lemma GDERIV_const: "GDERIV (\<lambda>x. k) x :> 0"
   273 lemma GDERIV_const: "GDERIV (\<lambda>x. k) x :> 0"
   263   unfolding gderiv_def inner_right.zero by (rule FDERIV_const)
   274   unfolding gderiv_def inner_zero_right by (rule FDERIV_const)
   264 
   275 
   265 lemma GDERIV_add:
   276 lemma GDERIV_add:
   266     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   277     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   267      \<Longrightarrow> GDERIV (\<lambda>x. f x + g x) x :> df + dg"
   278      \<Longrightarrow> GDERIV (\<lambda>x. f x + g x) x :> df + dg"
   268   unfolding gderiv_def inner_right.add by (rule FDERIV_add)
   279   unfolding gderiv_def inner_add_right by (rule FDERIV_add)
   269 
   280 
   270 lemma GDERIV_minus:
   281 lemma GDERIV_minus:
   271     "GDERIV f x :> df \<Longrightarrow> GDERIV (\<lambda>x. - f x) x :> - df"
   282     "GDERIV f x :> df \<Longrightarrow> GDERIV (\<lambda>x. - f x) x :> - df"
   272   unfolding gderiv_def inner_right.minus by (rule FDERIV_minus)
   283   unfolding gderiv_def inner_minus_right by (rule FDERIV_minus)
   273 
   284 
   274 lemma GDERIV_diff:
   285 lemma GDERIV_diff:
   275     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   286     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   276      \<Longrightarrow> GDERIV (\<lambda>x. f x - g x) x :> df - dg"
   287      \<Longrightarrow> GDERIV (\<lambda>x. f x - g x) x :> df - dg"
   277   unfolding gderiv_def inner_right.diff by (rule FDERIV_diff)
   288   unfolding gderiv_def inner_diff_right by (rule FDERIV_diff)
   278 
   289 
   279 lemma GDERIV_scaleR:
   290 lemma GDERIV_scaleR:
   280     "\<lbrakk>DERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   291     "\<lbrakk>DERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   281      \<Longrightarrow> GDERIV (\<lambda>x. scaleR (f x) (g x)) x
   292      \<Longrightarrow> GDERIV (\<lambda>x. scaleR (f x) (g x)) x
   282       :> (scaleR (f x) dg + scaleR df (g x))"
   293       :> (scaleR (f x) dg + scaleR df (g x))"
   283   unfolding gderiv_def deriv_fderiv inner_right.add inner_right.scaleR
   294   unfolding gderiv_def deriv_fderiv inner_add_right inner_scaleR_right
   284   apply (rule FDERIV_subst)
   295   apply (rule FDERIV_subst)
   285   apply (erule (1) scaleR.FDERIV)
   296   apply (erule (1) FDERIV_scaleR)
   286   apply (simp add: mult_ac)
   297   apply (simp add: mult_ac)
   287   done
   298   done
   288 
   299 
   289 lemma GDERIV_mult:
   300 lemma GDERIV_mult:
   290     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   301     "\<lbrakk>GDERIV f x :> df; GDERIV g x :> dg\<rbrakk>
   304 
   315 
   305 lemma GDERIV_norm:
   316 lemma GDERIV_norm:
   306   assumes "x \<noteq> 0" shows "GDERIV (\<lambda>x. norm x) x :> sgn x"
   317   assumes "x \<noteq> 0" shows "GDERIV (\<lambda>x. norm x) x :> sgn x"
   307 proof -
   318 proof -
   308   have 1: "FDERIV (\<lambda>x. inner x x) x :> (\<lambda>h. inner x h + inner h x)"
   319   have 1: "FDERIV (\<lambda>x. inner x x) x :> (\<lambda>h. inner x h + inner h x)"
   309     by (intro inner.FDERIV FDERIV_ident)
   320     by (intro FDERIV_inner FDERIV_ident)
   310   have 2: "(\<lambda>h. inner x h + inner h x) = (\<lambda>h. inner h (scaleR 2 x))"
   321   have 2: "(\<lambda>h. inner x h + inner h x) = (\<lambda>h. inner h (scaleR 2 x))"
   311     by (simp add: fun_eq_iff inner_commute)
   322     by (simp add: fun_eq_iff inner_commute)
   312   have "0 < inner x x" using `x \<noteq> 0` by simp
   323   have "0 < inner x x" using `x \<noteq> 0` by simp
   313   then have 3: "DERIV sqrt (inner x x) :> (inverse (sqrt (inner x x)) / 2)"
   324   then have 3: "DERIV sqrt (inner x x) :> (inverse (sqrt (inner x x)) / 2)"
   314     by (rule DERIV_real_sqrt)
   325     by (rule DERIV_real_sqrt)