src/HOL/Transcendental.thy
changeset 44568 e6f291cb5810
parent 44319 806e0390de53
child 44710 9caf6883f1f4
equal deleted inserted replaced
44549:5e5e6ad3922c 44568:e6f291cb5810
   292     with monoseq_le[OF `monoseq a` `a ----> 0`]
   292     with monoseq_le[OF `monoseq a` `a ----> 0`]
   293     have "(\<forall> n. a n \<le> 0) \<and> (\<forall>m. \<forall>n\<ge>m. a m \<le> a n)" by auto
   293     have "(\<forall> n. a n \<le> 0) \<and> (\<forall>m. \<forall>n\<ge>m. a m \<le> a n)" by auto
   294     hence ord: "\<And>n m. m \<le> n \<Longrightarrow> ?a n \<le> ?a m" and ge0: "\<And> n. 0 \<le> ?a n" by auto
   294     hence ord: "\<And>n m. m \<le> n \<Longrightarrow> ?a n \<le> ?a m" and ge0: "\<And> n. 0 \<le> ?a n" by auto
   295     { fix n have "?a (Suc n) \<le> ?a n" using ord[where n="Suc n" and m=n] by auto }
   295     { fix n have "?a (Suc n) \<le> ?a n" using ord[where n="Suc n" and m=n] by auto }
   296     note monotone = this
   296     note monotone = this
   297     note leibniz = summable_Leibniz'[OF _ ge0, of "\<lambda>x. x", OF LIMSEQ_minus[OF `a ----> 0`, unfolded minus_zero] monotone]
   297     note leibniz = summable_Leibniz'[OF _ ge0, of "\<lambda>x. x", OF tendsto_minus[OF `a ----> 0`, unfolded minus_zero] monotone]
   298     have "summable (\<lambda> n. (-1)^n * ?a n)" using leibniz(1) by auto
   298     have "summable (\<lambda> n. (-1)^n * ?a n)" using leibniz(1) by auto
   299     then obtain l where "(\<lambda> n. (-1)^n * ?a n) sums l" unfolding summable_def by auto
   299     then obtain l where "(\<lambda> n. (-1)^n * ?a n) sums l" unfolding summable_def by auto
   300     from this[THEN sums_minus]
   300     from this[THEN sums_minus]
   301     have "(\<lambda> n. (-1)^n * a n) sums -l" by auto
   301     have "(\<lambda> n. (-1)^n * a n) sums -l" by auto
   302     hence ?summable unfolding summable_def by auto
   302     hence ?summable unfolding summable_def by auto
   306     from suminf_minus[OF leibniz(1), unfolded mult_minus_right minus_minus]
   306     from suminf_minus[OF leibniz(1), unfolded mult_minus_right minus_minus]
   307     have move_minus: "(\<Sum>n. - (-1 ^ n * a n)) = - (\<Sum>n. -1 ^ n * a n)" by auto
   307     have move_minus: "(\<Sum>n. - (-1 ^ n * a n)) = - (\<Sum>n. -1 ^ n * a n)" by auto
   308 
   308 
   309     have ?pos using `0 \<le> ?a 0` by auto
   309     have ?pos using `0 \<le> ?a 0` by auto
   310     moreover have ?neg using leibniz(2,4) unfolding mult_minus_right setsum_negf move_minus neg_le_iff_le by auto
   310     moreover have ?neg using leibniz(2,4) unfolding mult_minus_right setsum_negf move_minus neg_le_iff_le by auto
   311     moreover have ?f and ?g using leibniz(3,5)[unfolded mult_minus_right setsum_negf move_minus, THEN LIMSEQ_minus_cancel] by auto
   311     moreover have ?f and ?g using leibniz(3,5)[unfolded mult_minus_right setsum_negf move_minus, THEN tendsto_minus_cancel] by auto
   312     ultimately show ?thesis by auto
   312     ultimately show ?thesis by auto
   313   qed
   313   qed
   314   from this[THEN conjunct1] this[THEN conjunct2, THEN conjunct1] this[THEN conjunct2, THEN conjunct2, THEN conjunct1] this[THEN conjunct2, THEN conjunct2, THEN conjunct2, THEN conjunct1]
   314   from this[THEN conjunct1] this[THEN conjunct2, THEN conjunct1] this[THEN conjunct2, THEN conjunct2, THEN conjunct1] this[THEN conjunct2, THEN conjunct2, THEN conjunct2, THEN conjunct1]
   315        this[THEN conjunct2, THEN conjunct2, THEN conjunct2, THEN conjunct2]
   315        this[THEN conjunct2, THEN conjunct2, THEN conjunct2, THEN conjunct2]
   316   show ?summable and ?pos and ?neg and ?f and ?g .
   316   show ?summable and ?pos and ?neg and ?f and ?g .
  2580   qed
  2580   qed
  2581 qed
  2581 qed
  2582 
  2582 
  2583 lemma zeroseq_arctan_series: fixes x :: real
  2583 lemma zeroseq_arctan_series: fixes x :: real
  2584   assumes "\<bar>x\<bar> \<le> 1" shows "(\<lambda> n. 1 / real (n*2+1) * x^(n*2+1)) ----> 0" (is "?a ----> 0")
  2584   assumes "\<bar>x\<bar> \<le> 1" shows "(\<lambda> n. 1 / real (n*2+1) * x^(n*2+1)) ----> 0" (is "?a ----> 0")
  2585 proof (cases "x = 0") case True thus ?thesis unfolding One_nat_def by (auto simp add: LIMSEQ_const)
  2585 proof (cases "x = 0") case True thus ?thesis unfolding One_nat_def by (auto simp add: tendsto_const)
  2586 next
  2586 next
  2587   case False
  2587   case False
  2588   have "norm x \<le> 1" and "x \<le> 1" and "-1 \<le> x" using assms by auto
  2588   have "norm x \<le> 1" and "x \<le> 1" and "-1 \<le> x" using assms by auto
  2589   show "?a ----> 0"
  2589   show "?a ----> 0"
  2590   proof (cases "\<bar>x\<bar> < 1")
  2590   proof (cases "\<bar>x\<bar> < 1")
  2591     case True hence "norm x < 1" by auto
  2591     case True hence "norm x < 1" by auto
  2592     from LIMSEQ_mult[OF LIMSEQ_inverse_real_of_nat LIMSEQ_power_zero[OF `norm x < 1`, THEN LIMSEQ_Suc]]
  2592     from tendsto_mult[OF LIMSEQ_inverse_real_of_nat LIMSEQ_power_zero[OF `norm x < 1`, THEN LIMSEQ_Suc]]
  2593     have "(\<lambda>n. 1 / real (n + 1) * x ^ (n + 1)) ----> 0"
  2593     have "(\<lambda>n. 1 / real (n + 1) * x ^ (n + 1)) ----> 0"
  2594       unfolding inverse_eq_divide Suc_eq_plus1 by simp
  2594       unfolding inverse_eq_divide Suc_eq_plus1 by simp
  2595     then show ?thesis using pos2 by (rule LIMSEQ_linear)
  2595     then show ?thesis using pos2 by (rule LIMSEQ_linear)
  2596   next
  2596   next
  2597     case False hence "x = -1 \<or> x = 1" using `\<bar>x\<bar> \<le> 1` by auto
  2597     case False hence "x = -1 \<or> x = 1" using `\<bar>x\<bar> \<le> 1` by auto
  2598     hence n_eq: "\<And> n. x ^ (n * 2 + 1) = x" unfolding One_nat_def by auto
  2598     hence n_eq: "\<And> n. x ^ (n * 2 + 1) = x" unfolding One_nat_def by auto
  2599     from LIMSEQ_mult[OF LIMSEQ_inverse_real_of_nat[THEN LIMSEQ_linear, OF pos2, unfolded inverse_eq_divide] LIMSEQ_const[of x]]
  2599     from tendsto_mult[OF LIMSEQ_inverse_real_of_nat[THEN LIMSEQ_linear, OF pos2, unfolded inverse_eq_divide] tendsto_const[of x]]
  2600     show ?thesis unfolding n_eq Suc_eq_plus1 by auto
  2600     show ?thesis unfolding n_eq Suc_eq_plus1 by auto
  2601   qed
  2601   qed
  2602 qed
  2602 qed
  2603 
  2603 
  2604 lemma summable_arctan_series: fixes x :: real and n :: nat
  2604 lemma summable_arctan_series: fixes x :: real and n :: nat
  2773         by (auto intro!: isCont_add isCont_rabs isCont_ident isCont_minus isCont_arctan isCont_inverse isCont_mult isCont_power isCont_const isCont_setsum)
  2773         by (auto intro!: isCont_add isCont_rabs isCont_ident isCont_minus isCont_arctan isCont_inverse isCont_mult isCont_power isCont_const isCont_setsum)
  2774       ultimately have "0 \<le> ?a 1 n - ?diff 1 n" by (rule LIM_less_bound)
  2774       ultimately have "0 \<le> ?a 1 n - ?diff 1 n" by (rule LIM_less_bound)
  2775       hence "?diff 1 n \<le> ?a 1 n" by auto
  2775       hence "?diff 1 n \<le> ?a 1 n" by auto
  2776     }
  2776     }
  2777     have "?a 1 ----> 0"
  2777     have "?a 1 ----> 0"
  2778       unfolding LIMSEQ_rabs_zero power_one divide_inverse One_nat_def
  2778       unfolding tendsto_rabs_zero_iff power_one divide_inverse One_nat_def
  2779       by (auto intro!: LIMSEQ_mult LIMSEQ_linear LIMSEQ_inverse_real_of_nat)
  2779       by (auto intro!: tendsto_mult LIMSEQ_linear LIMSEQ_inverse_real_of_nat)
  2780     have "?diff 1 ----> 0"
  2780     have "?diff 1 ----> 0"
  2781     proof (rule LIMSEQ_I)
  2781     proof (rule LIMSEQ_I)
  2782       fix r :: real assume "0 < r"
  2782       fix r :: real assume "0 < r"
  2783       obtain N :: nat where N_I: "\<And> n. N \<le> n \<Longrightarrow> ?a 1 n < r" using LIMSEQ_D[OF `?a 1 ----> 0` `0 < r`] by auto
  2783       obtain N :: nat where N_I: "\<And> n. N \<le> n \<Longrightarrow> ?a 1 n < r" using LIMSEQ_D[OF `?a 1 ----> 0` `0 < r`] by auto
  2784       { fix n assume "N \<le> n" from `?diff 1 n \<le> ?a 1 n` N_I[OF this]
  2784       { fix n assume "N \<le> n" from `?diff 1 n \<le> ?a 1 n` N_I[OF this]
  2785         have "norm (?diff 1 n - 0) < r" by auto }
  2785         have "norm (?diff 1 n - 0) < r" by auto }
  2786       thus "\<exists> N. \<forall> n \<ge> N. norm (?diff 1 n - 0) < r" by blast
  2786       thus "\<exists> N. \<forall> n \<ge> N. norm (?diff 1 n - 0) < r" by blast
  2787     qed
  2787     qed
  2788     from this[unfolded LIMSEQ_rabs_zero diff_minus add_commute[of "arctan 1"], THEN LIMSEQ_add_const, of "- arctan 1", THEN LIMSEQ_minus]
  2788     from this[unfolded tendsto_rabs_zero_iff diff_minus add_commute[of "arctan 1"], THEN LIMSEQ_add_const, of "- arctan 1", THEN tendsto_minus]
  2789     have "(?c 1) sums (arctan 1)" unfolding sums_def by auto
  2789     have "(?c 1) sums (arctan 1)" unfolding sums_def by auto
  2790     hence "arctan 1 = (\<Sum> i. ?c 1 i)" by (rule sums_unique)
  2790     hence "arctan 1 = (\<Sum> i. ?c 1 i)" by (rule sums_unique)
  2791 
  2791 
  2792     show ?thesis
  2792     show ?thesis
  2793     proof (cases "x = 1", simp add: `arctan 1 = (\<Sum> i. ?c 1 i)`)
  2793     proof (cases "x = 1", simp add: `arctan 1 = (\<Sum> i. ?c 1 i)`)