src/HOL/Hyperreal/Series.thy
changeset 16819 00d8f9300d13
parent 16733 236dfafbeb63
child 17149 e2b19c92ef51
equal deleted inserted replaced
16818:2b82259cc7b2 16819:00d8f9300d13
     2     Author      : Jacques D. Fleuriot
     2     Author      : Jacques D. Fleuriot
     3     Copyright   : 1998  University of Cambridge
     3     Copyright   : 1998  University of Cambridge
     4 
     4 
     5 Converted to Isar and polished by lcp
     5 Converted to Isar and polished by lcp
     6 Converted to setsum and polished yet more by TNN
     6 Converted to setsum and polished yet more by TNN
       
     7 Additional contributions by Jeremy Avigad
     7 *) 
     8 *) 
     8 
     9 
     9 header{*Finite Summation and Infinite Series*}
    10 header{*Finite Summation and Infinite Series*}
    10 
    11 
    11 theory Series
    12 theory Series
    58 apply (subgoal_tac "k = 0 | 0 < k", auto)
    59 apply (subgoal_tac "k = 0 | 0 < k", auto)
    59 apply (induct "n")
    60 apply (induct "n")
    60 apply (simp_all add: setsum_add_nat_ivl add_commute)
    61 apply (simp_all add: setsum_add_nat_ivl add_commute)
    61 done
    62 done
    62 
    63 
       
    64 (* FIXME generalize? *)
       
    65 lemma sumr_offset:
       
    66  "(\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}"
       
    67 by (induct "n", auto)
       
    68 
       
    69 lemma sumr_offset2:
       
    70  "\<forall>f. (\<Sum>m=0..<n::nat. f(m+k)::real) = setsum f {0..<n+k} - setsum f {0..<k}"
       
    71 by (induct "n", auto)
       
    72 
       
    73 lemma sumr_offset3:
       
    74   "setsum f {0::nat..<n+k} = (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}"
       
    75 by (simp  add: sumr_offset)
       
    76 
       
    77 lemma sumr_offset4:
       
    78  "\<forall>n f. setsum f {0::nat..<n+k} =
       
    79         (\<Sum>m=0..<n. f (m+k)::real) + setsum f {0..<k}"
       
    80 by (simp add: sumr_offset)
       
    81 
       
    82 (*
       
    83 lemma sumr_from_1_from_0: "0 < n ==>
       
    84       (\<Sum>n=Suc 0 ..< Suc n. if even(n) then 0 else
       
    85              ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n =
       
    86       (\<Sum>n=0..<Suc n. if even(n) then 0 else
       
    87              ((- 1) ^ ((n - (Suc 0)) div 2))/(real (fact n))) * a ^ n"
       
    88 by (rule_tac n1 = 1 in sumr_split_add [THEN subst], auto)
       
    89 *)
    63 
    90 
    64 subsection{* Infinite Sums, by the Properties of Limits*}
    91 subsection{* Infinite Sums, by the Properties of Limits*}
    65 
    92 
    66 (*----------------------
    93 (*----------------------
    67    suminf is the sum   
    94    suminf is the sum   
    86 lemma sums_unique: "f sums s ==> (s = suminf f)"
   113 lemma sums_unique: "f sums s ==> (s = suminf f)"
    87 apply (frule sums_summable [THEN summable_sums])
   114 apply (frule sums_summable [THEN summable_sums])
    88 apply (auto intro!: LIMSEQ_unique simp add: sums_def)
   115 apply (auto intro!: LIMSEQ_unique simp add: sums_def)
    89 done
   116 done
    90 
   117 
       
   118 lemma sums_split_initial_segment: "f sums s ==> 
       
   119   (%n. f(n + k)) sums (s - (SUM i = 0..< k. f i))"
       
   120   apply (unfold sums_def);
       
   121   apply (simp add: sumr_offset); 
       
   122   apply (rule LIMSEQ_diff_const)
       
   123   apply (rule LIMSEQ_ignore_initial_segment)
       
   124   apply assumption
       
   125 done
       
   126 
       
   127 lemma summable_ignore_initial_segment: "summable f ==> 
       
   128     summable (%n. f(n + k))"
       
   129   apply (unfold summable_def)
       
   130   apply (auto intro: sums_split_initial_segment)
       
   131 done
       
   132 
       
   133 lemma suminf_minus_initial_segment: "summable f ==>
       
   134     suminf f = s ==> suminf (%n. f(n + k)) = s - (SUM i = 0..< k. f i)"
       
   135   apply (frule summable_ignore_initial_segment)
       
   136   apply (rule sums_unique [THEN sym])
       
   137   apply (frule summable_sums)
       
   138   apply (rule sums_split_initial_segment)
       
   139   apply auto
       
   140 done
       
   141 
       
   142 lemma suminf_split_initial_segment: "summable f ==> 
       
   143     suminf f = (SUM i = 0..< k. f i) + suminf (%n. f(n + k))"
       
   144 by (auto simp add: suminf_minus_initial_segment)
       
   145 
    91 lemma series_zero: 
   146 lemma series_zero: 
    92      "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (setsum f {0..<n})"
   147      "(\<forall>m. n \<le> m --> f(m) = 0) ==> f sums (setsum f {0..<n})"
    93 apply (simp add: sums_def LIMSEQ_def diff_minus[symmetric], safe)
   148 apply (simp add: sums_def LIMSEQ_def diff_minus[symmetric], safe)
    94 apply (rule_tac x = n in exI)
   149 apply (rule_tac x = n in exI)
    95 apply (clarsimp simp add:setsum_diff[symmetric] cong:setsum_ivl_cong)
   150 apply (clarsimp simp add:setsum_diff[symmetric] cong:setsum_ivl_cong)
    96 done
   151 done
    97 
   152 
    98 
   153 lemma sums_zero: "(%n. 0) sums 0";
    99 lemma sums_mult: "x sums x0 ==> (%n. c * x(n)) sums (c * x0)"
   154   apply (unfold sums_def);
       
   155   apply simp;
       
   156   apply (rule LIMSEQ_const);
       
   157 done;
       
   158 
       
   159 lemma summable_zero: "summable (%n. 0)";
       
   160   apply (rule sums_summable);
       
   161   apply (rule sums_zero);
       
   162 done;
       
   163 
       
   164 lemma suminf_zero: "suminf (%n. 0) = 0";
       
   165   apply (rule sym);
       
   166   apply (rule sums_unique);
       
   167   apply (rule sums_zero);
       
   168 done;
       
   169   
       
   170 lemma sums_mult: "f sums a ==> (%n. c * f n) sums (c * a)"
   100 by (auto simp add: sums_def setsum_mult [symmetric]
   171 by (auto simp add: sums_def setsum_mult [symmetric]
   101          intro!: LIMSEQ_mult intro: LIMSEQ_const)
   172          intro!: LIMSEQ_mult intro: LIMSEQ_const)
   102 
   173 
   103 lemma sums_divide: "x sums x' ==> (%n. x(n)/c) sums (x'/c)"
   174 lemma summable_mult: "summable f ==> summable (%n. c * f n)";
       
   175   apply (unfold summable_def);
       
   176   apply (auto intro: sums_mult);
       
   177 done;
       
   178 
       
   179 lemma suminf_mult: "summable f ==> suminf (%n. c * f n) = c * suminf f";
       
   180   apply (rule sym);
       
   181   apply (rule sums_unique);
       
   182   apply (rule sums_mult);
       
   183   apply (erule summable_sums);
       
   184 done;
       
   185 
       
   186 lemma sums_mult2: "f sums a ==> (%n. f n * c) sums (a * c)"
       
   187 apply (subst mult_commute)
       
   188 apply (subst mult_commute);back;
       
   189 apply (erule sums_mult)
       
   190 done
       
   191 
       
   192 lemma summable_mult2: "summable f ==> summable (%n. f n * c)"
       
   193   apply (unfold summable_def)
       
   194   apply (auto intro: sums_mult2)
       
   195 done
       
   196 
       
   197 lemma suminf_mult2: "summable f ==> suminf f * c = (\<Sum>n. f n * c)"
       
   198 by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute)
       
   199 
       
   200 lemma sums_divide: "f sums a ==> (%n. (f n)/c) sums (a/c)"
   104 by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"])
   201 by (simp add: real_divide_def sums_mult mult_commute [of _ "inverse c"])
       
   202 
       
   203 lemma summable_divide: "summable f ==> summable (%n. (f n) / c)";
       
   204   apply (unfold summable_def);
       
   205   apply (auto intro: sums_divide);
       
   206 done;
       
   207 
       
   208 lemma suminf_divide: "summable f ==> suminf (%n. (f n) / c) = (suminf f) / c";
       
   209   apply (rule sym);
       
   210   apply (rule sums_unique);
       
   211   apply (rule sums_divide);
       
   212   apply (erule summable_sums);
       
   213 done;
       
   214 
       
   215 lemma sums_add: "[| x sums x0; y sums y0 |] ==> (%n. x n + y n) sums (x0+y0)"
       
   216 by (auto simp add: sums_def setsum_addf intro: LIMSEQ_add)
       
   217 
       
   218 lemma summable_add: "summable f ==> summable g ==> summable (%x. f x + g x)";
       
   219   apply (unfold summable_def);
       
   220   apply clarify;
       
   221   apply (rule exI);
       
   222   apply (erule sums_add);
       
   223   apply assumption;
       
   224 done;
       
   225 
       
   226 lemma suminf_add:
       
   227      "[| summable f; summable g |]   
       
   228       ==> suminf f + suminf g  = (\<Sum>n. f n + g n)"
       
   229 by (auto intro!: sums_add sums_unique summable_sums)
   105 
   230 
   106 lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)"
   231 lemma sums_diff: "[| x sums x0; y sums y0 |] ==> (%n. x n - y n) sums (x0-y0)"
   107 by (auto simp add: sums_def setsum_subtractf intro: LIMSEQ_diff)
   232 by (auto simp add: sums_def setsum_subtractf intro: LIMSEQ_diff)
   108 
   233 
   109 lemma suminf_mult: "summable f ==> suminf f * c = (\<Sum>n. f n * c)"
   234 lemma summable_diff: "summable f ==> summable g ==> summable (%x. f x - g x)";
   110 by (auto intro!: sums_unique sums_mult summable_sums simp add: mult_commute)
   235   apply (unfold summable_def);
   111 
   236   apply clarify;
   112 lemma suminf_mult2: "summable f ==> c * suminf f  = (\<Sum>n. c * f n)"
   237   apply (rule exI);
   113 by (auto intro!: sums_unique sums_mult summable_sums)
   238   apply (erule sums_diff);
       
   239   apply assumption;
       
   240 done;
   114 
   241 
   115 lemma suminf_diff:
   242 lemma suminf_diff:
   116      "[| summable f; summable g |]   
   243      "[| summable f; summable g |]   
   117       ==> suminf f - suminf g  = (\<Sum>n. f n - g n)"
   244       ==> suminf f - suminf g  = (\<Sum>n. f n - g n)"
   118 by (auto intro!: sums_diff sums_unique summable_sums)
   245 by (auto intro!: sums_diff sums_unique summable_sums)
   119 
   246 
   120 lemma sums_minus: "x sums x0 ==> (%n. - x n) sums - x0"
   247 lemma sums_minus: "f sums s ==> (%x. - f x) sums (- s)";
   121 by (auto simp add: sums_def intro!: LIMSEQ_minus simp add: setsum_negf)
   248   by (simp add: sums_def setsum_negf LIMSEQ_minus);
       
   249 
       
   250 lemma summable_minus: "summable f ==> summable (%x. - f x)";
       
   251   by (auto simp add: summable_def intro: sums_minus);
       
   252 
       
   253 lemma suminf_minus: "summable f ==> suminf (%x. - f x) = - (suminf f)";
       
   254   apply (rule sym);
       
   255   apply (rule sums_unique);
       
   256   apply (rule sums_minus);
       
   257   apply (erule summable_sums);
       
   258 done;
   122 
   259 
   123 lemma sums_group:
   260 lemma sums_group:
   124      "[|summable f; 0 < k |] ==> (%n. setsum f {n*k..<n*k+k}) sums (suminf f)"
   261      "[|summable f; 0 < k |] ==> (%n. setsum f {n*k..<n*k+k}) sums (suminf f)"
   125 apply (drule summable_sums)
   262 apply (drule summable_sums)
   126 apply (auto simp add: sums_def LIMSEQ_def sumr_group)
   263 apply (auto simp add: sums_def LIMSEQ_def sumr_group)