src/HOL/Deriv.thy
author wenzelm
Tue, 19 Jul 2016 09:55:03 +0200
changeset 63520 2803d2b8f85d
parent 63469 b6900858dcb9
child 63558 0aa33085c8b1
permissions -rw-r--r--
Linux platform base-line is Ubuntu 12.04 LTS;
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     1
(*  Title       : Deriv.thy
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     2
    Author      : Jacques D. Fleuriot
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     3
    Copyright   : 1998  University of Cambridge
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
     4
    Author      : Brian Huffman
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     5
    Conversion to Isar and new proofs by Lawrence C Paulson, 2004
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     6
    GMVT by Benjamin Porter, 2005
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     7
*)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
     8
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
     9
section\<open>Differentiation\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    10
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    11
theory Deriv
51526
155263089e7b move SEQ.thy and Lim.thy to Limits.thy
hoelzl
parents: 51481
diff changeset
    12
imports Limits
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    13
begin
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
    14
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    15
subsection \<open>Frechet derivative\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    16
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    17
definition
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    18
  has_derivative :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> ('a \<Rightarrow> 'b) \<Rightarrow> 'a filter \<Rightarrow>  bool"
56182
528fae0816ea update syntax of has_*derivative to infix 50; fixed proofs
hoelzl
parents: 56181
diff changeset
    19
  (infix "(has'_derivative)" 50)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    20
