src/HOL/Hyperreal/Transcendental.thy
changeset 15081 32402f5624d1
parent 15079 2ef899e4526d
child 15085 5693a977a767
equal deleted inserted replaced
15080:7912ace86f31 15081:32402f5624d1
   391 text{*Power series has a `circle` of convergence, i.e. if it sums for @{term
   391 text{*Power series has a `circle` of convergence, i.e. if it sums for @{term
   392 x}, then it sums absolutely for @{term z} with @{term "\<bar>z\<bar> < \<bar>x\<bar>"}.*}
   392 x}, then it sums absolutely for @{term z} with @{term "\<bar>z\<bar> < \<bar>x\<bar>"}.*}
   393 
   393 
   394 lemma powser_insidea:
   394 lemma powser_insidea:
   395      "[| summable (%n. f(n) * (x ^ n)); \<bar>z\<bar> < \<bar>x\<bar> |]  
   395      "[| summable (%n. f(n) * (x ^ n)); \<bar>z\<bar> < \<bar>x\<bar> |]  
   396       ==> summable (%n. abs(f(n)) * (z ^ n))"
   396       ==> summable (%n. \<bar>f(n)\<bar> * (z ^ n))"
   397 apply (drule summable_LIMSEQ_zero)
   397 apply (drule summable_LIMSEQ_zero)
   398 apply (drule convergentI)
   398 apply (drule convergentI)
   399 apply (simp add: Cauchy_convergent_iff [symmetric])
   399 apply (simp add: Cauchy_convergent_iff [symmetric])
   400 apply (drule Cauchy_Bseq)
   400 apply (drule Cauchy_Bseq)
   401 apply (simp add: Bseq_def, safe)
   401 apply (simp add: Bseq_def, safe)
   402 apply (rule_tac g = "%n. K * abs (z ^ n) * inverse (abs (x ^ n))" in summable_comparison_test)
   402 apply (rule_tac g = "%n. K * \<bar>z ^ n\<bar> * inverse (\<bar>x ^ n\<bar>)" in summable_comparison_test)
   403 apply (rule_tac x = 0 in exI, safe)
   403 apply (rule_tac x = 0 in exI, safe)
   404 apply (subgoal_tac "0 < abs (x ^ n) ")
   404 apply (subgoal_tac "0 < \<bar>x ^ n\<bar> ")
   405 apply (rule_tac c="abs (x ^ n)" in mult_right_le_imp_le) 
   405 apply (rule_tac c="\<bar>x ^ n\<bar>" in mult_right_le_imp_le) 
   406 apply (auto simp add: mult_assoc power_abs)
   406 apply (auto simp add: mult_assoc power_abs)
   407  prefer 2
   407  prefer 2
   408  apply (drule_tac x = 0 in spec, force)
   408  apply (drule_tac x = 0 in spec, force)
   409 apply (auto simp add: abs_mult power_abs mult_ac)
   409 apply (auto simp add: abs_mult power_abs mult_ac)
   410 apply (rule_tac a2 = "z ^ n" 
   410 apply (rule_tac a2 = "z ^ n" 
   411        in abs_ge_zero [THEN real_le_imp_less_or_eq, THEN disjE])
   411        in abs_ge_zero [THEN real_le_imp_less_or_eq, THEN disjE])
   412 apply (auto intro!: mult_right_mono simp add: mult_assoc [symmetric] power_abs summable_def power_0_left)
   412 apply (auto intro!: mult_right_mono simp add: mult_assoc [symmetric] power_abs summable_def power_0_left)
   413 apply (rule_tac x = "K * inverse (1 - (\<bar>z\<bar> * inverse (\<bar>x\<bar>))) " in exI)
   413 apply (rule_tac x = "K * inverse (1 - (\<bar>z\<bar> * inverse (\<bar>x\<bar>))) " in exI)
   414 apply (auto intro!: sums_mult simp add: mult_assoc)
   414 apply (auto intro!: sums_mult simp add: mult_assoc)
   415 apply (subgoal_tac "abs (z ^ n) * inverse (\<bar>x\<bar> ^ n) = (\<bar>z\<bar> * inverse (\<bar>x\<bar>)) ^ n")
   415 apply (subgoal_tac "\<bar>z ^ n\<bar> * inverse (\<bar>x\<bar> ^ n) = (\<bar>z\<bar> * inverse (\<bar>x\<bar>)) ^ n")
   416 apply (auto simp add: power_abs [symmetric])
   416 apply (auto simp add: power_abs [symmetric])
   417 apply (subgoal_tac "x \<noteq> 0")
   417 apply (subgoal_tac "x \<noteq> 0")
   418 apply (subgoal_tac [3] "x \<noteq> 0")
   418 apply (subgoal_tac [3] "x \<noteq> 0")
   419 apply (auto simp del: abs_inverse abs_mult simp add: abs_inverse [symmetric] realpow_not_zero abs_mult [symmetric] power_inverse power_mult_distrib [symmetric])
   419 apply (auto simp del: abs_inverse abs_mult simp add: abs_inverse [symmetric] realpow_not_zero abs_mult [symmetric] power_inverse power_mult_distrib [symmetric])
   420 apply (auto intro!: geometric_sums simp add: power_abs inverse_eq_divide)
   420 apply (auto intro!: geometric_sums simp add: power_abs inverse_eq_divide)
   500 apply (simp add: diff_minus [symmetric] less_iff_Suc_add) 
   500 apply (simp add: diff_minus [symmetric] less_iff_Suc_add) 
   501 apply (auto simp add: sumr_mult lemma_realpow_diff_sumr2 mult_ac simp
   501 apply (auto simp add: sumr_mult lemma_realpow_diff_sumr2 mult_ac simp
   502                  del: sumr_Suc realpow_Suc)
   502                  del: sumr_Suc realpow_Suc)
   503 done
   503 done
   504 
   504 
   505 lemma lemma_termdiff3: "[| h \<noteq> 0; \<bar>z\<bar> \<le> K; abs (z + h) \<le> K |]  
   505 lemma lemma_termdiff3: "[| h \<noteq> 0; \<bar>z\<bar> \<le> K; \<bar>z + h\<bar> \<le> K |]  
   506       ==> abs (((z + h) ^ n - z ^ n) * inverse h - real n * z ^ (n - Suc 0))  
   506       ==> abs (((z + h) ^ n - z ^ n) * inverse h - real n * z ^ (n - Suc 0))  
   507           \<le> real n * real (n - Suc 0) * K ^ (n - 2) * \<bar>h\<bar>"
   507           \<le> real n * real (n - Suc 0) * K ^ (n - 2) * \<bar>h\<bar>"
   508 apply (subst lemma_termdiff2, assumption)
   508 apply (subst lemma_termdiff2, assumption)
   509 apply (simp add: abs_mult mult_commute) 
   509 apply (simp add: abs_mult mult_commute) 
   510 apply (simp add: mult_commute [of _ "K ^ (n - 2)"]) 
   510 apply (simp add: mult_commute [of _ "K ^ (n - 2)"]) 
   530 apply (auto intro!: power_mono zero_le_power simp add: power_abs, arith+)
   530 apply (auto intro!: power_mono zero_le_power simp add: power_abs, arith+)
   531 done
   531 done
   532 
   532 
   533 lemma lemma_termdiff4: 
   533 lemma lemma_termdiff4: 
   534   "[| 0 < k;  
   534   "[| 0 < k;  
   535       (\<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k --> abs(f h) \<le> K * \<bar>h\<bar>) |]  
   535       (\<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k --> \<bar>f h\<bar> \<le> K * \<bar>h\<bar>) |]  
   536    ==> f -- 0 --> 0"
   536    ==> f -- 0 --> 0"
   537 apply (unfold LIM_def, auto)
   537 apply (unfold LIM_def, auto)
   538 apply (subgoal_tac "0 \<le> K")
   538 apply (subgoal_tac "0 \<le> K")
   539 apply (drule_tac [2] x = "k/2" in spec)
   539 apply (drule_tac [2] x = "k/2" in spec)
   540 apply (frule_tac [2] real_less_half_sum)
   540 apply (frule_tac [2] real_less_half_sum)
   560             summable f;  
   560             summable f;  
   561             \<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k -->  
   561             \<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k -->  
   562                     (\<forall>n. abs(g(h) (n::nat)) \<le> (f(n) * \<bar>h\<bar>)) |]  
   562                     (\<forall>n. abs(g(h) (n::nat)) \<le> (f(n) * \<bar>h\<bar>)) |]  
   563          ==> (%h. suminf(g h)) -- 0 --> 0"
   563          ==> (%h. suminf(g h)) -- 0 --> 0"
   564 apply (drule summable_sums)
   564 apply (drule summable_sums)
   565 apply (subgoal_tac "\<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k --> abs (suminf (g h)) \<le> suminf f * \<bar>h\<bar>")
   565 apply (subgoal_tac "\<forall>h. 0 < \<bar>h\<bar> & \<bar>h\<bar> < k --> \<bar>suminf (g h)\<bar> \<le> suminf f * \<bar>h\<bar>")
   566 apply (auto intro!: lemma_termdiff4 simp add: sums_summable [THEN suminf_mult, symmetric])
   566 apply (auto intro!: lemma_termdiff4 simp add: sums_summable [THEN suminf_mult, symmetric])
   567 apply (subgoal_tac "summable (%n. f n * \<bar>h\<bar>) ")
   567 apply (subgoal_tac "summable (%n. f n * \<bar>h\<bar>) ")
   568  prefer 2
   568  prefer 2
   569  apply (simp add: summable_def) 
   569  apply (simp add: summable_def) 
   570  apply (rule_tac x = "suminf f * \<bar>h\<bar>" in exI)
   570  apply (rule_tac x = "suminf f * \<bar>h\<bar>" in exI)
   571  apply (drule_tac c = "\<bar>h\<bar>" in sums_mult)
   571  apply (drule_tac c = "\<bar>h\<bar>" in sums_mult)
   572  apply (simp add: mult_ac) 
   572  apply (simp add: mult_ac) 
   573 apply (subgoal_tac "summable (%n. abs (g (h::real) (n::nat))) ")
   573 apply (subgoal_tac "summable (%n. abs (g (h::real) (n::nat))) ")
   574  apply (rule_tac [2] g = "%n. f n * \<bar>h\<bar>" in summable_comparison_test)
   574  apply (rule_tac [2] g = "%n. f n * \<bar>h\<bar>" in summable_comparison_test)
   575   apply (rule_tac [2] x = 0 in exI, auto)
   575   apply (rule_tac [2] x = 0 in exI, auto)
   576 apply (rule_tac j = "suminf (%n. abs (g h n))" in real_le_trans)
   576 apply (rule_tac j = "suminf (%n. \<bar>g h n\<bar>)" in real_le_trans)
   577 apply (auto intro: summable_rabs summable_le simp add: sums_summable [THEN suminf_mult])
   577 apply (auto intro: summable_rabs summable_le simp add: sums_summable [THEN suminf_mult])
   578 done
   578 done
   579 
   579 
   580 
   580 
   581 
   581 
   589                    real n * x ^ (n - Suc 0))))
   589                    real n * x ^ (n - Suc 0))))
   590        -- 0 --> 0"
   590        -- 0 --> 0"
   591 apply (drule dense, safe)
   591 apply (drule dense, safe)
   592 apply (frule real_less_sum_gt_zero)
   592 apply (frule real_less_sum_gt_zero)
   593 apply (drule_tac
   593 apply (drule_tac
   594          f = "%n. abs (c n) * real n * real (n - Suc 0) * (r ^ (n - 2))" 
   594          f = "%n. \<bar>c n\<bar> * real n * real (n - Suc 0) * (r ^ (n - 2))" 
   595      and g = "%h n. c (n) * ((( ((x + h) ^ n) - (x ^ n)) * inverse h) 
   595      and g = "%h n. c (n) * ((( ((x + h) ^ n) - (x ^ n)) * inverse h) 
   596                              - (real n * (x ^ (n - Suc 0))))" 
   596                              - (real n * (x ^ (n - Suc 0))))" 
   597        in lemma_termdiff5)
   597        in lemma_termdiff5)
   598 apply (auto simp add: add_commute)
   598 apply (auto simp add: add_commute)
   599 apply (subgoal_tac "summable (%n. \<bar>diffs (diffs c) n\<bar> * (r ^ n))")
   599 apply (subgoal_tac "summable (%n. \<bar>diffs (diffs c) n\<bar> * (r ^ n))")
   607 apply auto
   607 apply auto
   608 apply (drule diffs_equiv)
   608 apply (drule diffs_equiv)
   609 apply (drule sums_summable)
   609 apply (drule sums_summable)
   610 apply (simp_all add: diffs_def) 
   610 apply (simp_all add: diffs_def) 
   611 apply (simp add: diffs_def mult_ac)
   611 apply (simp add: diffs_def mult_ac)
   612 apply (subgoal_tac " (%n. real n * (real (Suc n) * (abs (c (Suc n)) * (r ^ (n - Suc 0))))) = (%n. diffs (%m. real (m - Suc 0) * abs (c m) * inverse r) n * (r ^ n))")
   612 apply (subgoal_tac " (%n. real n * (real (Suc n) * (\<bar>c (Suc n)\<bar> * (r ^ (n - Suc 0))))) = (%n. diffs (%m. real (m - Suc 0) * \<bar>c m\<bar> * inverse r) n * (r ^ n))")
   613 apply auto
   613 apply auto
   614   prefer 2
   614   prefer 2
   615   apply (rule ext)
   615   apply (rule ext)
   616   apply (simp add: diffs_def) 
   616   apply (simp add: diffs_def) 
   617   apply (case_tac "n", auto)
   617   apply (case_tac "n", auto)
   897 by (simp add: order_less_le)
   897 by (simp add: order_less_le)
   898 
   898 
   899 lemma inv_exp_gt_zero [simp]: "0 < inverse(exp x)"
   899 lemma inv_exp_gt_zero [simp]: "0 < inverse(exp x)"
   900 by (auto intro: positive_imp_inverse_positive)
   900 by (auto intro: positive_imp_inverse_positive)
   901 
   901 
   902 lemma abs_exp_cancel [simp]: "abs(exp x) = exp x"
   902 lemma abs_exp_cancel [simp]: "\<bar>exp x\<bar> = exp x"
   903 by (auto simp add: abs_eqI2)
   903 by (auto simp add: abs_eqI2)
   904 
   904 
   905 lemma exp_real_of_nat_mult: "exp(real n * x) = exp(x) ^ n"
   905 lemma exp_real_of_nat_mult: "exp(real n * x) = exp(x) ^ n"
   906 apply (induct_tac "n")
   906 apply (induct_tac "n")
   907 apply (auto simp add: real_of_nat_Suc right_distrib exp_add mult_commute)
   907 apply (auto simp add: real_of_nat_Suc right_distrib exp_add mult_commute)
  1177 done
  1177 done
  1178 
  1178 
  1179 lemma real_gt_one_ge_zero_add_less: "[| 1 < x; 0 \<le> y |] ==> 1 < x + (y::real)"
  1179 lemma real_gt_one_ge_zero_add_less: "[| 1 < x; 0 \<le> y |] ==> 1 < x + (y::real)"
  1180 by arith
  1180 by arith
  1181 
  1181 
  1182 lemma abs_sin_le_one [simp]: "abs(sin x) \<le> 1"
  1182 lemma abs_sin_le_one [simp]: "\<bar>sin x\<bar> \<le> 1"
  1183 apply (auto simp add: linorder_not_less [symmetric])
  1183 apply (auto simp add: linorder_not_less [symmetric])
  1184 apply (drule_tac n = "Suc 0" in power_gt1)
  1184 apply (drule_tac n = "Suc 0" in power_gt1)
  1185 apply (auto simp del: realpow_Suc)
  1185 apply (auto simp del: realpow_Suc)
  1186 apply (drule_tac r1 = "cos x" in realpow_two_le [THEN [2] real_gt_one_ge_zero_add_less])
  1186 apply (drule_tac r1 = "cos x" in realpow_two_le [THEN [2] real_gt_one_ge_zero_add_less])
  1187 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  1187 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  1195 lemma sin_le_one [simp]: "sin x \<le> 1"
  1195 lemma sin_le_one [simp]: "sin x \<le> 1"
  1196 apply (insert abs_sin_le_one [of x]) 
  1196 apply (insert abs_sin_le_one [of x]) 
  1197 apply (simp add: abs_le_interval_iff del: abs_sin_le_one) 
  1197 apply (simp add: abs_le_interval_iff del: abs_sin_le_one) 
  1198 done
  1198 done
  1199 
  1199 
  1200 lemma abs_cos_le_one [simp]: "abs(cos x) \<le> 1"
  1200 lemma abs_cos_le_one [simp]: "\<bar>cos x\<bar> \<le> 1"
  1201 apply (auto simp add: linorder_not_less [symmetric])
  1201 apply (auto simp add: linorder_not_less [symmetric])
  1202 apply (drule_tac n = "Suc 0" in power_gt1)
  1202 apply (drule_tac n = "Suc 0" in power_gt1)
  1203 apply (auto simp del: realpow_Suc)
  1203 apply (auto simp del: realpow_Suc)
  1204 apply (drule_tac r1 = "sin x" in realpow_two_le [THEN [2] real_gt_one_ge_zero_add_less])
  1204 apply (drule_tac r1 = "sin x" in realpow_two_le [THEN [2] real_gt_one_ge_zero_add_less])
  1205 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  1205 apply (simp add: numeral_2_eq_2 [symmetric] del: realpow_Suc)
  2063 by (rule DERIV_sin [THEN DERIV_isCont])
  2063 by (rule DERIV_sin [THEN DERIV_isCont])
  2064 
  2064 
  2065 lemma isCont_exp [simp]: "isCont exp x"
  2065 lemma isCont_exp [simp]: "isCont exp x"
  2066 by (rule DERIV_exp [THEN DERIV_isCont])
  2066 by (rule DERIV_exp [THEN DERIV_isCont])
  2067 
  2067 
  2068 lemma sin_zero_abs_cos_one: "sin x = 0 ==> abs(cos x) = 1"
  2068 lemma sin_zero_abs_cos_one: "sin x = 0 ==> \<bar>cos x\<bar> = 1"
  2069 by (auto simp add: sin_zero_iff even_mult_two_ex)
  2069 by (auto simp add: sin_zero_iff even_mult_two_ex)
  2070 
  2070 
  2071 lemma exp_eq_one_iff [simp]: "(exp x = 1) = (x = 0)"
  2071 lemma exp_eq_one_iff [simp]: "(exp x = 1) = (x = 0)"
  2072 apply auto
  2072 apply auto
  2073 apply (drule_tac f = ln in arg_cong, auto)
  2073 apply (drule_tac f = ln in arg_cong, auto)
  2548 lemma isCont_inv_fun_inv:
  2548 lemma isCont_inv_fun_inv:
  2549      "[| 0 < d;  
  2549      "[| 0 < d;  
  2550          \<forall>z. \<bar>z - x\<bar> \<le> d --> g(f(z)) = z;  
  2550          \<forall>z. \<bar>z - x\<bar> \<le> d --> g(f(z)) = z;  
  2551          \<forall>z. \<bar>z - x\<bar> \<le> d --> isCont f z |]  
  2551          \<forall>z. \<bar>z - x\<bar> \<le> d --> isCont f z |]  
  2552        ==> \<exists>e. 0 < e &  
  2552        ==> \<exists>e. 0 < e &  
  2553              (\<forall>y. 0 < abs(y - f(x)) & abs(y - f(x)) < e --> f(g(y)) = y)"
  2553              (\<forall>y. 0 < \<bar>y - f(x)\<bar> & \<bar>y - f(x)\<bar> < e --> f(g(y)) = y)"
  2554 apply (drule isCont_inj_range)
  2554 apply (drule isCont_inj_range)
  2555 prefer 2 apply (assumption, assumption, auto)
  2555 prefer 2 apply (assumption, assumption, auto)
  2556 apply (rule_tac x = e in exI, auto)
  2556 apply (rule_tac x = e in exI, auto)
  2557 apply (rotate_tac 2)
  2557 apply (rotate_tac 2)
  2558 apply (drule_tac x = y in spec, auto)
  2558 apply (drule_tac x = y in spec, auto)