where
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    21
  "(f has_derivative f') F \<longleftrightarrow>
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    22
    (bounded_linear f' \<and>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
    23
     ((\<lambda>y. ((f y - f (Lim F (\<lambda>x. x))) - f' (y - Lim F (\<lambda>x. x))) /\<^sub>R norm (y - Lim F (\<lambda>x. x))) \<longlongrightarrow> 0) F)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    24
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    25
text \<open>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    26
  Usually the filter @{term F} is @{term "at x within s"}.  @{term "(f has_derivative D)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    27
  (at x within s)"} means: @{term D} is the derivative of function @{term f} at point @{term x}
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    28
  within the set @{term s}. Where @{term s} is used to express left or right sided derivatives. In
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    29
  most cases @{term s} is either a variable or @{term UNIV}.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    30
\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    31
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    32
lemma has_derivative_eq_rhs: "(f has_derivative f') F \<Longrightarrow> f' = g' \<Longrightarrow> (f has_derivative g') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    33
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    34
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    35
definition 
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    36
  has_field_derivative :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a filter \<Rightarrow> bool"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    37
  (infix "(has'_field'_derivative)" 50)
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    38
where
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    39
  "(f has_field_derivative D) F \<longleftrightarrow> (f has_derivative op * D) F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    40
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    41
lemma DERIV_cong: "(f has_field_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_field_derivative Y) F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    42
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    43
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    44
definition
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    45
  has_vector_derivative :: "(real \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'b \<Rightarrow> real filter \<Rightarrow> bool"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    46
  (infix "has'_vector'_derivative" 50)
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    47
where
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    48
  "(f has_vector_derivative f') net \<longleftrightarrow> (f has_derivative (\<lambda>x. x *\<^sub>R f')) net"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    49
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    50
lemma has_vector_derivative_eq_rhs: "(f has_vector_derivative X) F \<Longrightarrow> X = Y \<Longrightarrow> (f has_vector_derivative Y) F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    51
  by simp
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    52
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    53
named_theorems derivative_intros "structural introduction rules for derivatives"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    54
setup \<open>
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    55
  let
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    56
    val eq_thms = @{thms has_derivative_eq_rhs DERIV_cong has_vector_derivative_eq_rhs}
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    57
    fun eq_rule thm = get_first (try (fn eq_thm => eq_thm OF [thm])) eq_thms
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    58
  in
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    59
    Global_Theory.add_thms_dynamic
57953
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    60
      (@{binding derivative_eq_intros},
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    61
        fn context =>
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    62
          Named_Theorems.get (Context.proof_of context) @{named_theorems derivative_intros}
69728243a614 updated to named_theorems;
wenzelm
parents: 57514
diff changeset
    63
          |> map_filter eq_rule)
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    64
  end;
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    65
\<close>
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    66
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    67
text \<open>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    68
  The following syntax is only used as a legacy syntax.
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
    69
\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    70
abbreviation (input)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    71
  FDERIV :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a \<Rightarrow>  ('a \<Rightarrow> 'b) \<Rightarrow> bool"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    72
  ("(FDERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    73
where
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    74
  "FDERIV f x :> f' \<equiv> (f has_derivative f') (at x)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    75
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    76
lemma has_derivative_bounded_linear: "(f has_derivative f') F \<Longrightarrow> bounded_linear f'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    77
  by (simp add: has_derivative_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    78
56369
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    79
lemma has_derivative_linear: "(f has_derivative f') F \<Longrightarrow> linear f'"
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    80
  using bounded_linear.linear[OF has_derivative_bounded_linear] .
2704ca85be98 moved generic theorems from Complex_Analysis_Basic; fixed some theorem names
hoelzl
parents: 56289
diff changeset
    81
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    82
lemma has_derivative_ident[derivative_intros, simp]: "((\<lambda>x. x) has_derivative (\<lambda>x. x)) F"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
    83
  by (simp add: has_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    84
63469
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    85
lemma has_derivative_id [derivative_intros, simp]: "(id has_derivative id) (at a)"
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    86
  by (metis eq_id_iff has_derivative_ident)
b6900858dcb9 lots of new theorems about differentiable_on, retracts, ANRs, etc.
paulson <lp15@cam.ac.uk>
parents: 63299
diff changeset
    87
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
    88
lemma has_derivative_const[derivative_intros, simp]: "((\<lambda>x. c) has_derivative (\<lambda>x. 0)) F"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
    89
  by (simp add: has_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    90
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    91
lemma (in bounded_linear) bounded_linear: "bounded_linear f" ..
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    92
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
    93
lemma (in bounded_linear) has_derivative:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    94
  "(g has_derivative g') F \<Longrightarrow> ((\<lambda>x. f (g x)) has_derivative (\<lambda>x. f (g' x))) F"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
    95
  unfolding has_derivative_def
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
    96
  apply safe
56219
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
    97
  apply (erule bounded_linear_compose [OF bounded_linear])
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
    98
  apply (drule tendsto)
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
    99
  apply (simp add: scaleR diff add zero)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   100
  done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   101
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   102
lemmas has_derivative_scaleR_right [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   103
  bounded_linear.has_derivative [OF bounded_linear_scaleR_right]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   104
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   105
lemmas has_derivative_scaleR_left [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   106
  bounded_linear.has_derivative [OF bounded_linear_scaleR_left]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   107
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   108
lemmas has_derivative_mult_right [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   109
  bounded_linear.has_derivative [OF bounded_linear_mult_right]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   110
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   111
lemmas has_derivative_mult_left [derivative_intros] =
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   112
  bounded_linear.has_derivative [OF bounded_linear_mult_left]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   113
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   114
lemma has_derivative_add[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   115
  assumes f: "(f has_derivative f') F" and g: "(g has_derivative g') F"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   116
  shows "((\<lambda>x. f x + g x) has_derivative (\<lambda>x. f' x + g' x)) F"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   117
  unfolding has_derivative_def
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   118
proof safe
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   119
  let ?x = "Lim F (\<lambda>x. x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   120
  let ?D = "\<lambda>f f' y. ((f y - f ?x) - f' (y - ?x)) /\<^sub>R norm (y - ?x)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   121
  have "((\<lambda>x. ?D f f' x + ?D g g' x) \<longlongrightarrow> (0 + 0)) F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   122
    using f g by (intro tendsto_add) (auto simp: has_derivative_def)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   123
  then show "(?D (\<lambda>x. f x + g x) (\<lambda>x. f' x + g' x) \<longlongrightarrow> 0) F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   124
    by (simp add: field_simps scaleR_add_right scaleR_diff_right)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   125
qed (blast intro: bounded_linear_add f g has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   126
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   127
lemma has_derivative_setsum[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   128
  assumes f: "\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) F"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   129
  shows "((\<lambda>x. \<Sum>i\<in>I. f i x) has_derivative (\<lambda>x. \<Sum>i\<in>I. f' i x)) F"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   130
proof cases
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   131
  assume "finite I" from this f show ?thesis
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   132
    by induct (simp_all add: f)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   133
qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   134
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   135
lemma has_derivative_minus[simp, derivative_intros]: "(f has_derivative f') F \<Longrightarrow> ((\<lambda>x. - f x) has_derivative (\<lambda>x. - f' x)) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   136
  using has_derivative_scaleR_right[of f f' F "-1"] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   137
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   138
lemma has_derivative_diff[simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   139
  "(f has_derivative f') F \<Longrightarrow> (g has_derivative g') F \<Longrightarrow> ((\<lambda>x. f x - g x) has_derivative (\<lambda>x. f' x - g' x)) F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   140
  by (simp only: diff_conv_add_uminus has_derivative_add has_derivative_minus)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   141
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   142
lemma has_derivative_at_within:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   143
  "(f has_derivative f') (at x within s) \<longleftrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   144
    (bounded_linear f' \<and> ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) \<longlongrightarrow> 0) (at x within s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   145
  by (cases "at x within s = bot") (simp_all add: has_derivative_def Lim_ident_at)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   146
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   147
lemma has_derivative_iff_norm:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   148
  "(f has_derivative f') (at x within s) \<longleftrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   149
    (bounded_linear f' \<and> ((\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   150
  using tendsto_norm_zero_iff[of _ "at x within s", where 'b="'b", symmetric]
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   151
  by (simp add: has_derivative_at_within divide_inverse ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   152
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   153
lemma has_derivative_at:
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   154
  "(f has_derivative D) (at x) \<longleftrightarrow> (bounded_linear D \<and> (\<lambda>h. norm (f (x + h) - f x - D h) / norm h) \<midarrow>0\<rightarrow> 0)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   155
  unfolding has_derivative_iff_norm LIM_offset_zero_iff[of _ _ x] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   156
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   157
lemma field_has_derivative_at:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   158
  fixes x :: "'a::real_normed_field"
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   159
  shows "(f has_derivative op * D) (at x) \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   160
  apply (unfold has_derivative_at)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   161
  apply (simp add: bounded_linear_mult_right)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   162
  apply (simp cong: LIM_cong add: nonzero_norm_divide [symmetric])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   163
  apply (subst diff_divide_distrib)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   164
  apply (subst times_divide_eq_left [symmetric])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   165
  apply (simp cong: LIM_cong)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   166
  apply (simp add: tendsto_norm_zero_iff LIM_zero_iff)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   167
  done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   168
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   169
lemma has_derivativeI:
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   170
  "bounded_linear f' \<Longrightarrow> ((\<lambda>y. ((f y - f x) - f' (y - x)) /\<^sub>R norm (y - x)) \<longlongrightarrow> 0) (at x within s) \<Longrightarrow>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   171
  (f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   172
  by (simp add: has_derivative_at_within)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   173
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   174
lemma has_derivativeI_sandwich:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   175
  assumes e: "0 < e" and bounded: "bounded_linear f'"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   176
    and sandwich: "(\<And>y. y \<in> s \<Longrightarrow> y \<noteq> x \<Longrightarrow> dist y x < e \<Longrightarrow> norm ((f y - f x) - f' (y - x)) / norm (y - x) \<le> H y)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   177
    and "(H \<longlongrightarrow> 0) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   178
  shows "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   179
  unfolding has_derivative_iff_norm
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   180
proof safe
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   181
  show "((\<lambda>y. norm (f y - f x - f' (y - x)) / norm (y - x)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   182
  proof (rule tendsto_sandwich[where f="\<lambda>x. 0"])
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   183
    show "(H \<longlongrightarrow> 0) (at x within s)" by fact
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   184
    show "eventually (\<lambda>n. norm (f n - f x - f' (n - x)) / norm (n - x) \<le> H n) (at x within s)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   185
      unfolding eventually_at using e sandwich by auto
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
   186
  qed (auto simp: le_divide_eq)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   187
qed fact
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   188
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   189
lemma has_derivative_subset: "(f has_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> (f has_derivative f') (at x within t)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   190
  by (auto simp add: has_derivative_iff_norm intro: tendsto_within_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   191
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   192
lemmas has_derivative_within_subset = has_derivative_subset 
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   193
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   194
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   195
subsection \<open>Continuity\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   196
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   197
lemma has_derivative_continuous:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   198
  assumes f: "(f has_derivative f') (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   199
  shows "continuous (at x within s) f"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   200
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   201
  from f interpret F: bounded_linear f' by (rule has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   202
  note F.tendsto[tendsto_intros]
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   203
  let ?L = "\<lambda>f. (f \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   204
  have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x))"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   205
    using f unfolding has_derivative_iff_norm by blast
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   206
  then have "?L (\<lambda>y. norm ((f y - f x) - f' (y - x)) / norm (y - x) * norm (y - x))" (is ?m)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   207
    by (rule tendsto_mult_zero) (auto intro!: tendsto_eq_intros)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   208
  also have "?m \<longleftrightarrow> ?L (\<lambda>y. norm ((f y - f x) - f' (y - x)))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   209
    by (intro filterlim_cong) (simp_all add: eventually_at_filter)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   210
  finally have "?L (\<lambda>y. (f y - f x) - f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   211
    by (rule tendsto_norm_zero_cancel)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   212
  then have "?L (\<lambda>y. ((f y - f x) - f' (y - x)) + f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   213
    by (rule tendsto_eq_intros) (auto intro!: tendsto_eq_intros simp: F.zero)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   214
  then have "?L (\<lambda>y. f y - f x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   215
    by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   216
  from tendsto_add[OF this tendsto_const, of "f x"] show ?thesis
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   217
    by (simp add: continuous_within)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   218
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   219
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   220
subsection \<open>Composition\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   221
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   222
lemma tendsto_at_iff_tendsto_nhds_within: "f x = y \<Longrightarrow> (f \<longlongrightarrow> y) (at x within s) \<longleftrightarrow> (f \<longlongrightarrow> y) (inf (nhds x) (principal s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   223
  unfolding tendsto_def eventually_inf_principal eventually_at_filter
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
   224
  by (intro ext all_cong imp_cong) (auto elim!: eventually_mono)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   225
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   226
lemma has_derivative_in_compose:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   227
  assumes f: "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   228
  assumes g: "(g has_derivative g') (at (f x) within (f`s))"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   229
  shows "((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   230
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   231
  from f interpret F: bounded_linear f' by (rule has_derivative_bounded_linear)
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   232
  from g interpret G: bounded_linear g' by (rule has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   233
  from F.bounded obtain kF where kF: "\<And>x. norm (f' x) \<le> norm x * kF" by fast
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   234
  from G.bounded obtain kG where kG: "\<And>x. norm (g' x) \<le> norm x * kG" by fast
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   235
  note G.tendsto[tendsto_intros]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   236
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   237
  let ?L = "\<lambda>f. (f \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   238
  let ?D = "\<lambda>f f' x y. (f y - f x) - f' (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   239
  let ?N = "\<lambda>f f' x y. norm (?D f f' x y) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   240
  let ?gf = "\<lambda>x. g (f x)" and ?gf' = "\<lambda>x. g' (f' x)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   241
  define Nf where "Nf = ?N f f' x"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   242
  define Ng where [abs_def]: "Ng y = ?N g g' (f x) (f y)" for y
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   243
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   244
  show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   245
  proof (rule has_derivativeI_sandwich[of 1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   246
    show "bounded_linear (\<lambda>x. g' (f' x))"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   247
      using f g by (blast intro: bounded_linear_compose has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   248
  next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   249
    fix y::'a assume neq: "y \<noteq> x"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   250
    have "?N ?gf ?gf' x y = norm (g' (?D f f' x y) + ?D g g' (f x) (f y)) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   251
      by (simp add: G.diff G.add field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   252
    also have "\<dots> \<le> norm (g' (?D f f' x y)) / norm (y - x) + Ng y * (norm (f y - f x) / norm (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   253
      by (simp add: add_divide_distrib[symmetric] divide_right_mono norm_triangle_ineq G.zero Ng_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   254
    also have "\<dots> \<le> Nf y * kG + Ng y * (Nf y + kF)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   255
    proof (intro add_mono mult_left_mono)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   256
      have "norm (f y - f x) = norm (?D f f' x y + f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   257
        by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   258
      also have "\<dots> \<le> norm (?D f f' x y) + norm (f' (y - x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   259
        by (rule norm_triangle_ineq)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   260
      also have "\<dots> \<le> norm (?D f f' x y) + norm (y - x) * kF"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   261
        using kF by (intro add_mono) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   262
      finally show "norm (f y - f x) / norm (y - x) \<le> Nf y + kF"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   263
        by (simp add: neq Nf_def field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   264
    qed (insert kG, simp_all add: Ng_def Nf_def neq zero_le_divide_iff field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   265
    finally show "?N ?gf ?gf' x y \<le> Nf y * kG + Ng y * (Nf y + kF)" .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   266
  next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   267
    have [tendsto_intros]: "?L Nf"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   268
      using f unfolding has_derivative_iff_norm Nf_def ..
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   269
    from f have "(f \<longlongrightarrow> f x) (at x within s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   270
      by (blast intro: has_derivative_continuous continuous_within[THEN iffD1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   271
    then have f': "LIM x at x within s. f x :> inf (nhds (f x)) (principal (f`s))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   272
      unfolding filterlim_def
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   273
      by (simp add: eventually_filtermap eventually_at_filter le_principal)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   274
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   275
    have "((?N g  g' (f x)) \<longlongrightarrow> 0) (at (f x) within f`s)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   276
      using g unfolding has_derivative_iff_norm ..
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   277
    then have g': "((?N g  g' (f x)) \<longlongrightarrow> 0) (inf (nhds (f x)) (principal (f`s)))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   278
      by (rule tendsto_at_iff_tendsto_nhds_within[THEN iffD1, rotated]) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   279
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   280
    have [tendsto_intros]: "?L Ng"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   281
      unfolding Ng_def by (rule filterlim_compose[OF g' f'])
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   282
    show "((\<lambda>y. Nf y * kG + Ng y * (Nf y + kF)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   283
      by (intro tendsto_eq_intros) auto
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   284
  qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   285
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   286
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   287
lemma has_derivative_compose:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   288
  "(f has_derivative f') (at x within s) \<Longrightarrow> (g has_derivative g') (at (f x)) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   289
  ((\<lambda>x. g (f x)) has_derivative (\<lambda>x. g' (f' x))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   290
  by (blast intro: has_derivative_in_compose has_derivative_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   291
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   292
lemma (in bounded_bilinear) FDERIV:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   293
  assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   294
  shows "((\<lambda>x. f x ** g x) has_derivative (\<lambda>h. f x ** g' h + f' h ** g x)) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   295
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   296
  from bounded_linear.bounded [OF has_derivative_bounded_linear [OF f]]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   297
  obtain KF where norm_F: "\<And>x. norm (f' x) \<le> norm x * KF" by fast
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   298
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   299
  from pos_bounded obtain K where K: "0 < K" and norm_prod:
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   300
    "\<And>a b. norm (a ** b) \<le> norm a * norm b * K" by fast
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   301
  let ?D = "\<lambda>f f' y. f y - f x - f' (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   302
  let ?N = "\<lambda>f f' y. norm (?D f f' y) / norm (y - x)"
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   303
  define Ng where "Ng = ?N g g'"
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
   304
  define Nf where "Nf = ?N f f'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   305
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   306
  let ?fun1 = "\<lambda>y. norm (f y ** g y - f x ** g x - (f x ** g' (y - x) + f' (y - x) ** g x)) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   307
  let ?fun2 = "\<lambda>y. norm (f x) * Ng y * K + Nf y * norm (g y) * K + KF * norm (g y - g x) * K"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   308
  let ?F = "at x within s"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   309
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   310
  show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   311
  proof (rule has_derivativeI_sandwich[of 1])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   312
    show "bounded_linear (\<lambda>h. f x ** g' h + f' h ** g x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   313
      by (intro bounded_linear_add
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   314
        bounded_linear_compose [OF bounded_linear_right] bounded_linear_compose [OF bounded_linear_left]
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   315
        has_derivative_bounded_linear [OF g] has_derivative_bounded_linear [OF f])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   316
  next
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   317
    from g have "(g \<longlongrightarrow> g x) ?F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   318
      by (intro continuous_within[THEN iffD1] has_derivative_continuous)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   319
    moreover from f g have "(Nf \<longlongrightarrow> 0) ?F" "(Ng \<longlongrightarrow> 0) ?F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   320
      by (simp_all add: has_derivative_iff_norm Ng_def Nf_def)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   321
    ultimately have "(?fun2 \<longlongrightarrow> norm (f x) * 0 * K + 0 * norm (g x) * K + KF * norm (0::'b) * K) ?F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   322
      by (intro tendsto_intros) (simp_all add: LIM_zero_iff)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   323
    then show "(?fun2 \<longlongrightarrow> 0) ?F"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   324
      by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   325
  next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   326
    fix y::'d assume "y \<noteq> x"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   327
    have "?fun1 y = norm (f x ** ?D g g' y + ?D f f' y ** g y + f' (y - x) ** (g y - g x)) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   328
      by (simp add: diff_left diff_right add_left add_right field_simps)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   329
    also have "\<dots> \<le> (norm (f x) * norm (?D g g' y) * K + norm (?D f f' y) * norm (g y) * K +
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   330
        norm (y - x) * KF * norm (g y - g x) * K) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   331
      by (intro divide_right_mono mult_mono'
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   332
                order_trans [OF norm_triangle_ineq add_mono]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   333
                order_trans [OF norm_prod mult_right_mono]
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   334
                mult_nonneg_nonneg order_refl norm_ge_zero norm_F
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   335
                K [THEN order_less_imp_le])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   336
    also have "\<dots> = ?fun2 y"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   337
      by (simp add: add_divide_distrib Ng_def Nf_def)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   338
    finally show "?fun1 y \<le> ?fun2 y" .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   339
  qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   340
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   341
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   342
lemmas has_derivative_mult[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_mult]
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   343
lemmas has_derivative_scaleR[simp, derivative_intros] = bounded_bilinear.FDERIV[OF bounded_bilinear_scaleR]
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   344
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   345
lemma has_derivative_setprod[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   346
  fixes f :: "'i \<Rightarrow> 'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   347
  assumes f: "\<And>i. i \<in> I \<Longrightarrow> (f i has_derivative f' i) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   348
  shows "((\<lambda>x. \<Prod>i\<in>I. f i x) has_derivative (\<lambda>y. \<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x))) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   349
proof cases
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   350
  assume "finite I" from this f show ?thesis
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   351
  proof induct
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   352
    case (insert i I)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   353
    let ?P = "\<lambda>y. f i x * (\<Sum>i\<in>I. f' i y * (\<Prod>j\<in>I - {i}. f j x)) + (f' i y) * (\<Prod>i\<in>I. f i x)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   354
    have "((\<lambda>x. f i x * (\<Prod>i\<in>I. f i x)) has_derivative ?P) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   355
      using insert by (intro has_derivative_mult) auto
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   356
    also have "?P = (\<lambda>y. \<Sum>i'\<in>insert i I. f' i' y * (\<Prod>j\<in>insert i I - {i'}. f j x))"
57418
6ab1c7cb0b8d fact consolidation
haftmann
parents: 56541
diff changeset
   357
      using insert(1,2) by (auto simp add: setsum_right_distrib insert_Diff_if intro!: ext setsum.cong)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   358
    finally show ?case
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   359
      using insert by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   360
  qed simp  
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   361
qed simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   362
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   363
lemma has_derivative_power[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   364
  fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   365
  assumes f: "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   366
  shows "((\<lambda>x. f x^n) has_derivative (\<lambda>y. of_nat n * f' y * f x^(n - 1))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   367
  using has_derivative_setprod[OF f, of "{..< n}"] by (simp add: setprod_constant ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   368
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   369
lemma has_derivative_inverse':
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   370
  fixes x :: "'a::real_normed_div_algebra"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   371
  assumes x: "x \<noteq> 0"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   372
  shows "(inverse has_derivative (\<lambda>h. - (inverse x * h * inverse x))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   373
        (is "(?inv has_derivative ?f) _")
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   374
proof (rule has_derivativeI_sandwich)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   375
  show "bounded_linear (\<lambda>h. - (?inv x * h * ?inv x))"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   376
    apply (rule bounded_linear_minus)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   377
    apply (rule bounded_linear_mult_const)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   378
    apply (rule bounded_linear_const_mult)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   379
    apply (rule bounded_linear_ident)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   380
    done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   381
next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   382
  show "0 < norm x" using x by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   383
next
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
   384
  show "((\<lambda>y. norm (?inv y - ?inv x) * norm (?inv x)) \<longlongrightarrow> 0) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   385
    apply (rule tendsto_mult_left_zero)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   386
    apply (rule tendsto_norm_zero)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   387
    apply (rule LIM_zero)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   388
    apply (rule tendsto_inverse)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   389
    apply (rule tendsto_ident_at)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   390
    apply (rule x)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   391
    done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   392
next
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   393
  fix y::'a assume h: "y \<noteq> x" "dist y x < norm x"
62397
5ae24f33d343 Substantial new material for multivariate analysis. Also removal of some duplicates.
paulson <lp15@cam.ac.uk>
parents: 61976
diff changeset
   394
  then have "y \<noteq> 0" by auto
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   395
  have "norm (?inv y - ?inv x - ?f (y -x)) / norm (y - x) = norm ((?inv y - ?inv x) * (y - x) * ?inv x) / norm (y - x)"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   396
    apply (subst inverse_diff_inverse [OF \<open>y \<noteq> 0\<close> x])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   397
    apply (subst minus_diff_minus)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   398
    apply (subst norm_minus_cancel)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   399
    apply (simp add: left_diff_distrib)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   400
    done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   401
  also have "\<dots> \<le> norm (?inv y - ?inv x) * norm (y - x) * norm (?inv x) / norm (y - x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   402
    apply (rule divide_right_mono [OF _ norm_ge_zero])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   403
    apply (rule order_trans [OF norm_mult_ineq])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   404
    apply (rule mult_right_mono [OF _ norm_ge_zero])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   405
    apply (rule norm_mult_ineq)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   406
    done
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   407
  also have "\<dots> = norm (?inv y - ?inv x) * norm (?inv x)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   408
    by simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   409
  finally show "norm (?inv y - ?inv x - ?f (y -x)) / norm (y - x) \<le>
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   410
      norm (?inv y - ?inv x) * norm (?inv x)" .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   411
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   412
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   413
lemma has_derivative_inverse[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   414
  fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   415
  assumes x:  "f x \<noteq> 0" and f: "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   416
  shows "((\<lambda>x. inverse (f x)) has_derivative (\<lambda>h. - (inverse (f x) * f' h * inverse (f x)))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   417
  using has_derivative_compose[OF f has_derivative_inverse', OF x] .
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   418
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   419
lemma has_derivative_divide[simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   420
  fixes f :: "_ \<Rightarrow> 'a::real_normed_div_algebra"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   421
  assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)" 
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   422
  assumes x: "g x \<noteq> 0"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   423
  shows "((\<lambda>x. f x / g x) has_derivative
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   424
                (\<lambda>h. - f x * (inverse (g x) * g' h * inverse (g x)) + f' h / g x)) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   425
  using has_derivative_mult[OF f has_derivative_inverse[OF x g]]
56480
093ea91498e6 field_simps: better support for negation and division, and power
hoelzl
parents: 56479
diff changeset
   426
  by (simp add: field_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   427
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   428
text\<open>Conventional form requires mult-AC laws. Types real and complex only.\<close>
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   429
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   430
lemma has_derivative_divide'[derivative_intros]: 
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   431
  fixes f :: "_ \<Rightarrow> 'a::real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   432
  assumes f: "(f has_derivative f') (at x within s)" and g: "(g has_derivative g') (at x within s)" and x: "g x \<noteq> 0"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   433
  shows "((\<lambda>x. f x / g x) has_derivative (\<lambda>h. (f' h * g x - f x * g' h) / (g x * g x))) (at x within s)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   434
proof -
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   435
  { fix h
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   436
    have "f' h / g x - f x * (inverse (g x) * g' h * inverse (g x)) =
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   437
          (f' h * g x - f x * g' h) / (g x * g x)"
56480
093ea91498e6 field_simps: better support for negation and division, and power
hoelzl
parents: 56479
diff changeset
   438
      by (simp add: field_simps x)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   439
   }
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   440
  then show ?thesis
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   441
    using has_derivative_divide [OF f g] x
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   442
    by simp
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   443
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   444
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   445
subsection \<open>Uniqueness\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   446
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   447
text \<open>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   448
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   449
This can not generally shown for @{const has_derivative}, as we need to approach the point from
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
   450
all directions. There is a proof in \<open>Multivariate_Analysis\<close> for \<open>euclidean_space\<close>.
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   451
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   452
\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   453
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   454
lemma has_derivative_zero_unique:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   455
  assumes "((\<lambda>x. 0) has_derivative F) (at x)" shows "F = (\<lambda>h. 0)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   456
proof -
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   457
  interpret F: bounded_linear F
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   458
    using assms by (rule has_derivative_bounded_linear)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   459
  let ?r = "\<lambda>h. norm (F h) / norm h"
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   460
  have *: "?r \<midarrow>0\<rightarrow> 0"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   461
    using assms unfolding has_derivative_at by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   462
  show "F = (\<lambda>h. 0)"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   463
  proof
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   464
    fix h show "F h = 0"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   465
    proof (rule ccontr)
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
   466
      assume **: "F h \<noteq> 0"
56541
0e3abadbef39 made divide_pos_pos a simp rule
nipkow
parents: 56480
diff changeset
   467
      hence h: "h \<noteq> 0" by (clarsimp simp add: F.zero)
0e3abadbef39 made divide_pos_pos a simp rule
nipkow
parents: 56480
diff changeset
   468
      with ** have "0 < ?r h" by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   469
      from LIM_D [OF * this] obtain s where s: "0 < s"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   470
        and r: "\<And>x. x \<noteq> 0 \<Longrightarrow> norm x < s \<Longrightarrow> ?r x < ?r h" by auto
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   471
      from dense [OF s] obtain t where t: "0 < t \<and> t < s" ..
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   472
      let ?x = "scaleR (t / norm h) h"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   473
      have "?x \<noteq> 0" and "norm ?x < s" using t h by simp_all
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   474
      hence "?r ?x < ?r h" by (rule r)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   475
      thus "False" using t h by (simp add: F.scaleR)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   476
    qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   477
  qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   478
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   479
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   480
lemma has_derivative_unique:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   481
  assumes "(f has_derivative F) (at x)" and "(f has_derivative F') (at x)" shows "F = F'"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   482
proof -
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   483
  have "((\<lambda>x. 0) has_derivative (\<lambda>h. F h - F' h)) (at x)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   484
    using has_derivative_diff [OF assms] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   485
  hence "(\<lambda>h. F h - F' h) = (\<lambda>h. 0)"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   486
    by (rule has_derivative_zero_unique)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   487
  thus "F = F'"
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   488
    unfolding fun_eq_iff right_minus_eq .
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   489
qed
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   490
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   491
subsection \<open>Differentiability predicate\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   492
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   493
definition
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   494
  differentiable :: "('a::real_normed_vector \<Rightarrow> 'b::real_normed_vector) \<Rightarrow> 'a filter \<Rightarrow> bool"
56182
528fae0816ea update syntax of has_*derivative to infix 50; fixed proofs
hoelzl
parents: 56181
diff changeset
   495
  (infix "differentiable" 50)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   496
where
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   497
  "f differentiable F \<longleftrightarrow> (\<exists>D. (f has_derivative D) F)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   498
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   499
lemma differentiable_subset: "f differentiable (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> f differentiable (at x within t)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   500
  unfolding differentiable_def by (blast intro: has_derivative_subset)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   501
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   502
lemmas differentiable_within_subset = differentiable_subset
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   503
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   504
lemma differentiable_ident [simp, derivative_intros]: "(\<lambda>x. x) differentiable F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   505
  unfolding differentiable_def by (blast intro: has_derivative_ident)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   506
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   507
lemma differentiable_const [simp, derivative_intros]: "(\<lambda>z. a) differentiable F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   508
  unfolding differentiable_def by (blast intro: has_derivative_const)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   509
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   510
lemma differentiable_in_compose:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   511
  "f differentiable (at (g x) within (g`s)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f (g x)) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   512
  unfolding differentiable_def by (blast intro: has_derivative_in_compose)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   513
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   514
lemma differentiable_compose:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   515
  "f differentiable (at (g x)) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f (g x)) differentiable (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   516
  by (blast intro: differentiable_in_compose differentiable_subset)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   517
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   518
lemma differentiable_sum [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   519
  "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x + g x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   520
  unfolding differentiable_def by (blast intro: has_derivative_add)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   521
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   522
lemma differentiable_minus [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   523
  "f differentiable F \<Longrightarrow> (\<lambda>x. - f x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   524
  unfolding differentiable_def by (blast intro: has_derivative_minus)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   525
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   526
lemma differentiable_diff [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   527
  "f differentiable F \<Longrightarrow> g differentiable F \<Longrightarrow> (\<lambda>x. f x - g x) differentiable F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   528
  unfolding differentiable_def by (blast intro: has_derivative_diff)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   529
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   530
lemma differentiable_mult [simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   531
  fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_algebra"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   532
  shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x * g x) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   533
  unfolding differentiable_def by (blast intro: has_derivative_mult)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   534
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   535
lemma differentiable_inverse [simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   536
  fixes f :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   537
  shows "f differentiable (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow> (\<lambda>x. inverse (f x)) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   538
  unfolding differentiable_def by (blast intro: has_derivative_inverse)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   539
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   540
lemma differentiable_divide [simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   541
  fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   542
  shows "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> g x \<noteq> 0 \<Longrightarrow> (\<lambda>x. f x / g x) differentiable (at x within s)"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
   543
  unfolding divide_inverse by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   544
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   545
lemma differentiable_power [simp, derivative_intros]:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   546
  fixes f g :: "'a :: real_normed_vector \<Rightarrow> 'b :: real_normed_field"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   547
  shows "f differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x ^ n) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   548
  unfolding differentiable_def by (blast intro: has_derivative_power)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   549
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   550
lemma differentiable_scaleR [simp, derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   551
  "f differentiable (at x within s) \<Longrightarrow> g differentiable (at x within s) \<Longrightarrow> (\<lambda>x. f x *\<^sub>R g x) differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   552
  unfolding differentiable_def by (blast intro: has_derivative_scaleR)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   553
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   554
lemma has_derivative_imp_has_field_derivative:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   555
  "(f has_derivative D) F \<Longrightarrow> (\<And>x. x * D' = D x) \<Longrightarrow> (f has_field_derivative D') F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   556
  unfolding has_field_derivative_def 
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   557
  by (rule has_derivative_eq_rhs[of f D]) (simp_all add: fun_eq_iff mult.commute)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   558
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   559
lemma has_field_derivative_imp_has_derivative: "(f has_field_derivative D) F \<Longrightarrow> (f has_derivative op * D) F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   560
  by (simp add: has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   561
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   562
lemma DERIV_subset: 
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   563
  "(f has_field_derivative f') (at x within s) \<Longrightarrow> t \<subseteq> s 
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   564
   \<Longrightarrow> (f has_field_derivative f') (at x within t)"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   565
  by (simp add: has_field_derivative_def has_derivative_within_subset)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   566
59862
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   567
lemma has_field_derivative_at_within:
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   568
    "(f has_field_derivative f') (at x) \<Longrightarrow> (f has_field_derivative f') (at x within s)"
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   569
  using DERIV_subset by blast
44b3f4fa33ca New material and binomial fix
paulson <lp15@cam.ac.uk>
parents: 59615
diff changeset
   570
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   571
abbreviation (input)
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   572
  DERIV :: "('a::real_normed_field \<Rightarrow> 'a) \<Rightarrow> 'a \<Rightarrow> 'a \<Rightarrow> bool"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   573
  ("(DERIV (_)/ (_)/ :> (_))" [1000, 1000, 60] 60)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   574
where
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   575
  "DERIV f x :> D \<equiv> (f has_field_derivative D) (at x)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   576
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   577
abbreviation 
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   578
  has_real_derivative :: "(real \<Rightarrow> real) \<Rightarrow> real \<Rightarrow> real filter \<Rightarrow> bool"
56182
528fae0816ea update syntax of has_*derivative to infix 50; fixed proofs
hoelzl
parents: 56181
diff changeset
   579
  (infix "(has'_real'_derivative)" 50)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   580
where
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   581
  "(f has_real_derivative D) F \<equiv> (f has_field_derivative D) F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   582
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   583
lemma real_differentiable_def:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   584
  "f differentiable at x within s \<longleftrightarrow> (\<exists>D. (f has_real_derivative D) (at x within s))"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   585
proof safe
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   586
  assume "f differentiable at x within s"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   587
  then obtain f' where *: "(f has_derivative f') (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   588
    unfolding differentiable_def by auto
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   589
  then obtain c where "f' = (op * c)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   590
    by (metis real_bounded_linear has_derivative_bounded_linear mult.commute fun_eq_iff)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   591
  with * show "\<exists>D. (f has_real_derivative D) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   592
    unfolding has_field_derivative_def by auto
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   593
qed (auto simp: differentiable_def has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   594
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   595
lemma real_differentiableE [elim?]:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   596
  assumes f: "f differentiable (at x within s)" obtains df where "(f has_real_derivative df) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   597
  using assms by (auto simp: real_differentiable_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   598
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   599
lemma differentiableD: "f differentiable (at x within s) \<Longrightarrow> \<exists>D. (f has_real_derivative D) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   600
  by (auto elim: real_differentiableE)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   601
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   602
lemma differentiableI: "(f has_real_derivative D) (at x within s) \<Longrightarrow> f differentiable (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   603
  by (force simp add: real_differentiable_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   604
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   605
lemma has_field_derivative_iff:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   606
  "(f has_field_derivative D) (at x within S) \<longleftrightarrow>
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   607
    ((\<lambda>y. (f y - f x) / (y - x)) \<longlongrightarrow> D) (at x within S)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   608
  apply (simp add: has_field_derivative_def has_derivative_iff_norm bounded_linear_mult_right
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   609
    LIM_zero_iff[symmetric, of _ D])
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   610
  apply (subst (2) tendsto_norm_zero_iff[symmetric])
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   611
  apply (rule filterlim_cong)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   612
  apply (simp_all add: eventually_at_filter field_simps nonzero_norm_divide)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   613
  done
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   614
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   615
lemma DERIV_def: "DERIV f x :> D \<longleftrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   616
  unfolding field_has_derivative_at has_field_derivative_def has_field_derivative_iff ..
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   617
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   618
lemma mult_commute_abs: "(\<lambda>x. x * c) = op * (c::'a::ab_semigroup_mult)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   619
  by (simp add: fun_eq_iff mult.commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   620
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   621
subsection \<open>Vector derivative\<close>
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   622
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   623
lemma has_field_derivative_iff_has_vector_derivative:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   624
  "(f has_field_derivative y) F \<longleftrightarrow> (f has_vector_derivative y) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   625
  unfolding has_vector_derivative_def has_field_derivative_def real_scaleR_def mult_commute_abs ..
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   626
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   627
lemma has_field_derivative_subset:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   628
  "(f has_field_derivative y) (at x within s) \<Longrightarrow> t \<subseteq> s \<Longrightarrow> (f has_field_derivative y) (at x within t)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   629
  unfolding has_field_derivative_def by (rule has_derivative_subset)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   630
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   631
lemma has_vector_derivative_const[simp, derivative_intros]: "((\<lambda>x. c) has_vector_derivative 0) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   632
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   633
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   634
lemma has_vector_derivative_id[simp, derivative_intros]: "((\<lambda>x. x) has_vector_derivative 1) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   635
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   636
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   637
lemma has_vector_derivative_minus[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   638
  "(f has_vector_derivative f') net \<Longrightarrow> ((\<lambda>x. - f x) has_vector_derivative (- f')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   639
  by (auto simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   640
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   641
lemma has_vector_derivative_add[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   642
  "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   643
    ((\<lambda>x. f x + g x) has_vector_derivative (f' + g')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   644
  by (auto simp: has_vector_derivative_def scaleR_right_distrib)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   645
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   646
lemma has_vector_derivative_setsum[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   647
  "(\<And>i. i \<in> I \<Longrightarrow> (f i has_vector_derivative f' i) net) \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   648
    ((\<lambda>x. \<Sum>i\<in>I. f i x) has_vector_derivative (\<Sum>i\<in>I. f' i)) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   649
  by (auto simp: has_vector_derivative_def fun_eq_iff scaleR_setsum_right intro!: derivative_eq_intros)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   650
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   651
lemma has_vector_derivative_diff[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   652
  "(f has_vector_derivative f') net \<Longrightarrow> (g has_vector_derivative g') net \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   653
    ((\<lambda>x. f x - g x) has_vector_derivative (f' - g')) net"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   654
  by (auto simp: has_vector_derivative_def scaleR_diff_right)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   655
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   656
lemma has_vector_derivative_add_const:
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   657
     "((\<lambda>t. g t + z) has_vector_derivative f') net = ((\<lambda>t. g t) has_vector_derivative f') net"
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   658
apply (intro iffI)
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   659
apply (drule has_vector_derivative_diff [where g = "\<lambda>t. z", OF _ has_vector_derivative_const], simp)
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   660
apply (drule has_vector_derivative_add [OF _ has_vector_derivative_const], simp)
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   661
done
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   662
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   663
lemma has_vector_derivative_diff_const:
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   664
     "((\<lambda>t. g t - z) has_vector_derivative f') net = ((\<lambda>t. g t) has_vector_derivative f') net"
61204
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   665
using has_vector_derivative_add_const [where z = "-z"]
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   666
by simp
3e491e34a62e new lemmas and movement of lemmas into place
paulson
parents: 60758
diff changeset
   667
60177
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   668
lemma (in bounded_linear) has_vector_derivative:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   669
  assumes "(g has_vector_derivative g') F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   670
  shows "((\<lambda>x. f (g x)) has_vector_derivative f g') F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   671
  using has_derivative[OF assms[unfolded has_vector_derivative_def]]
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   672
  by (simp add: has_vector_derivative_def scaleR)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   673
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   674
lemma (in bounded_bilinear) has_vector_derivative:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   675
  assumes "(f has_vector_derivative f') (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   676
    and "(g has_vector_derivative g') (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   677
  shows "((\<lambda>x. f x ** g x) has_vector_derivative (f x ** g' + f' ** g x)) (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   678
  using FDERIV[OF assms(1-2)[unfolded has_vector_derivative_def]]
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   679
  by (simp add: has_vector_derivative_def scaleR_right scaleR_left scaleR_right_distrib)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   680
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   681
lemma has_vector_derivative_scaleR[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   682
  "(f has_field_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   683
    ((\<lambda>x. f x *\<^sub>R g x) has_vector_derivative (f x *\<^sub>R g' + f' *\<^sub>R g x)) (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   684
  unfolding has_field_derivative_iff_has_vector_derivative
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   685
  by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_scaleR])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   686
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   687
lemma has_vector_derivative_mult[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   688
  "(f has_vector_derivative f') (at x within s) \<Longrightarrow> (g has_vector_derivative g') (at x within s) \<Longrightarrow>
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   689
    ((\<lambda>x. f x * g x) has_vector_derivative (f x * g' + f' * g x :: 'a :: real_normed_algebra)) (at x within s)"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   690
  by (rule bounded_bilinear.has_vector_derivative[OF bounded_bilinear_mult])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   691
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   692
lemma has_vector_derivative_of_real[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   693
  "(f has_field_derivative D) F \<Longrightarrow> ((\<lambda>x. of_real (f x)) has_vector_derivative (of_real D)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   694
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_of_real])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   695
     (simp add: has_field_derivative_iff_has_vector_derivative)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   696
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   697
lemma has_vector_derivative_continuous: "(f has_vector_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   698
  by (auto intro: has_derivative_continuous simp: has_vector_derivative_def)
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   699
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   700
lemma has_vector_derivative_mult_right[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   701
  fixes a :: "'a :: real_normed_algebra"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   702
  shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. a * f x) has_vector_derivative (a * x)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   703
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_right])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   704
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   705
lemma has_vector_derivative_mult_left[derivative_intros]:
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   706
  fixes a :: "'a :: real_normed_algebra"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   707
  shows "(f has_vector_derivative x) F \<Longrightarrow> ((\<lambda>x. f x * a) has_vector_derivative (x * a)) F"
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   708
  by (rule bounded_linear.has_vector_derivative[OF bounded_linear_mult_left])
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   709
2bfcb83531c6 moved basic lemmas about has_vector_derivative
immler
parents: 59867
diff changeset
   710
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   711
subsection \<open>Derivatives\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   712
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   713
lemma DERIV_D: "DERIV f x :> D \<Longrightarrow> (\<lambda>h. (f (x + h) - f x) / h) \<midarrow>0\<rightarrow> D"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   714
  by (simp add: DERIV_def)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   715
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   716
lemma has_field_derivativeD:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   717
  "(f has_field_derivative D) (at x within S) \<Longrightarrow>
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   718
    ((\<lambda>y. (f y - f x) / (y - x)) \<longlongrightarrow> D) (at x within S)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   719
  by (simp add: has_field_derivative_iff)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   720
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   721
lemma DERIV_const [simp, derivative_intros]: "((\<lambda>x. k) has_field_derivative 0) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   722
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_const]) auto
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   723
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   724
lemma DERIV_ident [simp, derivative_intros]: "((\<lambda>x. x) has_field_derivative 1) F"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   725
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_ident]) auto
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   726
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   727
lemma field_differentiable_add[derivative_intros]:
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   728
  "(f has_field_derivative f') F \<Longrightarrow> (g has_field_derivative g') F \<Longrightarrow> 
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   729
    ((\<lambda>z. f z + g z) has_field_derivative f' + g') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   730
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_add])
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   731
     (auto simp: has_field_derivative_def field_simps mult_commute_abs)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   732
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   733
corollary DERIV_add:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   734
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   735
  ((\<lambda>x. f x + g x) has_field_derivative D + E) (at x within s)"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   736
  by (rule field_differentiable_add)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   737
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   738
lemma field_differentiable_minus[derivative_intros]:
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   739
  "(f has_field_derivative f') F \<Longrightarrow> ((\<lambda>z. - (f z)) has_field_derivative -f') F"
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   740
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_minus])
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   741
     (auto simp: has_field_derivative_def field_simps mult_commute_abs)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   742
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   743
corollary DERIV_minus: "(f has_field_derivative D) (at x within s) \<Longrightarrow> ((\<lambda>x. - f x) has_field_derivative -D) (at x within s)"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   744
  by (rule field_differentiable_minus)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   745
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   746
lemma field_differentiable_diff[derivative_intros]:
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   747
  "(f has_field_derivative f') F \<Longrightarrow> (g has_field_derivative g') F \<Longrightarrow> ((\<lambda>z. f z - g z) has_field_derivative f' - g') F"
63092
a949b2a5f51d eliminated use of empty "assms";
wenzelm
parents: 63079
diff changeset
   748
  by (simp only: diff_conv_add_uminus field_differentiable_add field_differentiable_minus)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   749
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   750
corollary DERIV_diff:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   751
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   752
  ((\<lambda>x. f x - g x) has_field_derivative D - E) (at x within s)"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   753
  by (rule field_differentiable_diff)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   754
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   755
lemma DERIV_continuous: "(f has_field_derivative D) (at x within s) \<Longrightarrow> continuous (at x within s) f"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   756
  by (drule has_derivative_continuous[OF has_field_derivative_imp_has_derivative]) simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   757
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   758
corollary DERIV_isCont: "DERIV f x :> D \<Longrightarrow> isCont f x"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   759
  by (rule DERIV_continuous)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   760
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
   761
lemma DERIV_continuous_on:
63299
71805faedeb2 Integration by substitution
eberlm
parents: 63263
diff changeset
   762
  "(\<And>x. x \<in> s \<Longrightarrow> (f has_field_derivative (D x)) (at x within s)) \<Longrightarrow> continuous_on s f"
71805faedeb2 Integration by substitution
eberlm
parents: 63263
diff changeset
   763
  unfolding continuous_on_eq_continuous_within
71805faedeb2 Integration by substitution
eberlm
parents: 63263
diff changeset
   764
  by (intro continuous_at_imp_continuous_on ballI DERIV_continuous) 
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   765
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   766
lemma DERIV_mult':
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   767
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> (g has_field_derivative E) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   768
  ((\<lambda>x. f x * g x) has_field_derivative f x * E + D * g x) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   769
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   770
     (auto simp: field_simps mult_commute_abs dest: has_field_derivative_imp_has_derivative)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   771
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   772
lemma DERIV_mult[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   773
  "(f has_field_derivative Da) (at x within s) \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   774
  ((\<lambda>x. f x * g x) has_field_derivative Da * g x + Db * f x) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   775
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_mult])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   776
     (auto simp: field_simps dest: has_field_derivative_imp_has_derivative)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   777
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   778
text \<open>Derivative of linear multiplication\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   779
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   780
lemma DERIV_cmult:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   781
  "(f has_field_derivative D) (at x within s) ==> ((\<lambda>x. c * f x) has_field_derivative c * D) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   782
  by (drule DERIV_mult' [OF DERIV_const], simp)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   783
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   784
lemma DERIV_cmult_right:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   785
  "(f has_field_derivative D) (at x within s) ==> ((\<lambda>x. f x * c) has_field_derivative D * c) (at x within s)"
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
   786
  using DERIV_cmult by (force simp add: ac_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   787
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   788
lemma DERIV_cmult_Id [simp]: "(op * c has_field_derivative c) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   789
  by (cut_tac c = c and x = x in DERIV_ident [THEN DERIV_cmult], simp)
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   790
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   791
lemma DERIV_cdivide:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   792
  "(f has_field_derivative D) (at x within s) \<Longrightarrow> ((\<lambda>x. f x / c) has_field_derivative D / c) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   793
  using DERIV_cmult_right[of f D x s "1 / c"] by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   794
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   795
lemma DERIV_unique:
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   796
  "DERIV f x :> D \<Longrightarrow> DERIV f x :> E \<Longrightarrow> D = E"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   797
  unfolding DERIV_def by (rule LIM_unique) 
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   798
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   799
lemma DERIV_setsum[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   800
  "(\<And> n. n \<in> S \<Longrightarrow> ((\<lambda>x. f x n) has_field_derivative (f' x n)) F) \<Longrightarrow> 
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   801
    ((\<lambda>x. setsum (f x) S) has_field_derivative setsum (f' x) S) F"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   802
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_setsum])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   803
     (auto simp: setsum_right_distrib mult_commute_abs dest: has_field_derivative_imp_has_derivative)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   804
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   805
lemma DERIV_inverse'[derivative_intros]:
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   806
  assumes "(f has_field_derivative D) (at x within s)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   807
    and "f x \<noteq> 0"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   808
  shows "((\<lambda>x. inverse (f x)) has_field_derivative - (inverse (f x) * D * inverse (f x))) (at x within s)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   809
proof -
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   810
  have "(f has_derivative (\<lambda>x. x * D)) = (f has_derivative op * D)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   811
    by (rule arg_cong [of "\<lambda>x. x * D"]) (simp add: fun_eq_iff)
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   812
  with assms have "(f has_derivative (\<lambda>x. x * D)) (at x within s)"
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   813
    by (auto dest!: has_field_derivative_imp_has_derivative)
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   814
  then show ?thesis using \<open>f x \<noteq> 0\<close>
59867
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   815
    by (auto intro: has_derivative_imp_has_field_derivative has_derivative_inverse)
58043346ca64 given up separate type classes demanding `inverse 0 = 0`
haftmann
parents: 59862
diff changeset
   816
qed
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   817
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
   818
text \<open>Power of \<open>-1\<close>\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   819
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   820
lemma DERIV_inverse:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   821
  "x \<noteq> 0 \<Longrightarrow> ((\<lambda>x. inverse(x)) has_field_derivative - (inverse x ^ Suc (Suc 0))) (at x within s)"
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   822
  by (drule DERIV_inverse' [OF DERIV_ident]) simp
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   823
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   824
text \<open>Derivative of inverse\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   825
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   826
lemma DERIV_inverse_fun:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   827
  "(f has_field_derivative d) (at x within s) \<Longrightarrow> f x \<noteq> 0 \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   828
  ((\<lambda>x. inverse (f x)) has_field_derivative (- (d * inverse(f x ^ Suc (Suc 0))))) (at x within s)"
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
   829
  by (drule (1) DERIV_inverse') (simp add: ac_simps nonzero_inverse_mult_distrib)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   830
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   831
text \<open>Derivative of quotient\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   832
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   833
lemma DERIV_divide[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   834
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   835
  (g has_field_derivative E) (at x within s) \<Longrightarrow> g x \<noteq> 0 \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   836
  ((\<lambda>x. f x / g x) has_field_derivative (D * g x - f x * E) / (g x * g x)) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   837
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_divide])
56480
093ea91498e6 field_simps: better support for negation and division, and power
hoelzl
parents: 56479
diff changeset
   838
     (auto dest: has_field_derivative_imp_has_derivative simp: field_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   839
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   840
lemma DERIV_quotient:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   841
  "(f has_field_derivative d) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   842
  (g has_field_derivative e) (at x within s)\<Longrightarrow> g x \<noteq> 0 \<Longrightarrow> 
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   843
  ((\<lambda>y. f y / g y) has_field_derivative (d * g x - (e * f x)) / (g x ^ Suc (Suc 0))) (at x within s)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   844
  by (drule (2) DERIV_divide) (simp add: mult.commute)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   845
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   846
lemma DERIV_power_Suc:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   847
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   848
  ((\<lambda>x. f x ^ Suc n) has_field_derivative (1 + of_nat n) * (D * f x ^ n)) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   849
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   850
     (auto simp: has_field_derivative_def)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   851
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   852
lemma DERIV_power[derivative_intros]:
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   853
  "(f has_field_derivative D) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   854
  ((\<lambda>x. f x ^ n) has_field_derivative of_nat n * (D * f x ^ (n - Suc 0))) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   855
  by (rule has_derivative_imp_has_field_derivative[OF has_derivative_power])
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   856
     (auto simp: has_field_derivative_def)
31880
6fb86c61747c Added DERIV_intros
hoelzl
parents: 31404
diff changeset
   857
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   858
lemma DERIV_pow: "((\<lambda>x. x ^ n) has_field_derivative real n * (x ^ (n - Suc 0))) (at x within s)"
61609
77b453bd616f Coercion "real" now has type nat => real only and is no longer overloaded. Type class "real_of" is gone. Many duplicate theorems removed.
paulson <lp15@cam.ac.uk>
parents: 61552
diff changeset
   859
  using DERIV_power [OF DERIV_ident] by simp
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   860
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   861
lemma DERIV_chain': "(f has_field_derivative D) (at x within s) \<Longrightarrow> DERIV g (f x) :> E \<Longrightarrow> 
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   862
  ((\<lambda>x. g (f x)) has_field_derivative E * D) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   863
  using has_derivative_compose[of f "op * D" x s g "op * E"]
63170
eae6549dbea2 tuned proofs, to allow unfold_abs_def;
wenzelm
parents: 63092
diff changeset
   864
  by (simp only: has_field_derivative_def mult_commute_abs ac_simps)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   865
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   866
corollary DERIV_chain2: "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   867
  ((\<lambda>x. f (g x)) has_field_derivative Da * Db) (at x within s)"
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   868
  by (rule DERIV_chain')
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   869
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   870
text \<open>Standard version\<close>
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   871
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   872
lemma DERIV_chain:
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   873
  "DERIV f (g x) :> Da \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow> 
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   874
  (f o g has_field_derivative Da * Db) (at x within s)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   875
  by (drule (1) DERIV_chain', simp add: o_def mult.commute)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   876
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   877
lemma DERIV_image_chain: 
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   878
  "(f has_field_derivative Da) (at (g x) within (g ` s)) \<Longrightarrow> (g has_field_derivative Db) (at x within s) \<Longrightarrow>
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   879
  (f o g has_field_derivative Da * Db) (at x within s)"
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   880
  using has_derivative_in_compose [of g "op * Db" x s f "op * Da "]
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
   881
  by (simp add: has_field_derivative_def o_def mult_commute_abs ac_simps)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   882
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   883
(*These two are from HOL Light: HAS_COMPLEX_DERIVATIVE_CHAIN*)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   884
lemma DERIV_chain_s:
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   885
  assumes "(\<And>x. x \<in> s \<Longrightarrow> DERIV g x :> g'(x))"
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   886
      and "DERIV f x :> f'" 
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   887
      and "f x \<in> s"
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   888
    shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)"
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   889
  by (metis (full_types) DERIV_chain' mult.commute assms)
55967
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   890
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   891
lemma DERIV_chain3: (*HAS_COMPLEX_DERIVATIVE_CHAIN_UNIV*)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   892
  assumes "(\<And>x. DERIV g x :> g'(x))"
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   893
      and "DERIV f x :> f'" 
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   894
    shows "DERIV (\<lambda>x. g(f x)) x :> f' * g'(f x)"
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   895
  by (metis UNIV_I DERIV_chain_s [of UNIV] assms)
5dadc93ff3df a few new lemmas
paulson <lp15@cam.ac.uk>
parents: 54230
diff changeset
   896
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   897
text\<open>Alternative definition for differentiability\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   898
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   899
lemma DERIV_LIM_iff:
31338
d41a8ba25b67 generalize constants from Lim.thy to class metric_space
huffman
parents: 31336
diff changeset
   900
  fixes f :: "'a::{real_normed_vector,inverse} \<Rightarrow> 'a" shows
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   901
     "((%h. (f(a + h) - f(a)) / h) \<midarrow>0\<rightarrow> D) =
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
   902
      ((%x. (f(x)-f(a)) / (x-a)) \<midarrow>a\<rightarrow> D)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   903
apply (rule iffI)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   904
apply (drule_tac k="- a" in LIM_offset)
54230
b1d955791529 more simplification rules on unary and binary minus
haftmann
parents: 53381
diff changeset
   905
apply simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   906
apply (drule_tac k="a" in LIM_offset)
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
   907
apply (simp add: add.commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   908
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   909
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   910
lemmas DERIV_iff2 = has_field_derivative_iff
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   911
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   912
lemma has_field_derivative_cong_ev:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   913
  assumes "x = y"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   914
    and *: "eventually (\<lambda>x. x \<in> s \<longrightarrow> f x = g x) (nhds x)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   915
    and "u = v" "s = t" "x \<in> s"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   916
    shows "(f has_field_derivative u) (at x within s) = (g has_field_derivative v) (at y within t)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   917
  unfolding DERIV_iff2
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   918
proof (rule filterlim_cong)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   919
  from assms have "f y = g y" by (auto simp: eventually_nhds)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   920
  with * show "\<forall>\<^sub>F xa in at x within s. (f xa - f x) / (xa - x) = (g xa - g y) / (xa - y)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   921
    unfolding eventually_at_filter
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   922
    by eventually_elim (auto simp: assms \<open>f y = g y\<close>)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   923
qed (simp_all add: assms)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   924
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   925
lemma DERIV_cong_ev: "x = y \<Longrightarrow> eventually (\<lambda>x. f x = g x) (nhds x) \<Longrightarrow> u = v \<Longrightarrow>
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   926
    DERIV f x :> u \<longleftrightarrow> DERIV g y :> v"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   927
  by (rule has_field_derivative_cong_ev) simp_all
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   928
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   929
lemma DERIV_shift:
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   930
  "(f has_field_derivative y) (at (x + z)) = ((\<lambda>x. f (x + z)) has_field_derivative y) (at x)"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   931
  by (simp add: DERIV_def field_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   932
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   933
lemma DERIV_mirror:
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   934
  "(DERIV f (- x) :> y) \<longleftrightarrow> (DERIV (\<lambda>x. f (- x::real) :: real) x :> - y)"
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
   935
  by (simp add: DERIV_def filterlim_at_split filterlim_at_left_to_right
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   936
                tendsto_minus_cancel_left field_simps conj_commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   937
63263
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   938
lemma floor_has_real_derivative:
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   939
  fixes f::"real \<Rightarrow> 'a::{floor_ceiling,order_topology}"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   940
  assumes "isCont f x"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   941
  assumes "f x \<notin> \<int>"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   942
  shows "((\<lambda>x. floor (f x)) has_real_derivative 0) (at x)"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   943
proof (subst DERIV_cong_ev[OF refl _ refl])
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   944
  show "((\<lambda>_. floor (f x)) has_real_derivative 0) (at x)" by simp
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   945
  have "\<forall>\<^sub>F y in at x. \<lfloor>f y\<rfloor> = \<lfloor>f x\<rfloor>"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   946
    by (rule eventually_floor_eq[OF assms[unfolded continuous_at]])
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   947
  then show "\<forall>\<^sub>F y in nhds x. real_of_int \<lfloor>f y\<rfloor> = real_of_int \<lfloor>f x\<rfloor>"
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   948
    unfolding eventually_at_filter
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   949
    by eventually_elim auto
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   950
qed
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   951
c6c95d64607a approximation, derivative, and continuity of floor and ceiling
immler
parents: 63170
diff changeset
   952
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   953
text \<open>Caratheodory formulation of derivative at a point\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   954
55970
6d123f0ae358 Some new proofs. Tidying up, esp to remove "apply rule".
paulson <lp15@cam.ac.uk>
parents: 55967
diff changeset
   955
lemma CARAT_DERIV: (*FIXME: SUPERSEDED BY THE ONE IN Deriv.thy. But still used by NSA/HDeriv.thy*)
51642
400ec5ae7f8f move FrechetDeriv from the Library to HOL/Deriv; base DERIV on FDERIV and both derivatives allow a restricted support set; FDERIV is now an abbreviation of has_derivative
hoelzl
parents: 51641
diff changeset
   956
  "(DERIV f x :> l) \<longleftrightarrow> (\<exists>g. (\<forall>z. f z - f x = g z * (z - x)) \<and> isCont g x \<and> g x = l)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   957
      (is "?lhs = ?rhs")
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   958
proof
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   959
  assume der: "DERIV f x :> l"
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
   960
  show "\<exists>g. (\<forall>z. f z - f x = g z * (z-x)) \<and> isCont g x \<and> g x = l"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   961
  proof (intro exI conjI)
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
   962
    let ?g = "(%z. if z = x then l else (f z - f x) / (z-x))"
23413
5caa2710dd5b tuned laws for cancellation in divisions for fields.
nipkow
parents: 23412
diff changeset
   963
    show "\<forall>z. f z - f x = ?g z * (z-x)" by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   964
    show "isCont ?g x" using der
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   965
      by (simp add: isCont_iff DERIV_def cong: LIM_equal [rule_format])
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   966
    show "?g x = l" by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   967
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   968
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   969
  assume "?rhs"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   970
  then obtain g where
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
   971
    "(\<forall>z. f z - f x = g z * (z-x))" and "isCont g x" and "g x = l" by blast
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   972
  thus "(DERIV f x :> l)"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
   973
     by (auto simp add: isCont_iff DERIV_def cong: LIM_cong)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   974
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   975
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   976
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   977
subsection \<open>Local extrema\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
   978
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
   979
text\<open>If @{term "0 < f'(x)"} then @{term x} is Locally Strictly Increasing At The Right\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
   980
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   981
lemma has_real_derivative_pos_inc_right:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   982
  fixes f :: "real => real"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   983
  assumes der: "(f has_real_derivative l) (at x within S)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   984
      and l:   "0 < l"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   985
  shows "\<exists>d > 0. \<forall>h > 0. x + h \<in> S \<longrightarrow> h < d \<longrightarrow> f x < f (x + h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   986
  using assms
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   987
proof -
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   988
  from der [THEN has_field_derivativeD, THEN tendstoD, OF l, unfolded eventually_at]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   989
  obtain s where s:   "0 < s"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   990
    and all: "\<And>xa. xa\<in>S \<Longrightarrow> xa \<noteq> x \<and> dist xa x < s \<longrightarrow> abs ((f xa - f x) / (xa - x) - l) < l"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   991
    by (auto simp: dist_real_def)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   992
  then show ?thesis
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   993
  proof (intro exI conjI strip)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   994
    show "0<s" using s .
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   995
    fix h::real
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   996
    assume "0 < h" "h < s" "x + h \<in> S"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   997
    with all [of "x + h"] show "f x < f (x+h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   998
    proof (simp add: abs_if dist_real_def pos_less_divide_eq split: if_split_asm)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
   999
      assume "\<not> (f (x+h) - f x) / h < l" and h: "0 < h"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1000
      with l
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1001
      have "0 < (f (x+h) - f x) / h" by arith
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1002
      thus "f x < f (x+h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1003
        by (simp add: pos_less_divide_eq h)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1004
    qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1005
  qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1006
qed
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1007
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1008
lemma DERIV_pos_inc_right:
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1009
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1010
  assumes der: "DERIV f x :> l"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1011
      and l:   "0 < l"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1012
  shows "\<exists>d > 0. \<forall>h > 0. h < d --> f(x) < f(x + h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1013
  using has_real_derivative_pos_inc_right[OF assms]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1014
  by auto
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1015
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1016
lemma has_real_derivative_neg_dec_left:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1017
  fixes f :: "real => real"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1018
  assumes der: "(f has_real_derivative l) (at x within S)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1019
      and "l < 0"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1020
  shows "\<exists>d > 0. \<forall>h > 0. x - h \<in> S \<longrightarrow> h < d \<longrightarrow> f x < f (x - h)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1021
proof -
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1022
  from \<open>l < 0\<close> have l: "- l > 0" by simp
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1023
  from der [THEN has_field_derivativeD, THEN tendstoD, OF l, unfolded eventually_at]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1024
  obtain s where s:   "0 < s"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1025
    and all: "\<And>xa. xa\<in>S \<Longrightarrow> xa \<noteq> x \<and> dist xa x < s \<longrightarrow> abs ((f xa - f x) / (xa - x) - l) < - l"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1026
    by (auto simp: dist_real_def)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1027
  thus ?thesis
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1028
  proof (intro exI conjI strip)
23441
ee218296d635 avoid using implicit prems in assumption
huffman
parents: 23431
diff changeset
  1029
    show "0<s" using s .
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1030
    fix h::real
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1031
    assume "0 < h" "h < s" "x - h \<in> S"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1032
    with all [of "x - h"] show "f x < f (x-h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1033
    proof (simp add: abs_if pos_less_divide_eq dist_real_def split add: if_split_asm)
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1034
      assume " - ((f (x-h) - f x) / h) < l" and h: "0 < h"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1035
      with l
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1036
      have "0 < (f (x-h) - f x) / h" by arith
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1037
      thus "f x < f (x-h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1038
        by (simp add: pos_less_divide_eq h)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1039
    qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1040
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1041
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1042
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1043
lemma DERIV_neg_dec_left:
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1044
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1045
  assumes der: "DERIV f x :> l"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1046
      and l:   "l < 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1047
  shows "\<exists>d > 0. \<forall>h > 0. h < d --> f(x) < f(x-h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1048
  using has_real_derivative_neg_dec_left[OF assms]
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1049
  by auto
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1050
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1051
lemma has_real_derivative_pos_inc_left:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1052
  fixes f :: "real => real"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1053
  shows "(f has_real_derivative l) (at x within S) \<Longrightarrow> 0 < l \<Longrightarrow> \<exists>d>0. \<forall>h>0. x - h \<in> S \<longrightarrow> h < d \<longrightarrow> f (x - h) < f x"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1054
  by (rule has_real_derivative_neg_dec_left [of "%x. - f x" "-l" x S, simplified])
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1055
      (auto simp add: DERIV_minus)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1056
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1057
lemma DERIV_pos_inc_left:
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1058
  fixes f :: "real => real"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1059
  shows "DERIV f x :> l \<Longrightarrow> 0 < l \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d --> f(x - h) < f(x)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1060
  using has_real_derivative_pos_inc_left
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1061
  by blast
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1062
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1063
lemma has_real_derivative_neg_dec_right:
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1064
  fixes f :: "real => real"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1065
  shows "(f has_real_derivative l) (at x within S) \<Longrightarrow> l < 0 \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. x + h \<in> S \<longrightarrow> h < d \<longrightarrow> f(x) > f(x + h)"
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1066
  by (rule has_real_derivative_pos_inc_right [of "%x. - f x" "-l" x S, simplified])
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1067
      (auto simp add: DERIV_minus)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1068
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1069
lemma DERIV_neg_dec_right:
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1070
  fixes f :: "real => real"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1071
  shows "DERIV f x :> l \<Longrightarrow> l < 0 \<Longrightarrow> \<exists>d > 0. \<forall>h > 0. h < d --> f(x) > f(x + h)"
63079
e9ad90ce926c some slight generalizations
immler
parents: 63040
diff changeset
  1072
  using has_real_derivative_neg_dec_right by blast
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1073
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1074
lemma DERIV_local_max:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1075
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1076
  assumes der: "DERIV f x :> l"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1077
      and d:   "0 < d"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1078
      and le:  "\<forall>y. \<bar>x-y\<bar> < d --> f(y) \<le> f(x)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1079
  shows "l = 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1080
proof (cases rule: linorder_cases [of l 0])
23441
ee218296d635 avoid using implicit prems in assumption
huffman
parents: 23431
diff changeset
  1081
  case equal thus ?thesis .
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1082
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1083
  case less
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1084
  from DERIV_neg_dec_left [OF der less]
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1085
  obtain d' where d': "0 < d'"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1086
             and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x-h)" by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1087
  from real_lbound_gt_zero [OF d d']
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1088
  obtain e where "0 < e \<and> e < d \<and> e < d'" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1089
  with lt le [THEN spec [where x="x-e"]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1090
  show ?thesis by (auto simp add: abs_if)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1091
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1092
  case greater
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1093
  from DERIV_pos_inc_right [OF der greater]
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1094
  obtain d' where d': "0 < d'"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1095
             and lt: "\<forall>h > 0. h < d' \<longrightarrow> f x < f (x + h)" by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1096
  from real_lbound_gt_zero [OF d d']
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1097
  obtain e where "0 < e \<and> e < d \<and> e < d'" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1098
  with lt le [THEN spec [where x="x+e"]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1099
  show ?thesis by (auto simp add: abs_if)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1100
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1101
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1102
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1103
text\<open>Similar theorem for a local minimum\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1104
lemma DERIV_local_min:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1105
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1106
  shows "[| DERIV f x :> l; 0 < d; \<forall>y. \<bar>x-y\<bar> < d --> f(x) \<le> f(y) |] ==> l = 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1107
by (drule DERIV_minus [THEN DERIV_local_max], auto)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1108
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1109
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1110
text\<open>In particular, if a function is locally flat\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1111
lemma DERIV_local_const:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1112
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1113
  shows "[| DERIV f x :> l; 0 < d; \<forall>y. \<bar>x-y\<bar> < d --> f(x) = f(y) |] ==> l = 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1114
by (auto dest!: DERIV_local_max)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1115
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1116
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1117
subsection \<open>Rolle's Theorem\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1118
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1119
text\<open>Lemma about introducing open ball in open interval\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1120
lemma lemma_interval_lt:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1121
     "[| a < x;  x < b |]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1122
      ==> \<exists>d::real. 0 < d & (\<forall>y. \<bar>x-y\<bar> < d --> a < y & y < b)"
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1123
22998
97e1f9c2cc46 avoid using redundant lemmas from RealDef.thy
huffman
parents: 22984
diff changeset
  1124
apply (simp add: abs_less_iff)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1125
apply (insert linorder_linear [of "x-a" "b-x"], safe)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1126
apply (rule_tac x = "x-a" in exI)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1127
apply (rule_tac [2] x = "b-x" in exI, auto)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1128
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1129
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1130
lemma lemma_interval: "[| a < x;  x < b |] ==>
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1131
        \<exists>d::real. 0 < d &  (\<forall>y. \<bar>x-y\<bar> < d --> a \<le> y & y \<le> b)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1132
apply (drule lemma_interval_lt, auto)
44921
58eef4843641 tuned proofs
huffman
parents: 44890
diff changeset
  1133
apply force
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1134
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1135
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1136
text\<open>Rolle's Theorem.
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1137
   If @{term f} is defined and continuous on the closed interval
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1138
   \<open>[a,b]\<close> and differentiable on the open interval \<open>(a,b)\<close>,
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1139
   and @{term "f(a) = f(b)"},
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1140
   then there exists \<open>x0 \<in> (a,b)\<close> such that @{term "f'(x0) = 0"}\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1141
theorem Rolle:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1142
  assumes lt: "a < b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1143
      and eq: "f(a) = f(b)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1144
      and con: "\<forall>x. a \<le> x & x \<le> b --> isCont f x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1145
      and dif [rule_format]: "\<forall>x. a < x & x < b --> f differentiable (at x)"
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1146
  shows "\<exists>z::real. a < z & z < b & DERIV f z :> 0"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1147
proof -
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1148
  have le: "a \<le> b" using lt by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1149
  from isCont_eq_Ub [OF le con]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1150
  obtain x where x_max: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f z \<le> f x"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1151
             and alex: "a \<le> x" and xleb: "x \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1152
    by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1153
  from isCont_eq_Lb [OF le con]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1154
  obtain x' where x'_min: "\<forall>z. a \<le> z \<and> z \<le> b \<longrightarrow> f x' \<le> f z"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1155
              and alex': "a \<le> x'" and x'leb: "x' \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1156
    by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1157
  show ?thesis
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1158
  proof cases
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1159
    assume axb: "a < x & x < b"
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1160
        \<comment>\<open>@{term f} attains its maximum within the interval\<close>
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1161
    hence ax: "a<x" and xb: "x<b" by arith + 
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1162
    from lemma_interval [OF ax xb]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1163
    obtain d where d: "0<d" and bound: "\<forall>y. \<bar>x-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1164
      by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1165
    hence bound': "\<forall>y. \<bar>x-y\<bar> < d \<longrightarrow> f y \<le> f x" using x_max
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1166
      by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1167
    from differentiableD [OF dif [OF axb]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1168
    obtain l where der: "DERIV f x :> l" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1169
    have "l=0" by (rule DERIV_local_max [OF der d bound'])
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1170
        \<comment>\<open>the derivative at a local maximum is zero\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1171
    thus ?thesis using ax xb der by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1172
  next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1173
    assume notaxb: "~ (a < x & x < b)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1174
    hence xeqab: "x=a | x=b" using alex xleb by arith
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1175
    hence fb_eq_fx: "f b = f x" by (auto simp add: eq)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1176
    show ?thesis
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1177
    proof cases
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1178
      assume ax'b: "a < x' & x' < b"
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1179
        \<comment>\<open>@{term f} attains its minimum within the interval\<close>
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1180
      hence ax': "a<x'" and x'b: "x'<b" by arith+ 
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1181
      from lemma_interval [OF ax' x'b]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1182
      obtain d where d: "0<d" and bound: "\<forall>y. \<bar>x'-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1183
  by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1184
      hence bound': "\<forall>y. \<bar>x'-y\<bar> < d \<longrightarrow> f x' \<le> f y" using x'_min
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1185
  by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1186
      from differentiableD [OF dif [OF ax'b]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1187
      obtain l where der: "DERIV f x' :> l" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1188
      have "l=0" by (rule DERIV_local_min [OF der d bound'])
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1189
        \<comment>\<open>the derivative at a local minimum is zero\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1190
      thus ?thesis using ax' x'b der by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1191
    next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1192
      assume notax'b: "~ (a < x' & x' < b)"
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1193
        \<comment>\<open>@{term f} is constant througout the interval\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1194
      hence x'eqab: "x'=a | x'=b" using alex' x'leb by arith
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1195
      hence fb_eq_fx': "f b = f x'" by (auto simp add: eq)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1196
      from dense [OF lt]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1197
      obtain r where ar: "a < r" and rb: "r < b" by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1198
      from lemma_interval [OF ar rb]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1199
      obtain d where d: "0<d" and bound: "\<forall>y. \<bar>r-y\<bar> < d \<longrightarrow> a \<le> y \<and> y \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1200
  by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1201
      have eq_fb: "\<forall>z. a \<le> z --> z \<le> b --> f z = f b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1202
      proof (clarify)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1203
        fix z::real
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1204
        assume az: "a \<le> z" and zb: "z \<le> b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1205
        show "f z = f b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1206
        proof (rule order_antisym)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1207
          show "f z \<le> f b" by (simp add: fb_eq_fx x_max az zb)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1208
          show "f b \<le> f z" by (simp add: fb_eq_fx' x'_min az zb)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1209
        qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1210
      qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1211
      have bound': "\<forall>y. \<bar>r-y\<bar> < d \<longrightarrow> f r = f y"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1212
      proof (intro strip)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1213
        fix y::real
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1214
        assume lt: "\<bar>r-y\<bar> < d"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1215
        hence "f y = f b" by (simp add: eq_fb bound)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1216
        thus "f r = f y" by (simp add: eq_fb ar rb order_less_imp_le)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1217
      qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1218
      from differentiableD [OF dif [OF conjI [OF ar rb]]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1219
      obtain l where der: "DERIV f r :> l" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1220
      have "l=0" by (rule DERIV_local_const [OF der d bound'])
61799
4cf66f21b764 isabelle update_cartouches -c -t;
wenzelm
parents: 61609
diff changeset
  1221
        \<comment>\<open>the derivative of a constant function is zero\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1222
      thus ?thesis using ar rb der by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1223
    qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1224
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1225
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1226
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1227
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1228
subsection\<open>Mean Value Theorem\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1229
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1230
lemma lemma_MVT:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1231
     "f a - (f b - f a)/(b-a) * a = f b - (f b - f a)/(b-a) * (b::real)"
51481
ef949192e5d6 move continuous_on_inv to HOL image (simplifies isCont_inverse_function)
hoelzl
parents: 51480
diff changeset
  1232
  by (cases "a = b") (simp_all add: field_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1233
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1234
theorem MVT:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1235
  assumes lt:  "a < b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1236
      and con: "\<forall>x. a \<le> x & x \<le> b --> isCont f x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1237
      and dif [rule_format]: "\<forall>x. a < x & x < b --> f differentiable (at x)"
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1238
  shows "\<exists>l z::real. a < z & z < b & DERIV f z :> l &
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1239
                   (f(b) - f(a) = (b-a) * l)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1240
proof -
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1241
  let ?F = "%x. f x - ((f b - f a) / (b-a)) * x"
44233
aa74ce315bae add simp rules for isCont
huffman
parents: 44209
diff changeset
  1242
  have contF: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont ?F x"
56371
fb9ae0727548 extend continuous_intros; remove continuous_on_intros and isCont_intros
hoelzl
parents: 56369
diff changeset
  1243
    using con by (fast intro: continuous_intros)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1244
  have difF: "\<forall>x. a < x \<and> x < b \<longrightarrow> ?F differentiable (at x)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1245
  proof (clarify)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1246
    fix x::real
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1247
    assume ax: "a < x" and xb: "x < b"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1248
    from differentiableD [OF dif [OF conjI [OF ax xb]]]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1249
    obtain l where der: "DERIV f x :> l" ..
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1250
    show "?F differentiable (at x)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1251
      by (rule differentiableI [where D = "l - (f b - f a)/(b-a)"],
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1252
          blast intro: DERIV_diff DERIV_cmult_Id der)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1253
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1254
  from Rolle [where f = ?F, OF lt lemma_MVT contF difF]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1255
  obtain z where az: "a < z" and zb: "z < b" and der: "DERIV ?F z :> 0"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1256
    by blast
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1257
  have "DERIV (%x. ((f b - f a)/(b-a)) * x) z :> (f b - f a)/(b-a)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1258
    by (rule DERIV_cmult_Id)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1259
  hence derF: "DERIV (\<lambda>x. ?F x + (f b - f a) / (b - a) * x) z
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1260
                   :> 0 + (f b - f a) / (b - a)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1261
    by (rule DERIV_add [OF der])
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1262
  show ?thesis
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1263
  proof (intro exI conjI)
23441
ee218296d635 avoid using implicit prems in assumption
huffman
parents: 23431
diff changeset
  1264
    show "a < z" using az .
ee218296d635 avoid using implicit prems in assumption
huffman
parents: 23431
diff changeset
  1265
    show "z < b" using zb .
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1266
    show "f b - f a = (b - a) * ((f b - f a)/(b-a))" by (simp)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1267
    show "DERIV f z :> ((f b - f a)/(b-a))"  using derF by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1268
  qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1269
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1270
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1271
lemma MVT2:
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1272
     "[| a < b; \<forall>x. a \<le> x & x \<le> b --> DERIV f x :> f'(x) |]
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1273
      ==> \<exists>z::real. a < z & z < b & (f b - f a = (b - a) * f'(z))"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1274
apply (drule MVT)
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1275
apply (blast intro: DERIV_isCont)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1276
apply (force dest: order_less_imp_le simp add: real_differentiable_def)
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1277
apply (blast dest: DERIV_unique order_less_imp_le)
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1278
done
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1279
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1280
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1281
text\<open>A function is constant if its derivative is 0 over an interval.\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1282
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1283
lemma DERIV_isconst_end:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1284
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1285
  shows "[| a < b;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1286
         \<forall>x. a \<le> x & x \<le> b --> isCont f x;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1287
         \<forall>x. a < x & x < b --> DERIV f x :> 0 |]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1288
        ==> f b = f a"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1289
apply (drule MVT, assumption)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1290
apply (blast intro: differentiableI)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1291
apply (auto dest!: DERIV_unique simp add: diff_eq_eq)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1292
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1293
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1294
lemma DERIV_isconst1:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1295
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1296
  shows "[| a < b;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1297
         \<forall>x. a \<le> x & x \<le> b --> isCont f x;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1298
         \<forall>x. a < x & x < b --> DERIV f x :> 0 |]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1299
        ==> \<forall>x. a \<le> x & x \<le> b --> f x = f a"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1300
apply safe
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1301
apply (drule_tac x = a in order_le_imp_less_or_eq, safe)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1302
apply (drule_tac b = x in DERIV_isconst_end, auto)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1303
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1304
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1305
lemma DERIV_isconst2:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1306
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1307
  shows "[| a < b;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1308
         \<forall>x. a \<le> x & x \<le> b --> isCont f x;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1309
         \<forall>x. a < x & x < b --> DERIV f x :> 0;
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1310
         a \<le> x; x \<le> b |]
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1311
        ==> f x = f a"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1312
apply (blast dest: DERIV_isconst1)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1313
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1314
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1315
lemma DERIV_isconst3: fixes a b x y :: real
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1316
  assumes "a < b" and "x \<in> {a <..< b}" and "y \<in> {a <..< b}"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1317
  assumes derivable: "\<And>x. x \<in> {a <..< b} \<Longrightarrow> DERIV f x :> 0"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1318
  shows "f x = f y"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1319
proof (cases "x = y")
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1320
  case False
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1321
  let ?a = "min x y"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1322
  let ?b = "max x y"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1323
  
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1324
  have "\<forall>z. ?a \<le> z \<and> z \<le> ?b \<longrightarrow> DERIV f z :> 0"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1325
  proof (rule allI, rule impI)
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1326
    fix z :: real assume "?a \<le> z \<and> z \<le> ?b"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1327
    hence "a < z" and "z < b" using \<open>x \<in> {a <..< b}\<close> and \<open>y \<in> {a <..< b}\<close> by auto
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1328
    hence "z \<in> {a<..<b}" by auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1329
    thus "DERIV f z :> 0" by (rule derivable)
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1330
  qed
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1331
  hence isCont: "\<forall>z. ?a \<le> z \<and> z \<le> ?b \<longrightarrow> isCont f z"
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1332
    and DERIV: "\<forall>z. ?a < z \<and> z < ?b \<longrightarrow> DERIV f z :> 0" using DERIV_isCont by auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1333
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1334
  have "?a < ?b" using \<open>x \<noteq> y\<close> by auto
29803
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1335
  from DERIV_isconst2[OF this isCont DERIV, of x] and DERIV_isconst2[OF this isCont DERIV, of y]
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1336
  show ?thesis by auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1337
qed auto
c56a5571f60a Added derivation lemmas for power series and theorems for the pi, arcus tangens and logarithm series
hoelzl
parents: 29667
diff changeset
  1338
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1339
lemma DERIV_isconst_all:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1340
  fixes f :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1341
  shows "\<forall>x. DERIV f x :> 0 ==> f(x) = f(y)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1342
apply (rule linorder_cases [of x y])
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1343
apply (blast intro: sym DERIV_isCont DERIV_isconst_end)+
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1344
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1345
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1346
lemma DERIV_const_ratio_const:
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1347
  fixes f :: "real => real"
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1348
  shows "[|a \<noteq> b; \<forall>x. DERIV f x :> k |] ==> (f(b) - f(a)) = (b-a) * k"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1349
apply (rule linorder_cases [of a b], auto)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1350
apply (drule_tac [!] f = f in MVT)
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1351
apply (auto dest: DERIV_isCont DERIV_unique simp add: real_differentiable_def)
54230
b1d955791529 more simplification rules on unary and binary minus
haftmann
parents: 53381
diff changeset
  1352
apply (auto dest: DERIV_unique simp add: ring_distribs)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1353
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1354
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1355
lemma DERIV_const_ratio_const2:
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1356
  fixes f :: "real => real"
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1357
  shows "[|a \<noteq> b; \<forall>x. DERIV f x :> k |] ==> (f(b) - f(a))/(b-a) = k"
56217
dc429a5b13c4 Some rationalisation of basic lemmas
paulson <lp15@cam.ac.uk>
parents: 56182
diff changeset
  1358
apply (rule_tac c1 = "b-a" in mult_right_cancel [THEN iffD1])
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
  1359
apply (auto dest!: DERIV_const_ratio_const simp add: mult.assoc)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1360
done
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1361
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1362
lemma real_average_minus_first [simp]: "((a + b) /2 - a) = (b-a)/(2::real)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1363
by (simp)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1364
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1365
lemma real_average_minus_second [simp]: "((b + a)/2 - a) = (b-a)/(2::real)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1366
by (simp)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1367
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1368
text\<open>Gallileo's "trick": average velocity = av. of end velocities\<close>
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1369
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1370
lemma DERIV_const_average:
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1371
  fixes v :: "real => real"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1372
  assumes neq: "a \<noteq> (b::real)"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1373
      and der: "\<forall>x. DERIV v x :> k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1374
  shows "v ((a + b)/2) = (v a + v b)/2"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1375
proof (cases rule: linorder_cases [of a b])
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1376
  case equal with neq show ?thesis by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1377
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1378
  case less
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1379
  have "(v b - v a) / (b - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1380
    by (rule DERIV_const_ratio_const2 [OF neq der])
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1381
  hence "(b-a) * ((v b - v a) / (b-a)) = (b-a) * k" by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1382
  moreover have "(v ((a + b) / 2) - v a) / ((a + b) / 2 - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1383
    by (rule DERIV_const_ratio_const2 [OF _ der], simp add: neq)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1384
  ultimately show ?thesis using neq by force
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1385
next
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1386
  case greater
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1387
  have "(v b - v a) / (b - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1388
    by (rule DERIV_const_ratio_const2 [OF neq der])
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1389
  hence "(b-a) * ((v b - v a) / (b-a)) = (b-a) * k" by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1390
  moreover have " (v ((b + a) / 2) - v a) / ((b + a) / 2 - a) = k"
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1391
    by (rule DERIV_const_ratio_const2 [OF _ der], simp add: neq)
57512
cc97b347b301 reduced name variants for assoc and commute on plus and mult
haftmann
parents: 57418
diff changeset
  1392
  ultimately show ?thesis using neq by (force simp add: add.commute)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1393
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1394
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1395
(* A function with positive derivative is increasing. 
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1396
   A simple proof using the MVT, by Jeremy Avigad. And variants.
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1397
*)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1398
lemma DERIV_pos_imp_increasing_open:
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1399
  fixes a::real and b::real and f::"real => real"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1400
  assumes "a < b" and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (EX y. DERIV f x :> y & y > 0)"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1401
      and con: "\<And>x. a \<le> x \<Longrightarrow> x \<le> b \<Longrightarrow> isCont f x"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1402
  shows "f a < f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1403
proof (rule ccontr)
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1404
  assume f: "~ f a < f b"
33690
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1405
  have "EX l z. a < z & z < b & DERIV f z :> l
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1406
      & f b - f a = (b - a) * l"
33690
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1407
    apply (rule MVT)
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1408
      using assms Deriv.differentiableI
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1409
      apply force+
33690
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1410
    done
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1411
  then obtain l z where z: "a < z" "z < b" "DERIV f z :> l"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1412
      and "f b - f a = (b - a) * l"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1413
    by auto
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1414
  with assms f have "~(l > 0)"
36777
be5461582d0f avoid using real-specific versions of generic lemmas
huffman
parents: 35216
diff changeset
  1415
    by (metis linorder_not_le mult_le_0_iff diff_le_0_iff_le)
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1416
  with assms z show False
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1417
    by (metis DERIV_unique)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1418
qed
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1419
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1420
lemma DERIV_pos_imp_increasing:
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1421
  fixes a::real and b::real and f::"real => real"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1422
  assumes "a < b" and "\<forall>x. a \<le> x & x \<le> b --> (EX y. DERIV f x :> y & y > 0)"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1423
  shows "f a < f b"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1424
by (metis DERIV_pos_imp_increasing_open [of a b f] assms DERIV_continuous less_imp_le)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1425
45791
d985ec974815 more systematic lemma name
noschinl
parents: 45600
diff changeset
  1426
lemma DERIV_nonneg_imp_nondecreasing:
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1427
  fixes a::real and b::real and f::"real => real"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1428
  assumes "a \<le> b" and
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1429
    "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y \<ge> 0)"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1430
  shows "f a \<le> f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1431
proof (rule ccontr, cases "a = b")
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1432
  assume "~ f a \<le> f b" and "a = b"
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1433
  then show False by auto
37891
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1434
next
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1435
  assume A: "~ f a \<le> f b"
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1436
  assume B: "a ~= b"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1437
  with assms have "EX l z. a < z & z < b & DERIV f z :> l
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1438
      & f b - f a = (b - a) * l"
33690
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1439
    apply -
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1440
    apply (rule MVT)
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1441
      apply auto
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1442
      apply (metis DERIV_isCont)
36777
be5461582d0f avoid using real-specific versions of generic lemmas
huffman
parents: 35216
diff changeset
  1443
     apply (metis differentiableI less_le)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1444
    done
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1445
  then obtain l z where z: "a < z" "z < b" "DERIV f z :> l"
37891
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1446
      and C: "f b - f a = (b - a) * l"
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1447
    by auto
37891
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1448
  with A have "a < b" "f b < f a" by auto
c26f9d06e82c robustified metis proof
haftmann
parents: 37888
diff changeset
  1449
  with C have "\<not> l \<ge> 0" by (auto simp add: not_le algebra_simps)
45051
c478d1876371 discontinued legacy theorem names from RealDef.thy
huffman
parents: 44921
diff changeset
  1450
    (metis A add_le_cancel_right assms(1) less_eq_real_def mult_right_mono add_left_mono linear order_refl)
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1451
  with assms z show False
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1452
    by (metis DERIV_unique order_less_imp_le)
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1453
qed
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1454
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1455
lemma DERIV_neg_imp_decreasing_open:
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1456
  fixes a::real and b::real and f::"real => real"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1457
  assumes "a < b" and "\<And>x. a < x \<Longrightarrow> x < b \<Longrightarrow> (EX y. DERIV f x :> y & y < 0)"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1458
      and con: "\<And>x. a \<le> x \<Longrightarrow> x \<le> b \<Longrightarrow> isCont f x"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1459
  shows "f a > f b"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1460
proof -
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1461
  have "(%x. -f x) a < (%x. -f x) b"
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1462
    apply (rule DERIV_pos_imp_increasing_open [of a b "%x. -f x"])
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1463
    using assms
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1464
    apply auto
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1465
    apply (metis field_differentiable_minus neg_0_less_iff_less)
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1466
    done
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1467
  thus ?thesis
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1468
    by simp
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1469
qed
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1470
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1471
lemma DERIV_neg_imp_decreasing:
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1472
  fixes a::real and b::real and f::"real => real"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1473
  assumes "a < b" and
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1474
    "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y < 0)"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1475
  shows "f a > f b"
56261
918432e3fcfa rearranging some deriv theorems
paulson <lp15@cam.ac.uk>
parents: 56219
diff changeset
  1476
by (metis DERIV_neg_imp_decreasing_open [of a b f] assms DERIV_continuous less_imp_le)
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1477
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1478
lemma DERIV_nonpos_imp_nonincreasing:
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1479
  fixes a::real and b::real and f::"real => real"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1480
  assumes "a \<le> b" and
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1481
    "\<forall>x. a \<le> x & x \<le> b --> (\<exists>y. DERIV f x :> y & y \<le> 0)"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1482
  shows "f a \<ge> f b"
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1483
proof -
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1484
  have "(%x. -f x) a \<le> (%x. -f x) b"
45791
d985ec974815 more systematic lemma name
noschinl
parents: 45600
diff changeset
  1485
    apply (rule DERIV_nonneg_imp_nondecreasing [of a b "%x. -f x"])
33690
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1486
    using assms
889d06128608 simplified bulky metis proofs;
wenzelm
parents: 33659
diff changeset
  1487
    apply auto
33654
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1488
    apply (metis DERIV_minus neg_0_le_iff_le)
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1489
    done
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1490
  thus ?thesis
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1491
    by simp
abf780db30ea A number of theorems contributed by Jeremy Avigad
paulson
parents: 31902
diff changeset
  1492
qed
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1493
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1494
lemma DERIV_pos_imp_increasing_at_bot:
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1495
  fixes f :: "real => real"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1496
  assumes "\<And>x. x \<le> b \<Longrightarrow> (EX y. DERIV f x :> y & y > 0)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1497
      and lim: "(f \<longlongrightarrow> flim) at_bot"
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1498
  shows "flim < f b"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1499
proof -
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1500
  have "flim \<le> f (b - 1)"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1501
    apply (rule tendsto_ge_const [OF _ lim])
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1502
    apply (auto simp: trivial_limit_at_bot_linorder eventually_at_bot_linorder)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1503
    apply (rule_tac x="b - 2" in exI)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1504
    apply (force intro: order.strict_implies_order DERIV_pos_imp_increasing [where f=f] assms)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1505
    done
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1506
  also have "... < f b"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1507
    by (force intro: DERIV_pos_imp_increasing [where f=f] assms)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1508
  finally show ?thesis .
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1509
qed
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1510
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1511
lemma DERIV_neg_imp_decreasing_at_top:
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1512
  fixes f :: "real => real"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1513
  assumes der: "\<And>x. x \<ge> b \<Longrightarrow> (EX y. DERIV f x :> y & y < 0)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1514
      and lim: "(f \<longlongrightarrow> flim) at_top"
56289
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1515
  shows "flim < f b"
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1516
  apply (rule DERIV_pos_imp_increasing_at_bot [where f = "\<lambda>i. f (-i)" and b = "-b", simplified])
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1517
  apply (metis DERIV_mirror der le_minus_iff neg_0_less_iff_less)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1518
  apply (metis filterlim_at_top_mirror lim)
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1519
  done
d8d2a2b97168 Some useful lemmas
paulson <lp15@cam.ac.uk>
parents: 56261
diff changeset
  1520
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1521
text \<open>Derivative of inverse function\<close>
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1522
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1523
lemma DERIV_inverse_function:
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1524
  fixes f g :: "real \<Rightarrow> real"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1525
  assumes der: "DERIV f (g x) :> D"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1526
  assumes neq: "D \<noteq> 0"
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1527
  assumes a: "a < x" and b: "x < b"
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1528
  assumes inj: "\<forall>y. a < y \<and> y < b \<longrightarrow> f (g y) = y"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1529
  assumes cont: "isCont g x"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1530
  shows "DERIV g x :> inverse D"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1531
unfolding DERIV_iff2
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1532
proof (rule LIM_equal2)
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1533
  show "0 < min (x - a) (b - x)"
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1534
    using a b by arith 
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1535
next
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1536
  fix y
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1537
  assume "norm (y - x) < min (x - a) (b - x)"
27668
6eb20b2cecf8 Tuned and simplified proofs
chaieb
parents: 26120
diff changeset
  1538
  hence "a < y" and "y < b" 
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1539
    by (simp_all add: abs_less_iff)
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1540
  thus "(g y - g x) / (y - x) =
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1541
        inverse ((f (g y) - x) / (g y - g x))"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1542
    by (simp add: inj)
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1543
next
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1544
  have "(\<lambda>z. (f z - f (g x)) / (z - g x)) \<midarrow>g x\<rightarrow> D"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1545
    by (rule der [unfolded DERIV_iff2])
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1546
  hence 1: "(\<lambda>z. (f z - x) / (z - g x)) \<midarrow>g x\<rightarrow> D"
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1547
    using inj a b by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1548
  have 2: "\<exists>d>0. \<forall>y. y \<noteq> x \<and> norm (y - x) < d \<longrightarrow> g y \<noteq> g x"
56219
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
  1549
  proof (rule exI, safe)
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1550
    show "0 < min (x - a) (b - x)"
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1551
      using a b by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1552
  next
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1553
    fix y
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1554
    assume "norm (y - x) < min (x - a) (b - x)"
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1555
    hence y: "a < y" "y < b"
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1556
      by (simp_all add: abs_less_iff)
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1557
    assume "g y = g x"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1558
    hence "f (g y) = f (g x)" by simp
23044
2ad82c359175 change premises of DERIV_inverse_function lemma
huffman
parents: 23041
diff changeset
  1559
    hence "y = x" using inj y a b by simp
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1560
    also assume "y \<noteq> x"
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1561
    finally show False by simp
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1562
  qed
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1563
  have "(\<lambda>y. (f (g y) - x) / (g y - g x)) \<midarrow>x\<rightarrow> D"
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1564
    using cont 1 2 by (rule isCont_LIM_compose2)
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1565
  thus "(\<lambda>y. inverse ((f (g y) - x) / (g y - g x)))
61976
3a27957ac658 more symbols;
wenzelm
parents: 61973
diff changeset
  1566
        \<midarrow>x\<rightarrow> inverse D"
44568
e6f291cb5810 discontinue many legacy theorems about LIM and LIMSEQ, in favor of tendsto theorems
huffman
parents: 44317
diff changeset
  1567
    using neq by (rule tendsto_inverse)
23041
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1568
qed
a0f26d47369b add lemma DERIV_inverse_function
huffman
parents: 22998
diff changeset
  1569
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1570
subsection \<open>Generalized Mean Value Theorem\<close>
29975
28c5322f0df3 more subsection headings
huffman
parents: 29803
diff changeset
  1571
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1572
theorem GMVT:
21784
e76faa6e65fd changed (ns)deriv to take functions of type 'a::real_normed_field => 'a
huffman
parents: 21404
diff changeset
  1573
  fixes a b :: real
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1574
  assumes alb: "a < b"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1575
    and fc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont f x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1576
    and fd: "\<forall>x. a < x \<and> x < b \<longrightarrow> f differentiable (at x)"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1577
    and gc: "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont g x"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1578
    and gd: "\<forall>x. a < x \<and> x < b \<longrightarrow> g differentiable (at x)"
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1579
  shows "\<exists>g'c f'c c.
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1580
    DERIV g c :> g'c \<and> DERIV f c :> f'c \<and> a < c \<and> c < b \<and> ((f b - f a) * g'c) = ((g b - g a) * f'c)"
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1581
proof -
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1582
  let ?h = "\<lambda>x. (f b - f a)*(g x) - (g b - g a)*(f x)"
41550
efa734d9b221 eliminated global prems;
wenzelm
parents: 41368
diff changeset
  1583
  from assms have "a < b" by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1584
  moreover have "\<forall>x. a \<le> x \<and> x \<le> b \<longrightarrow> isCont ?h x"
44233
aa74ce315bae add simp rules for isCont
huffman
parents: 44209
diff changeset
  1585
    using fc gc by simp
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1586
  moreover have "\<forall>x. a < x \<and> x < b \<longrightarrow> ?h differentiable (at x)"
44233
aa74ce315bae add simp rules for isCont
huffman
parents: 44209
diff changeset
  1587
    using fd gd by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1588
  ultimately have "\<exists>l z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l" by (rule MVT)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1589
  then obtain l where ldef: "\<exists>z. a < z \<and> z < b \<and> DERIV ?h z :> l \<and> ?h b - ?h a = (b - a) * l" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1590
  then obtain c where cdef: "a < c \<and> c < b \<and> DERIV ?h c :> l \<and> ?h b - ?h a = (b - a) * l" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1591
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1592
  from cdef have cint: "a < c \<and> c < b" by auto
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1593
  with gd have "g differentiable (at c)" by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1594
  hence "\<exists>D. DERIV g c :> D" by (rule differentiableD)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1595
  then obtain g'c where g'cdef: "DERIV g c :> g'c" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1596
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1597
  from cdef have "a < c \<and> c < b" by auto
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1598
  with fd have "f differentiable (at c)" by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1599
  hence "\<exists>D. DERIV f c :> D" by (rule differentiableD)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1600
  then obtain f'c where f'cdef: "DERIV f c :> f'c" ..
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1601
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1602
  from cdef have "DERIV ?h c :> l" by auto
41368
8afa26855137 use DERIV_intros
hoelzl
parents: 37891
diff changeset
  1603
  moreover have "DERIV ?h c :>  g'c * (f b - f a) - f'c * (g b - g a)"
56381
0556204bc230 merged DERIV_intros, has_derivative_intros into derivative_intros
hoelzl
parents: 56371
diff changeset
  1604
    using g'cdef f'cdef by (auto intro!: derivative_eq_intros)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1605
  ultimately have leq: "l =  g'c * (f b - f a) - f'c * (g b - g a)" by (rule DERIV_unique)
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1606
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1607
  {
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1608
    from cdef have "?h b - ?h a = (b - a) * l" by auto
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  1609
    also from leq have "\<dots> = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))" by simp
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1610
    finally have "?h b - ?h a = (b - a) * (g'c * (f b - f a) - f'c * (g b - g a))" by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1611
  }
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1612
  moreover
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1613
  {
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1614
    have "?h b - ?h a =
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1615
         ((f b)*(g b) - (f a)*(g b) - (g b)*(f b) + (g a)*(f b)) -
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1616
          ((f b)*(g a) - (f a)*(g a) - (g b)*(f a) + (g a)*(f a))"
29667
53103fc8ffa3 Replaced group_ and ring_simps by algebra_simps;
nipkow
parents: 29472
diff changeset
  1617
      by (simp add: algebra_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1618
    hence "?h b - ?h a = 0" by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1619
  }
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1620
  ultimately have "(b - a) * (g'c * (f b - f a) - f'c * (g b - g a)) = 0" by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1621
  with alb have "g'c * (f b - f a) - f'c * (g b - g a) = 0" by simp
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1622
  hence "g'c * (f b - f a) = f'c * (g b - g a)" by simp
57514
bdc2c6b40bf2 prefer ac_simps collections over separate name bindings for add and mult
haftmann
parents: 57512
diff changeset
  1623
  hence "(f b - f a) * g'c = (g b - g a) * f'c" by (simp add: ac_simps)
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1624
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1625
  with g'cdef f'cdef cint show ?thesis by auto
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1626
qed
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1627
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1628
lemma GMVT':
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1629
  fixes f g :: "real \<Rightarrow> real"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1630
  assumes "a < b"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1631
  assumes isCont_f: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont f z"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1632
  assumes isCont_g: "\<And>z. a \<le> z \<Longrightarrow> z \<le> b \<Longrightarrow> isCont g z"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1633
  assumes DERIV_g: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV g z :> (g' z)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1634
  assumes DERIV_f: "\<And>z. a < z \<Longrightarrow> z < b \<Longrightarrow> DERIV f z :> (f' z)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1635
  shows "\<exists>c. a < c \<and> c < b \<and> (f b - f a) * g' c = (g b - g a) * f' c"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1636
proof -
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1637
  have "\<exists>g'c f'c c. DERIV g c :> g'c \<and> DERIV f c :> f'c \<and>
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1638
    a < c \<and> c < b \<and> (f b - f a) * g'c = (g b - g a) * f'c"
56181
2aa0b19e74f3 unify syntax for has_derivative and differentiable
hoelzl
parents: 55970
diff changeset
  1639
    using assms by (intro GMVT) (force simp: real_differentiable_def)+
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1640
  then obtain c where "a < c" "c < b" "(f b - f a) * g' c = (g b - g a) * f' c"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1641
    using DERIV_f DERIV_g by (force dest: DERIV_unique)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1642
  then show ?thesis
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1643
    by auto
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1644
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1645
51529
2d2f59e6055a move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
hoelzl
parents: 51526
diff changeset
  1646
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1647
subsection \<open>L'Hopitals rule\<close>
51529
2d2f59e6055a move theorems about compactness of real closed intervals, the intermediate value theorem, and lemmas about continuity of bijective functions from Deriv.thy to Limits.thy
hoelzl
parents: 51526
diff changeset
  1648
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1649
lemma isCont_If_ge:
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1650
  fixes a :: "'a :: linorder_topology"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1651
  shows "continuous (at_left a) g \<Longrightarrow> (f \<longlongrightarrow> g a) (at_right a) \<Longrightarrow> isCont (\<lambda>x. if x \<le> a then g x else f x) a"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1652
  unfolding isCont_def continuous_within
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1653
  apply (intro filterlim_split_at)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1654
  apply (subst filterlim_cong[OF refl refl, where g=g])
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1655
  apply (simp_all add: eventually_at_filter less_le)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1656
  apply (subst filterlim_cong[OF refl refl, where g=f])
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1657
  apply (simp_all add: eventually_at_filter less_le)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1658
  done
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1659
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1660
lemma lhopital_right_0:
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1661
  fixes f0 g0 :: "real \<Rightarrow> real"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1662
  assumes f_0: "(f0 \<longlongrightarrow> 0) (at_right 0)"
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1663
  assumes g_0: "(g0 \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1664
  assumes ev:
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1665
    "eventually (\<lambda>x. g0 x \<noteq> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1666
    "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)"
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1667
    "eventually (\<lambda>x. DERIV f0 x :> f' x) (at_right 0)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1668
    "eventually (\<lambda>x. DERIV g0 x :> g' x) (at_right 0)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1669
  assumes lim: "((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> x) (at_right 0)"
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1670
  shows "((\<lambda> x. f0 x / g0 x) \<longlongrightarrow> x) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1671
proof -
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
  1672
  define f where [abs_def]: "f x = (if x \<le> 0 then 0 else f0 x)" for x
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1673
  then have "f 0 = 0" by simp
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1674
63040
eb4ddd18d635 eliminated old 'def';
wenzelm
parents: 62398
diff changeset
  1675
  define g where [abs_def]: "g x = (if x \<le> 0 then 0 else g0 x)" for x
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1676
  then have "g 0 = 0" by simp
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1677
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1678
  have "eventually (\<lambda>x. g0 x \<noteq> 0 \<and> g' x \<noteq> 0 \<and>
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1679
      DERIV f0 x :> (f' x) \<and> DERIV g0 x :> (g' x)) (at_right 0)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1680
    using ev by eventually_elim auto
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1681
  then obtain a where [arith]: "0 < a"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1682
    and g0_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g0 x \<noteq> 0"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1683
    and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0"
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1684
    and f0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV f0 x :> (f' x)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1685
    and g0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> DERIV g0 x :> (g' x)"
56219
bf80d125406b tuned proofs;
wenzelm
parents: 56217
diff changeset
  1686
    unfolding eventually_at by (auto simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1687
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1688
  have g_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g x \<noteq> 0"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1689
    using g0_neq_0 by (simp add: g_def)
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1690
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1691
  { fix x assume x: "0 < x" "x < a" then have "DERIV f x :> (f' x)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1692
      by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ f0[OF x]])
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1693
         (auto simp: f_def eventually_nhds_metric dist_real_def intro!: exI[of _ x]) }
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1694
  note f = this
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1695
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1696
  { fix x assume x: "0 < x" "x < a" then have "DERIV g x :> (g' x)"
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1697
      by (intro DERIV_cong_ev[THEN iffD1, OF _ _ _ g0[OF x]])
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1698
         (auto simp: g_def eventually_nhds_metric dist_real_def intro!: exI[of _ x]) }
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1699
  note g = this
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1700
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1701
  have "isCont f 0"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1702
    unfolding f_def by (intro isCont_If_ge f_0 continuous_const)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1703
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1704
  have "isCont g 0"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1705
    unfolding g_def by (intro isCont_If_ge g_0 continuous_const)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1706
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1707
  have "\<exists>\<zeta>. \<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1708
  proof (rule bchoice, rule)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1709
    fix x assume "x \<in> {0 <..< a}"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1710
    then have x[arith]: "0 < x" "x < a" by auto
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1711
    with g'_neq_0 g_neq_0 \<open>g 0 = 0\<close> have g': "\<And>x. 0 < x \<Longrightarrow> x < a  \<Longrightarrow> 0 \<noteq> g' x" "g 0 \<noteq> g x"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1712
      by auto
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1713
    have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont f x"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1714
      using \<open>isCont f 0\<close> f by (auto intro: DERIV_isCont simp: le_less)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1715
    moreover have "\<And>x. 0 \<le> x \<Longrightarrow> x < a \<Longrightarrow> isCont g x"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1716
      using \<open>isCont g 0\<close> g by (auto intro: DERIV_isCont simp: le_less)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1717
    ultimately have "\<exists>c. 0 < c \<and> c < x \<and> (f x - f 0) * g' c = (g x - g 0) * f' c"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1718
      using f g \<open>x < a\<close> by (intro GMVT') auto
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  1719
    then obtain c where *: "0 < c" "c < x" "(f x - f 0) * g' c = (g x - g 0) * f' c"
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  1720
      by blast
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1721
    moreover
53374
a14d2a854c02 tuned proofs -- clarified flow of facts wrt. calculation;
wenzelm
parents: 51642
diff changeset
  1722
    from * g'(1)[of c] g'(2) have "(f x - f 0)  / (g x - g 0) = f' c / g' c"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1723
      by (simp add: field_simps)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1724
    ultimately show "\<exists>y. 0 < y \<and> y < x \<and> f x / g x = f' y / g' y"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1725
      using \<open>f 0 = 0\<close> \<open>g 0 = 0\<close> by (auto intro!: exI[of _ c])
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1726
  qed
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1727
  then obtain \<zeta> where "\<forall>x\<in>{0 <..< a}. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)" ..
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1728
  then have \<zeta>: "eventually (\<lambda>x. 0 < \<zeta> x \<and> \<zeta> x < x \<and> f x / g x = f' (\<zeta> x) / g' (\<zeta> x)) (at_right 0)"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1729
    unfolding eventually_at by (intro exI[of _ a]) (auto simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1730
  moreover
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1731
  from \<zeta> have "eventually (\<lambda>x. norm (\<zeta> x) \<le> x) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1732
    by eventually_elim auto
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1733
  then have "((\<lambda>x. norm (\<zeta> x)) \<longlongrightarrow> 0) (at_right 0)"
58729
e8ecc79aee43 add tendsto_const and tendsto_ident_at as simp and intro rules
hoelzl
parents: 57953
diff changeset
  1734
    by (rule_tac real_tendsto_sandwich[where f="\<lambda>x. 0" and h="\<lambda>x. x"]) auto
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1735
  then have "(\<zeta> \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1736
    by (rule tendsto_norm_zero_cancel)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1737
  with \<zeta> have "filterlim \<zeta> (at_right 0) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  1738
    by (auto elim!: eventually_mono simp: filterlim_at)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1739
  from this lim have "((\<lambda>t. f' (\<zeta> t) / g' (\<zeta> t)) \<longlongrightarrow> x) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1740
    by (rule_tac filterlim_compose[of _ _ _ \<zeta>])
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1741
  ultimately have "((\<lambda>t. f t / g t) \<longlongrightarrow> x) (at_right 0)" (is ?P)
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1742
    by (rule_tac filterlim_cong[THEN iffD1, OF refl refl])
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  1743
       (auto elim: eventually_mono)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1744
  also have "?P \<longleftrightarrow> ?thesis"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1745
    by (rule filterlim_cong) (auto simp: f_def g_def eventually_at_filter)
50329
9bd6b6b8a554 weakened assumptions for lhopital_right_0
hoelzl
parents: 50328
diff changeset
  1746
  finally show ?thesis .
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1747
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1748
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1749
lemma lhopital_right:
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1750
  "((f::real \<Rightarrow> real) \<longlongrightarrow> 0) (at_right x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at_right x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1751
    eventually (\<lambda>x. g x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1752
    eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1753
    eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1754
    eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1755
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_right x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1756
  ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_right x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1757
  unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1758
  by (rule lhopital_right_0)
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1759
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1760
lemma lhopital_left:
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1761
  "((f::real \<Rightarrow> real) \<longlongrightarrow> 0) (at_left x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at_left x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1762
    eventually (\<lambda>x. g x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1763
    eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1764
    eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1765
    eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1766
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_left x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1767
  ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_left x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1768
  unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  1769
  by (rule lhopital_right[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror)
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1770
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1771
lemma lhopital:
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1772
  "((f::real \<Rightarrow> real) \<longlongrightarrow> 0) (at x) \<Longrightarrow> (g \<longlongrightarrow> 0) (at x) \<Longrightarrow>
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1773
    eventually (\<lambda>x. g x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1774
    eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1775
    eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1776
    eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1777
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1778
  ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1779
  unfolding eventually_at_split filterlim_at_split
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1780
  by (auto intro!: lhopital_right[of f x g g' f'] lhopital_left[of f x g g' f'])
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1781
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1782
lemma lhopital_right_0_at_top:
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1783
  fixes f g :: "real \<Rightarrow> real"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1784
  assumes g_0: "LIM x at_right 0. g x :> at_top"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1785
  assumes ev:
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1786
    "eventually (\<lambda>x. g' x \<noteq> 0) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1787
    "eventually (\<lambda>x. DERIV f x :> f' x) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1788
    "eventually (\<lambda>x. DERIV g x :> g' x) (at_right 0)"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1789
  assumes lim: "((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> x) (at_right 0)"
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1790
  shows "((\<lambda> x. f x / g x) \<longlongrightarrow> x) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1791
  unfolding tendsto_iff
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1792
proof safe
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1793
  fix e :: real assume "0 < e"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1794
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1795
  with lim[unfolded tendsto_iff, rule_format, of "e / 4"]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1796
  have "eventually (\<lambda>t. dist (f' t / g' t) x < e / 4) (at_right 0)" by simp
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1797
  from eventually_conj[OF eventually_conj[OF ev(1) ev(2)] eventually_conj[OF ev(3) this]]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1798
  obtain a where [arith]: "0 < a"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1799
    and g'_neq_0: "\<And>x. 0 < x \<Longrightarrow> x < a \<Longrightarrow> g' x \<noteq> 0"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1800
    and f0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV f x :> (f' x)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1801
    and g0: "\<And>x. 0 < x \<Longrightarrow> x \<le> a \<Longrightarrow> DERIV g x :> (g' x)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1802
    and Df: "\<And>t. 0 < t \<Longrightarrow> t < a \<Longrightarrow> dist (f' t / g' t) x < e / 4"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1803
    unfolding eventually_at_le by (auto simp: dist_real_def)
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1804
    
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1805
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1806
  from Df have
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1807
    "eventually (\<lambda>t. t < a) (at_right 0)" "eventually (\<lambda>t::real. 0 < t) (at_right 0)"
51641
cd05e9fcc63d remove the within-filter, replace "at" by "at _ within UNIV" (This allows to remove a couple of redundant lemmas)
hoelzl
parents: 51529
diff changeset
  1808
    unfolding eventually_at by (auto intro!: exI[of _ a] simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1809
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1810
  moreover
50328
25b1e8686ce0 tuned proof
hoelzl
parents: 50327
diff changeset
  1811
  have "eventually (\<lambda>t. 0 < g t) (at_right 0)" "eventually (\<lambda>t. g a < g t) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  1812
    using g_0 by (auto elim: eventually_mono simp: filterlim_at_top_dense)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1813
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1814
  moreover
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1815
  have inv_g: "((\<lambda>x. inverse (g x)) \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1816
    using tendsto_inverse_0 filterlim_mono[OF g_0 at_top_le_at_infinity order_refl]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1817
    by (rule filterlim_compose)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1818
  then have "((\<lambda>x. norm (1 - g a * inverse (g x))) \<longlongrightarrow> norm (1 - g a * 0)) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1819
    by (intro tendsto_intros)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1820
  then have "((\<lambda>x. norm (1 - g a / g x)) \<longlongrightarrow> 1) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1821
    by (simp add: inverse_eq_divide)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1822
  from this[unfolded tendsto_iff, rule_format, of 1]
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1823
  have "eventually (\<lambda>x. norm (1 - g a / g x) < 2) (at_right 0)"
61810
3c5040d5694a sorted out eventually_mono
paulson <lp15@cam.ac.uk>
parents: 61799
diff changeset
  1824
    by (auto elim!: eventually_mono simp: dist_real_def)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1825
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1826
  moreover
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1827
  from inv_g have "((\<lambda>t. norm ((f a - x * g a) * inverse (g t))) \<longlongrightarrow> norm ((f a - x * g a) * 0)) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1828
    by (intro tendsto_intros)
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1829
  then have "((\<lambda>t. norm (f a - x * g a) / norm (g t)) \<longlongrightarrow> 0) (at_right 0)"
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1830
    by (simp add: inverse_eq_divide)
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1831
  from this[unfolded tendsto_iff, rule_format, of "e / 2"] \<open>0 < e\<close>
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1832
  have "eventually (\<lambda>t. norm (f a - x * g a) / norm (g t) < e / 2) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1833
    by (auto simp: dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1834
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1835
  ultimately show "eventually (\<lambda>t. dist (f t / g t) x < e) (at_right 0)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1836
  proof eventually_elim
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1837
    fix t assume t[arith]: "0 < t" "t < a" "g a < g t" "0 < g t"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1838
    assume ineq: "norm (1 - g a / g t) < 2" "norm (f a - x * g a) / norm (g t) < e / 2"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1839
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1840
    have "\<exists>y. t < y \<and> y < a \<and> (g a - g t) * f' y = (f a - f t) * g' y"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1841
      using f0 g0 t(1,2) by (intro GMVT') (force intro!: DERIV_isCont)+
53381
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1842
    then obtain y where [arith]: "t < y" "y < a"
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1843
      and D_eq0: "(g a - g t) * f' y = (f a - f t) * g' y"
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1844
      by blast
355a4cac5440 tuned proofs -- less guessing;
wenzelm
parents: 53374
diff changeset
  1845
    from D_eq0 have D_eq: "(f t - f a) / (g t - g a) = f' y / g' y"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1846
      using \<open>g a < g t\<close> g'_neq_0[of y] by (auto simp add: field_simps)
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1847
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1848
    have *: "f t / g t - x = ((f t - f a) / (g t - g a) - x) * (1 - g a / g t) + (f a - x * g a) / g t"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1849
      by (simp add: field_simps)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1850
    have "norm (f t / g t - x) \<le>
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1851
        norm (((f t - f a) / (g t - g a) - x) * (1 - g a / g t)) + norm ((f a - x * g a) / g t)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1852
      unfolding * by (rule norm_triangle_ineq)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1853
    also have "\<dots> = dist (f' y / g' y) x * norm (1 - g a / g t) + norm (f a - x * g a) / norm (g t)"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1854
      by (simp add: abs_mult D_eq dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1855
    also have "\<dots> < (e / 4) * 2 + e / 2"
60758
d8d85a8172b5 isabelle update_cartouches;
wenzelm
parents: 60177
diff changeset
  1856
      using ineq Df[of y] \<open>0 < e\<close> by (intro add_le_less_mono mult_mono) auto
50327
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1857
    finally show "dist (f t / g t) x < e"
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1858
      by (simp add: dist_real_def)
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1859
  qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1860
qed
bbea2e82871c add L'Hôpital's rule
hoelzl
parents: 47108
diff changeset
  1861
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1862
lemma lhopital_right_at_top:
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1863
  "LIM x at_right x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1864
    eventually (\<lambda>x. g' x \<noteq> 0) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1865
    eventually (\<lambda>x. DERIV f x :> f' x) (at_right x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1866
    eventually (\<lambda>x. DERIV g x :> g' x) (at_right x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1867
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_right x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1868
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_right x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1869
  unfolding eventually_at_right_to_0[of _ x] filterlim_at_right_to_0[of _ _ x] DERIV_shift
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1870
  by (rule lhopital_right_0_at_top)
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1871
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1872
lemma lhopital_left_at_top:
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1873
  "LIM x at_left x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1874
    eventually (\<lambda>x. g' x \<noteq> 0) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1875
    eventually (\<lambda>x. DERIV f x :> f' x) (at_left x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1876
    eventually (\<lambda>x. DERIV g x :> g' x) (at_left x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1877
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at_left x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1878
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at_left x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1879
  unfolding eventually_at_left_to_right filterlim_at_left_to_right DERIV_mirror
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  1880
  by (rule lhopital_right_at_top[where f'="\<lambda>x. - f' (- x)"]) (auto simp: DERIV_mirror)
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1881
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1882
lemma lhopital_at_top:
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1883
  "LIM x at x. (g::real \<Rightarrow> real) x :> at_top \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1884
    eventually (\<lambda>x. g' x \<noteq> 0) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1885
    eventually (\<lambda>x. DERIV f x :> f' x) (at x) \<Longrightarrow>
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1886
    eventually (\<lambda>x. DERIV g x :> g' x) (at x) \<Longrightarrow>
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1887
    ((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> y) (at x) \<Longrightarrow>
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1888
    ((\<lambda> x. f x / g x) \<longlongrightarrow> y) (at x)"
50330
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1889
  unfolding eventually_at_split filterlim_at_split
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1890
  by (auto intro!: lhopital_right_at_top[of g x g' f f'] lhopital_left_at_top[of g x g' f f'])
d0b12171118e conversion rules for at, at_left and at_right; applied to l'Hopital's rules.
hoelzl
parents: 50329
diff changeset
  1891
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1892
lemma lhospital_at_top_at_top:
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1893
  fixes f g :: "real \<Rightarrow> real"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1894
  assumes g_0: "LIM x at_top. g x :> at_top"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1895
  assumes g': "eventually (\<lambda>x. g' x \<noteq> 0) at_top"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1896
  assumes Df: "eventually (\<lambda>x. DERIV f x :> f' x) at_top"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1897
  assumes Dg: "eventually (\<lambda>x. DERIV g x :> g' x) at_top"
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1898
  assumes lim: "((\<lambda> x. (f' x / g' x)) \<longlongrightarrow> x) at_top"
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1899
  shows "((\<lambda> x. f x / g x) \<longlongrightarrow> x) at_top"
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1900
  unfolding filterlim_at_top_to_right
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1901
proof (rule lhopital_right_0_at_top)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1902
  let ?F = "\<lambda>x. f (inverse x)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1903
  let ?G = "\<lambda>x. g (inverse x)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1904
  let ?R = "at_right (0::real)"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1905
  let ?D = "\<lambda>f' x. f' (inverse x) * - (inverse x ^ Suc (Suc 0))"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1906
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1907
  show "LIM x ?R. ?G x :> at_top"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1908
    using g_0 unfolding filterlim_at_top_to_right .
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1909
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1910
  show "eventually (\<lambda>x. DERIV ?G x  :> ?D g' x) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1911
    unfolding eventually_at_right_to_top
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1912
    using Dg eventually_ge_at_top[where c="1::real"]
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1913
    apply eventually_elim
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1914
    apply (rule DERIV_cong)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1915
    apply (rule DERIV_chain'[where f=inverse])
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1916
    apply (auto intro!:  DERIV_inverse)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1917
    done
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1918
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1919
  show "eventually (\<lambda>x. DERIV ?F x  :> ?D f' x) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1920
    unfolding eventually_at_right_to_top
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1921
    using Df eventually_ge_at_top[where c="1::real"]
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1922
    apply eventually_elim
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1923
    apply (rule DERIV_cong)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1924
    apply (rule DERIV_chain'[where f=inverse])
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1925
    apply (auto intro!:  DERIV_inverse)
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1926
    done
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1927
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1928
  show "eventually (\<lambda>x. ?D g' x \<noteq> 0) ?R"
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1929
    unfolding eventually_at_right_to_top
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1930
    using g' eventually_ge_at_top[where c="1::real"]
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1931
    by eventually_elim auto
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1932
    
61973
0c7e865fa7cb more symbols;
wenzelm
parents: 61810
diff changeset
  1933
  show "((\<lambda>x. ?D f' x / ?D g' x) \<longlongrightarrow> x) ?R"
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1934
    unfolding filterlim_at_right_to_top
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1935
    apply (intro filterlim_cong[THEN iffD2, OF refl refl _ lim])
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1936
    using eventually_ge_at_top[where c="1::real"]
56479
91958d4b30f7 revert c1bbd3e22226, a14831ac3023, and 36489d77c484: divide_minus_left/right are again simp rules
hoelzl
parents: 56409
diff changeset
  1937
    by eventually_elim simp
50347
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1938
qed
77e3effa50b6 prove tendsto_power_div_exp_0
hoelzl
parents: 50346
diff changeset
  1939
21164
0742fc979c67 new Deriv.thy contains stuff from Lim.thy
huffman
parents:
diff changeset
  1940
end