diff options
Diffstat (limited to 'theories/Reals/Rtrigo_alt.v')
-rw-r--r-- | theories/Reals/Rtrigo_alt.v | 767 |
1 files changed, 380 insertions, 387 deletions
diff --git a/theories/Reals/Rtrigo_alt.v b/theories/Reals/Rtrigo_alt.v index fc465bc4..a95bc54b 100644 --- a/theories/Reals/Rtrigo_alt.v +++ b/theories/Reals/Rtrigo_alt.v @@ -5,8 +5,8 @@ (* // * This file is distributed under the terms of the *) (* * GNU Lesser General Public License Version 2.1 *) (************************************************************************) - -(*i $Id: Rtrigo_alt.v 6245 2004-10-20 13:50:08Z barras $ i*) + +(*i $Id: Rtrigo_alt.v 9245 2006-10-17 12:53:34Z notin $ i*) Require Import Rbase. Require Import Rfunctions. @@ -14,9 +14,9 @@ Require Import SeqSeries. Require Import Rtrigo_def. Open Local Scope R_scope. -(*****************************************************************) -(* Using series definitions of cos and sin *) -(*****************************************************************) +(***************************************************************) +(** Using series definitions of cos and sin *) +(***************************************************************) Definition sin_term (a:R) (i:nat) : R := (-1) ^ i * (a ^ (2 * i + 1) / INR (fact (2 * i + 1))). @@ -30,397 +30,390 @@ Definition cos_approx (a:R) (n:nat) : R := sum_f_R0 (cos_term a) n. (**********) Lemma PI_4 : PI <= 4. -assert (H0 := PI_ineq 0). -elim H0; clear H0; intros _ H0. -unfold tg_alt, PI_tg in H0; simpl in H0. -rewrite Rinv_1 in H0; rewrite Rmult_1_r in H0; unfold Rdiv in H0. -apply Rmult_le_reg_l with (/ 4). -apply Rinv_0_lt_compat; prove_sup0. -rewrite <- Rinv_l_sym; [ rewrite Rmult_comm; assumption | discrR ]. +Proof. + assert (H0 := PI_ineq 0). + elim H0; clear H0; intros _ H0. + unfold tg_alt, PI_tg in H0; simpl in H0. + rewrite Rinv_1 in H0; rewrite Rmult_1_r in H0; unfold Rdiv in H0. + apply Rmult_le_reg_l with (/ 4). + apply Rinv_0_lt_compat; prove_sup0. + rewrite <- Rinv_l_sym; [ rewrite Rmult_comm; assumption | discrR ]. Qed. (**********) Theorem sin_bound : - forall (a:R) (n:nat), - 0 <= a -> - a <= PI -> sin_approx a (2 * n + 1) <= sin a <= sin_approx a (2 * (n + 1)). -intros; case (Req_dec a 0); intro Hyp_a. -rewrite Hyp_a; rewrite sin_0; split; right; unfold sin_approx in |- *; - apply sum_eq_R0 || (symmetry in |- *; apply sum_eq_R0); - intros; unfold sin_term in |- *; rewrite pow_add; - simpl in |- *; unfold Rdiv in |- *; rewrite Rmult_0_l; - ring. -unfold sin_approx in |- *; cut (0 < a). -intro Hyp_a_pos. -rewrite (decomp_sum (sin_term a) (2 * n + 1)). -rewrite (decomp_sum (sin_term a) (2 * (n + 1))). -replace (sin_term a 0) with a. -cut - (sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * n + 1)) <= sin a - a /\ - sin a - a <= sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * (n + 1))) -> - a + sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * n + 1)) <= sin a /\ - sin a <= a + sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * (n + 1)))). -intro; apply H1. -set (Un := fun n:nat => a ^ (2 * S n + 1) / INR (fact (2 * S n + 1))). -replace (pred (2 * n + 1)) with (2 * n)%nat. -replace (pred (2 * (n + 1))) with (S (2 * n)). -replace (sum_f_R0 (fun i:nat => sin_term a (S i)) (2 * n)) with - (- sum_f_R0 (tg_alt Un) (2 * n)). -replace (sum_f_R0 (fun i:nat => sin_term a (S i)) (S (2 * n))) with - (- sum_f_R0 (tg_alt Un) (S (2 * n))). -cut - (sum_f_R0 (tg_alt Un) (S (2 * n)) <= a - sin a <= - sum_f_R0 (tg_alt Un) (2 * n) -> - - sum_f_R0 (tg_alt Un) (2 * n) <= sin a - a <= - - sum_f_R0 (tg_alt Un) (S (2 * n))). -intro; apply H2. -apply alternated_series_ineq. -unfold Un_decreasing, Un in |- *; intro; - cut ((2 * S (S n0) + 1)%nat = S (S (2 * S n0 + 1))). -intro; rewrite H3. -replace (a ^ S (S (2 * S n0 + 1))) with (a ^ (2 * S n0 + 1) * (a * a)). -unfold Rdiv in |- *; rewrite Rmult_assoc; apply Rmult_le_compat_l. -left; apply pow_lt; assumption. -apply Rmult_le_reg_l with (INR (fact (S (S (2 * S n0 + 1))))). -rewrite <- H3; apply lt_INR_0; apply neq_O_lt; red in |- *; intro; - assert (H5 := sym_eq H4); elim (fact_neq_0 _ H5). -rewrite <- H3; rewrite (Rmult_comm (INR (fact (2 * S (S n0) + 1)))); - rewrite Rmult_assoc; rewrite <- Rinv_l_sym. -rewrite Rmult_1_r; rewrite H3; do 2 rewrite fact_simpl; do 2 rewrite mult_INR; - repeat rewrite Rmult_assoc; rewrite <- Rinv_r_sym. -rewrite Rmult_1_r. -do 2 rewrite S_INR; rewrite plus_INR; rewrite mult_INR; repeat rewrite S_INR; - simpl in |- *; - replace - (((0 + 1 + 1) * (INR n0 + 1) + (0 + 1) + 1 + 1) * - ((0 + 1 + 1) * (INR n0 + 1) + (0 + 1) + 1)) with - (4 * INR n0 * INR n0 + 18 * INR n0 + 20); [ idtac | ring ]. -apply Rle_trans with 20. -apply Rle_trans with 16. -replace 16 with (Rsqr 4); [ idtac | ring_Rsqr ]. -replace (a * a) with (Rsqr a); [ idtac | reflexivity ]. -apply Rsqr_incr_1. -apply Rle_trans with PI; [ assumption | apply PI_4 ]. -assumption. -left; prove_sup0. -rewrite <- (Rplus_0_r 16); replace 20 with (16 + 4); - [ apply Rplus_le_compat_l; left; prove_sup0 | ring ]. -rewrite <- (Rplus_comm 20); pattern 20 at 1 in |- *; rewrite <- Rplus_0_r; - apply Rplus_le_compat_l. -apply Rplus_le_le_0_compat. -repeat apply Rmult_le_pos. -left; prove_sup0. -left; prove_sup0. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -apply Rmult_le_pos. -left; prove_sup0. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -apply INR_fact_neq_0. -apply INR_fact_neq_0. -simpl in |- *; ring. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite plus_INR; - do 2 rewrite mult_INR; repeat rewrite S_INR; ring. -assert (H3 := cv_speed_pow_fact a); unfold Un in |- *; unfold Un_cv in H3; - unfold R_dist in H3; unfold Un_cv in |- *; unfold R_dist in |- *; - intros; elim (H3 eps H4); intros N H5. -exists N; intros; apply H5. -replace (2 * S n0 + 1)%nat with (S (2 * S n0)). -unfold ge in |- *; apply le_trans with (2 * S n0)%nat. -apply le_trans with (2 * S N)%nat. -apply le_trans with (2 * N)%nat. -apply le_n_2n. -apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_Sn. -apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_S; assumption. -apply le_n_Sn. -apply INR_eq; rewrite S_INR; rewrite plus_INR; rewrite mult_INR; reflexivity. -assert (X := exist_sin (Rsqr a)); elim X; intros. -cut (x = sin a / a). -intro; rewrite H3 in p; unfold sin_in in p; unfold infinit_sum in p; - unfold R_dist in p; unfold Un_cv in |- *; unfold R_dist in |- *; - intros. -cut (0 < eps / Rabs a). -intro; elim (p _ H5); intros N H6. -exists N; intros. -replace (sum_f_R0 (tg_alt Un) n0) with - (a * (1 - sum_f_R0 (fun i:nat => sin_n i * Rsqr a ^ i) (S n0))). -unfold Rminus in |- *; rewrite Rmult_plus_distr_l; rewrite Rmult_1_r; - rewrite Ropp_plus_distr; rewrite Ropp_involutive; - repeat rewrite Rplus_assoc; rewrite (Rplus_comm a); - rewrite (Rplus_comm (- a)); repeat rewrite Rplus_assoc; - rewrite Rplus_opp_l; rewrite Rplus_0_r; apply Rmult_lt_reg_l with (/ Rabs a). -apply Rinv_0_lt_compat; apply Rabs_pos_lt; assumption. -pattern (/ Rabs a) at 1 in |- *; rewrite <- (Rabs_Rinv a Hyp_a). -rewrite <- Rabs_mult; rewrite Rmult_plus_distr_l; rewrite <- Rmult_assoc; - rewrite <- Rinv_l_sym; [ rewrite Rmult_1_l | assumption ]; - rewrite (Rmult_comm (/ a)); rewrite (Rmult_comm (/ Rabs a)); - rewrite <- Rabs_Ropp; rewrite Ropp_plus_distr; rewrite Ropp_involutive; - unfold Rminus, Rdiv in H6; apply H6; unfold ge in |- *; - apply le_trans with n0; [ exact H7 | apply le_n_Sn ]. -rewrite (decomp_sum (fun i:nat => sin_n i * Rsqr a ^ i) (S n0)). -replace (sin_n 0) with 1. -simpl in |- *; rewrite Rmult_1_r; unfold Rminus in |- *; - rewrite Ropp_plus_distr; rewrite <- Rplus_assoc; rewrite Rplus_opp_r; - rewrite Rplus_0_l; rewrite Ropp_mult_distr_r_reverse; - rewrite <- Ropp_mult_distr_l_reverse; rewrite scal_sum; - apply sum_eq. -intros; unfold sin_n, Un, tg_alt in |- *; - replace ((-1) ^ S i) with (- (-1) ^ i). -replace (a ^ (2 * S i + 1)) with (Rsqr a * Rsqr a ^ i * a). -unfold Rdiv in |- *; ring. -rewrite pow_add; rewrite pow_Rsqr; simpl in |- *; ring. -simpl in |- *; ring. -unfold sin_n in |- *; unfold Rdiv in |- *; simpl in |- *; rewrite Rinv_1; - rewrite Rmult_1_r; reflexivity. -apply lt_O_Sn. -unfold Rdiv in |- *; apply Rmult_lt_0_compat. -assumption. -apply Rinv_0_lt_compat; apply Rabs_pos_lt; assumption. -unfold sin in |- *; case (exist_sin (Rsqr a)). -intros; cut (x = x0). -intro; rewrite H3; unfold Rdiv in |- *. -symmetry in |- *; apply Rinv_r_simpl_m; assumption. -unfold sin_in in p; unfold sin_in in s; eapply uniqueness_sum. -apply p. -apply s. -intros; elim H2; intros. -replace (sin a - a) with (- (a - sin a)); [ idtac | ring ]. -split; apply Ropp_le_contravar; assumption. -replace (- sum_f_R0 (tg_alt Un) (S (2 * n))) with - (-1 * sum_f_R0 (tg_alt Un) (S (2 * n))); [ rewrite scal_sum | ring ]. -apply sum_eq; intros; unfold sin_term, Un, tg_alt in |- *; - replace ((-1) ^ S i) with (-1 * (-1) ^ i). -unfold Rdiv in |- *; ring. -reflexivity. -replace (- sum_f_R0 (tg_alt Un) (2 * n)) with - (-1 * sum_f_R0 (tg_alt Un) (2 * n)); [ rewrite scal_sum | ring ]. -apply sum_eq; intros. -unfold sin_term, Un, tg_alt in |- *; - replace ((-1) ^ S i) with (-1 * (-1) ^ i). -unfold Rdiv in |- *; ring. -reflexivity. -replace (2 * (n + 1))%nat with (S (S (2 * n))). -reflexivity. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite mult_INR; rewrite plus_INR; - repeat rewrite S_INR; ring. -replace (2 * n + 1)%nat with (S (2 * n)). -reflexivity. -apply INR_eq; rewrite S_INR; rewrite plus_INR; rewrite mult_INR; - repeat rewrite S_INR; ring. -intro; elim H1; intros. -split. -apply Rplus_le_reg_l with (- a). -rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; - rewrite (Rplus_comm (- a)); apply H2. -apply Rplus_le_reg_l with (- a). -rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; - rewrite (Rplus_comm (- a)); apply H3. -unfold sin_term in |- *; simpl in |- *; unfold Rdiv in |- *; rewrite Rinv_1; - ring. -replace (2 * (n + 1))%nat with (S (S (2 * n))). -apply lt_O_Sn. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite mult_INR; rewrite plus_INR; - repeat rewrite S_INR; ring. -replace (2 * n + 1)%nat with (S (2 * n)). -apply lt_O_Sn. -apply INR_eq; rewrite S_INR; rewrite plus_INR; rewrite mult_INR; - repeat rewrite S_INR; ring. -inversion H; [ assumption | elim Hyp_a; symmetry in |- *; assumption ]. + forall (a:R) (n:nat), + 0 <= a -> + a <= PI -> sin_approx a (2 * n + 1) <= sin a <= sin_approx a (2 * (n + 1)). +Proof. + intros; case (Req_dec a 0); intro Hyp_a. + rewrite Hyp_a; rewrite sin_0; split; right; unfold sin_approx in |- *; + apply sum_eq_R0 || (symmetry in |- *; apply sum_eq_R0); + intros; unfold sin_term in |- *; rewrite pow_add; + simpl in |- *; unfold Rdiv in |- *; rewrite Rmult_0_l; + ring. + unfold sin_approx in |- *; cut (0 < a). + intro Hyp_a_pos. + rewrite (decomp_sum (sin_term a) (2 * n + 1)). + rewrite (decomp_sum (sin_term a) (2 * (n + 1))). + replace (sin_term a 0) with a. + cut + (sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * n + 1)) <= sin a - a /\ + sin a - a <= sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * (n + 1))) -> + a + sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * n + 1)) <= sin a /\ + sin a <= a + sum_f_R0 (fun i:nat => sin_term a (S i)) (pred (2 * (n + 1)))). + intro; apply H1. + set (Un := fun n:nat => a ^ (2 * S n + 1) / INR (fact (2 * S n + 1))). + replace (pred (2 * n + 1)) with (2 * n)%nat. + replace (pred (2 * (n + 1))) with (S (2 * n)). + replace (sum_f_R0 (fun i:nat => sin_term a (S i)) (2 * n)) with + (- sum_f_R0 (tg_alt Un) (2 * n)). + replace (sum_f_R0 (fun i:nat => sin_term a (S i)) (S (2 * n))) with + (- sum_f_R0 (tg_alt Un) (S (2 * n))). + cut + (sum_f_R0 (tg_alt Un) (S (2 * n)) <= a - sin a <= + sum_f_R0 (tg_alt Un) (2 * n) -> + - sum_f_R0 (tg_alt Un) (2 * n) <= sin a - a <= + - sum_f_R0 (tg_alt Un) (S (2 * n))). + intro; apply H2. + apply alternated_series_ineq. + unfold Un_decreasing, Un in |- *; intro; + cut ((2 * S (S n0) + 1)%nat = S (S (2 * S n0 + 1))). + intro; rewrite H3. + replace (a ^ S (S (2 * S n0 + 1))) with (a ^ (2 * S n0 + 1) * (a * a)). + unfold Rdiv in |- *; rewrite Rmult_assoc; apply Rmult_le_compat_l. + left; apply pow_lt; assumption. + apply Rmult_le_reg_l with (INR (fact (S (S (2 * S n0 + 1))))). + rewrite <- H3; apply lt_INR_0; apply neq_O_lt; red in |- *; intro; + assert (H5 := sym_eq H4); elim (fact_neq_0 _ H5). + rewrite <- H3; rewrite (Rmult_comm (INR (fact (2 * S (S n0) + 1)))); + rewrite Rmult_assoc; rewrite <- Rinv_l_sym. + rewrite Rmult_1_r; rewrite H3; do 2 rewrite fact_simpl; do 2 rewrite mult_INR; + repeat rewrite Rmult_assoc; rewrite <- Rinv_r_sym. + rewrite Rmult_1_r. + do 2 rewrite S_INR; rewrite plus_INR; rewrite mult_INR; repeat rewrite S_INR; + simpl in |- *; + replace + (((0 + 1 + 1) * (INR n0 + 1) + (0 + 1) + 1 + 1) * + ((0 + 1 + 1) * (INR n0 + 1) + (0 + 1) + 1)) with + (4 * INR n0 * INR n0 + 18 * INR n0 + 20); [ idtac | ring ]. + apply Rle_trans with 20. + apply Rle_trans with 16. + replace 16 with (Rsqr 4); [ idtac | ring_Rsqr ]. + replace (a * a) with (Rsqr a); [ idtac | reflexivity ]. + apply Rsqr_incr_1. + apply Rle_trans with PI; [ assumption | apply PI_4 ]. + assumption. + left; prove_sup0. + rewrite <- (Rplus_0_r 16); replace 20 with (16 + 4); + [ apply Rplus_le_compat_l; left; prove_sup0 | ring ]. + rewrite <- (Rplus_comm 20); pattern 20 at 1 in |- *; rewrite <- Rplus_0_r; + apply Rplus_le_compat_l. + apply Rplus_le_le_0_compat. + repeat apply Rmult_le_pos. + left; prove_sup0. + left; prove_sup0. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + apply Rmult_le_pos. + left; prove_sup0. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + apply INR_fact_neq_0. + apply INR_fact_neq_0. + simpl in |- *; ring. + ring_nat. + assert (H3 := cv_speed_pow_fact a); unfold Un in |- *; unfold Un_cv in H3; + unfold R_dist in H3; unfold Un_cv in |- *; unfold R_dist in |- *; + intros; elim (H3 eps H4); intros N H5. + exists N; intros; apply H5. + replace (2 * S n0 + 1)%nat with (S (2 * S n0)). + unfold ge in |- *; apply le_trans with (2 * S n0)%nat. + apply le_trans with (2 * S N)%nat. + apply le_trans with (2 * N)%nat. + apply le_n_2n. + apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_Sn. + apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_S; assumption. + apply le_n_Sn. + ring. + assert (X := exist_sin (Rsqr a)); elim X; intros. + cut (x = sin a / a). + intro; rewrite H3 in p; unfold sin_in in p; unfold infinit_sum in p; + unfold R_dist in p; unfold Un_cv in |- *; unfold R_dist in |- *; + intros. + cut (0 < eps / Rabs a). + intro; elim (p _ H5); intros N H6. + exists N; intros. + replace (sum_f_R0 (tg_alt Un) n0) with + (a * (1 - sum_f_R0 (fun i:nat => sin_n i * Rsqr a ^ i) (S n0))). + unfold Rminus in |- *; rewrite Rmult_plus_distr_l; rewrite Rmult_1_r; + rewrite Ropp_plus_distr; rewrite Ropp_involutive; + repeat rewrite Rplus_assoc; rewrite (Rplus_comm a); + rewrite (Rplus_comm (- a)); repeat rewrite Rplus_assoc; + rewrite Rplus_opp_l; rewrite Rplus_0_r; apply Rmult_lt_reg_l with (/ Rabs a). + apply Rinv_0_lt_compat; apply Rabs_pos_lt; assumption. + pattern (/ Rabs a) at 1 in |- *; rewrite <- (Rabs_Rinv a Hyp_a). + rewrite <- Rabs_mult; rewrite Rmult_plus_distr_l; rewrite <- Rmult_assoc; + rewrite <- Rinv_l_sym; [ rewrite Rmult_1_l | assumption ]; + rewrite (Rmult_comm (/ a)); rewrite (Rmult_comm (/ Rabs a)); + rewrite <- Rabs_Ropp; rewrite Ropp_plus_distr; rewrite Ropp_involutive; + unfold Rminus, Rdiv in H6; apply H6; unfold ge in |- *; + apply le_trans with n0; [ exact H7 | apply le_n_Sn ]. + rewrite (decomp_sum (fun i:nat => sin_n i * Rsqr a ^ i) (S n0)). + replace (sin_n 0) with 1. + simpl in |- *; rewrite Rmult_1_r; unfold Rminus in |- *; + rewrite Ropp_plus_distr; rewrite <- Rplus_assoc; rewrite Rplus_opp_r; + rewrite Rplus_0_l; rewrite Ropp_mult_distr_r_reverse; + rewrite <- Ropp_mult_distr_l_reverse; rewrite scal_sum; + apply sum_eq. + intros; unfold sin_n, Un, tg_alt in |- *; + replace ((-1) ^ S i) with (- (-1) ^ i). + replace (a ^ (2 * S i + 1)) with (Rsqr a * Rsqr a ^ i * a). + unfold Rdiv in |- *; ring. + rewrite pow_add; rewrite pow_Rsqr; simpl in |- *; ring. + simpl in |- *; ring. + unfold sin_n in |- *; unfold Rdiv in |- *; simpl in |- *; rewrite Rinv_1; + rewrite Rmult_1_r; reflexivity. + apply lt_O_Sn. + unfold Rdiv in |- *; apply Rmult_lt_0_compat. + assumption. + apply Rinv_0_lt_compat; apply Rabs_pos_lt; assumption. + unfold sin in |- *; case (exist_sin (Rsqr a)). + intros; cut (x = x0). + intro; rewrite H3; unfold Rdiv in |- *. + symmetry in |- *; apply Rinv_r_simpl_m; assumption. + unfold sin_in in p; unfold sin_in in s; eapply uniqueness_sum. + apply p. + apply s. + intros; elim H2; intros. + replace (sin a - a) with (- (a - sin a)); [ idtac | ring ]. + split; apply Ropp_le_contravar; assumption. + replace (- sum_f_R0 (tg_alt Un) (S (2 * n))) with + (-1 * sum_f_R0 (tg_alt Un) (S (2 * n))); [ rewrite scal_sum | ring ]. + apply sum_eq; intros; unfold sin_term, Un, tg_alt in |- *; + replace ((-1) ^ S i) with (-1 * (-1) ^ i). + unfold Rdiv in |- *; ring. + reflexivity. + replace (- sum_f_R0 (tg_alt Un) (2 * n)) with + (-1 * sum_f_R0 (tg_alt Un) (2 * n)); [ rewrite scal_sum | ring ]. + apply sum_eq; intros. + unfold sin_term, Un, tg_alt in |- *; + replace ((-1) ^ S i) with (-1 * (-1) ^ i). + unfold Rdiv in |- *; ring. + reflexivity. + replace (2 * (n + 1))%nat with (S (S (2 * n))). + reflexivity. + ring. + replace (2 * n + 1)%nat with (S (2 * n)). + reflexivity. + ring. + intro; elim H1; intros. + split. + apply Rplus_le_reg_l with (- a). + rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; + rewrite (Rplus_comm (- a)); apply H2. + apply Rplus_le_reg_l with (- a). + rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; + rewrite (Rplus_comm (- a)); apply H3. + unfold sin_term in |- *; simpl in |- *; unfold Rdiv in |- *; rewrite Rinv_1; + ring. + replace (2 * (n + 1))%nat with (S (S (2 * n))). + apply lt_O_Sn. + ring. + replace (2 * n + 1)%nat with (S (2 * n)). + apply lt_O_Sn. + ring. + inversion H; [ assumption | elim Hyp_a; symmetry in |- *; assumption ]. Qed. (**********) Lemma cos_bound : - forall (a:R) (n:nat), - - PI / 2 <= a -> - a <= PI / 2 -> - cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1)). -cut - ((forall (a:R) (n:nat), - 0 <= a -> - a <= PI / 2 -> - cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1))) -> forall (a:R) (n:nat), - PI / 2 <= a -> a <= PI / 2 -> - cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1))). -intros H a n; apply H. -intros; unfold cos_approx in |- *. -rewrite (decomp_sum (cos_term a0) (2 * n0 + 1)). -rewrite (decomp_sum (cos_term a0) (2 * (n0 + 1))). -replace (cos_term a0 0) with 1. -cut - (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * n0 + 1)) <= cos a0 - 1 /\ - cos a0 - 1 <= - sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * (n0 + 1))) -> - 1 + sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * n0 + 1)) <= cos a0 /\ - cos a0 <= - 1 + sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * (n0 + 1)))). -intro; apply H2. -set (Un := fun n:nat => a0 ^ (2 * S n) / INR (fact (2 * S n))). -replace (pred (2 * n0 + 1)) with (2 * n0)%nat. -replace (pred (2 * (n0 + 1))) with (S (2 * n0)). -replace (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (2 * n0)) with - (- sum_f_R0 (tg_alt Un) (2 * n0)). -replace (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (S (2 * n0))) with - (- sum_f_R0 (tg_alt Un) (S (2 * n0))). -cut - (sum_f_R0 (tg_alt Un) (S (2 * n0)) <= 1 - cos a0 <= - sum_f_R0 (tg_alt Un) (2 * n0) -> - - sum_f_R0 (tg_alt Un) (2 * n0) <= cos a0 - 1 <= - - sum_f_R0 (tg_alt Un) (S (2 * n0))). -intro; apply H3. -apply alternated_series_ineq. -unfold Un_decreasing in |- *; intro; unfold Un in |- *. -cut ((2 * S (S n1))%nat = S (S (2 * S n1))). -intro; rewrite H4; - replace (a0 ^ S (S (2 * S n1))) with (a0 ^ (2 * S n1) * (a0 * a0)). -unfold Rdiv in |- *; rewrite Rmult_assoc; apply Rmult_le_compat_l. -apply pow_le; assumption. -apply Rmult_le_reg_l with (INR (fact (S (S (2 * S n1))))). -rewrite <- H4; apply lt_INR_0; apply neq_O_lt; red in |- *; intro; - assert (H6 := sym_eq H5); elim (fact_neq_0 _ H6). -rewrite <- H4; rewrite (Rmult_comm (INR (fact (2 * S (S n1))))); - rewrite Rmult_assoc; rewrite <- Rinv_l_sym. -rewrite Rmult_1_r; rewrite H4; do 2 rewrite fact_simpl; do 2 rewrite mult_INR; - repeat rewrite Rmult_assoc; rewrite <- Rinv_r_sym. -rewrite Rmult_1_r; do 2 rewrite S_INR; rewrite mult_INR; repeat rewrite S_INR; - simpl in |- *; - replace - (((0 + 1 + 1) * (INR n1 + 1) + 1 + 1) * ((0 + 1 + 1) * (INR n1 + 1) + 1)) - with (4 * INR n1 * INR n1 + 14 * INR n1 + 12); [ idtac | ring ]. -apply Rle_trans with 12. -apply Rle_trans with 4. -replace 4 with (Rsqr 2); [ idtac | ring_Rsqr ]. -replace (a0 * a0) with (Rsqr a0); [ idtac | reflexivity ]. -apply Rsqr_incr_1. -apply Rle_trans with (PI / 2). -assumption. -unfold Rdiv in |- *; apply Rmult_le_reg_l with 2. -prove_sup0. -rewrite <- Rmult_assoc; rewrite Rinv_r_simpl_m. -replace 4 with 4; [ apply PI_4 | ring ]. -discrR. -assumption. -left; prove_sup0. -pattern 4 at 1 in |- *; rewrite <- Rplus_0_r; replace 12 with (4 + 8); - [ apply Rplus_le_compat_l; left; prove_sup0 | ring ]. -rewrite <- (Rplus_comm 12); pattern 12 at 1 in |- *; rewrite <- Rplus_0_r; - apply Rplus_le_compat_l. -apply Rplus_le_le_0_compat. -repeat apply Rmult_le_pos. -left; prove_sup0. -left; prove_sup0. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -apply Rmult_le_pos. -left; prove_sup0. -replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. -apply INR_fact_neq_0. -apply INR_fact_neq_0. -simpl in |- *; ring. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite mult_INR; repeat rewrite S_INR; - ring. -assert (H4 := cv_speed_pow_fact a0); unfold Un in |- *; unfold Un_cv in H4; - unfold R_dist in H4; unfold Un_cv in |- *; unfold R_dist in |- *; - intros; elim (H4 eps H5); intros N H6; exists N; intros. -apply H6; unfold ge in |- *; apply le_trans with (2 * S N)%nat. -apply le_trans with (2 * N)%nat. -apply le_n_2n. -apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_Sn. -apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_S; assumption. -assert (X := exist_cos (Rsqr a0)); elim X; intros. -cut (x = cos a0). -intro; rewrite H4 in p; unfold cos_in in p; unfold infinit_sum in p; - unfold R_dist in p; unfold Un_cv in |- *; unfold R_dist in |- *; - intros. -elim (p _ H5); intros N H6. -exists N; intros. -replace (sum_f_R0 (tg_alt Un) n1) with - (1 - sum_f_R0 (fun i:nat => cos_n i * Rsqr a0 ^ i) (S n1)). -unfold Rminus in |- *; rewrite Ropp_plus_distr; rewrite Ropp_involutive; - repeat rewrite Rplus_assoc; rewrite (Rplus_comm 1); - rewrite (Rplus_comm (-1)); repeat rewrite Rplus_assoc; - rewrite Rplus_opp_l; rewrite Rplus_0_r; rewrite <- Rabs_Ropp; - rewrite Ropp_plus_distr; rewrite Ropp_involutive; - unfold Rminus in H6; apply H6. -unfold ge in |- *; apply le_trans with n1. -exact H7. -apply le_n_Sn. -rewrite (decomp_sum (fun i:nat => cos_n i * Rsqr a0 ^ i) (S n1)). -replace (cos_n 0) with 1. -simpl in |- *; rewrite Rmult_1_r; unfold Rminus in |- *; - rewrite Ropp_plus_distr; rewrite <- Rplus_assoc; rewrite Rplus_opp_r; - rewrite Rplus_0_l; - replace (- sum_f_R0 (fun i:nat => cos_n (S i) * (Rsqr a0 * Rsqr a0 ^ i)) n1) - with - (-1 * sum_f_R0 (fun i:nat => cos_n (S i) * (Rsqr a0 * Rsqr a0 ^ i)) n1); - [ idtac | ring ]; rewrite scal_sum; apply sum_eq; - intros; unfold cos_n, Un, tg_alt in |- *. -replace ((-1) ^ S i) with (- (-1) ^ i). -replace (a0 ^ (2 * S i)) with (Rsqr a0 * Rsqr a0 ^ i). -unfold Rdiv in |- *; ring. -rewrite pow_Rsqr; reflexivity. -simpl in |- *; ring. -unfold cos_n in |- *; unfold Rdiv in |- *; simpl in |- *; rewrite Rinv_1; - rewrite Rmult_1_r; reflexivity. -apply lt_O_Sn. -unfold cos in |- *; case (exist_cos (Rsqr a0)); intros; unfold cos_in in p; - unfold cos_in in c; eapply uniqueness_sum. -apply p. -apply c. -intros; elim H3; intros; replace (cos a0 - 1) with (- (1 - cos a0)); - [ idtac | ring ]. -split; apply Ropp_le_contravar; assumption. -replace (- sum_f_R0 (tg_alt Un) (S (2 * n0))) with - (-1 * sum_f_R0 (tg_alt Un) (S (2 * n0))); [ rewrite scal_sum | ring ]. -apply sum_eq; intros; unfold cos_term, Un, tg_alt in |- *; - replace ((-1) ^ S i) with (-1 * (-1) ^ i). -unfold Rdiv in |- *; ring. -reflexivity. -replace (- sum_f_R0 (tg_alt Un) (2 * n0)) with - (-1 * sum_f_R0 (tg_alt Un) (2 * n0)); [ rewrite scal_sum | ring ]; - apply sum_eq; intros; unfold cos_term, Un, tg_alt in |- *; - replace ((-1) ^ S i) with (-1 * (-1) ^ i). -unfold Rdiv in |- *; ring. -reflexivity. -replace (2 * (n0 + 1))%nat with (S (S (2 * n0))). -reflexivity. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite mult_INR; rewrite plus_INR; - repeat rewrite S_INR; ring. -replace (2 * n0 + 1)%nat with (S (2 * n0)). -reflexivity. -apply INR_eq; rewrite S_INR; rewrite plus_INR; rewrite mult_INR; - repeat rewrite S_INR; ring. -intro; elim H2; intros; split. -apply Rplus_le_reg_l with (-1). -rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; - rewrite (Rplus_comm (-1)); apply H3. -apply Rplus_le_reg_l with (-1). -rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; - rewrite (Rplus_comm (-1)); apply H4. -unfold cos_term in |- *; simpl in |- *; unfold Rdiv in |- *; rewrite Rinv_1; - ring. -replace (2 * (n0 + 1))%nat with (S (S (2 * n0))). -apply lt_O_Sn. -apply INR_eq; do 2 rewrite S_INR; do 2 rewrite mult_INR; rewrite plus_INR; - repeat rewrite S_INR; ring. -replace (2 * n0 + 1)%nat with (S (2 * n0)). -apply lt_O_Sn. -apply INR_eq; rewrite S_INR; rewrite plus_INR; rewrite mult_INR; - repeat rewrite S_INR; ring. -intros; case (total_order_T 0 a); intro. -elim s; intro. -apply H; [ left; assumption | assumption ]. -apply H; [ right; assumption | assumption ]. -cut (0 < - a). -intro; cut (forall (x:R) (n:nat), cos_approx x n = cos_approx (- x) n). -intro; rewrite H3; rewrite (H3 a (2 * (n + 1))%nat); rewrite cos_sym; apply H. -left; assumption. -rewrite <- (Ropp_involutive (PI / 2)); apply Ropp_le_contravar; - unfold Rdiv in |- *; unfold Rdiv in H0; rewrite <- Ropp_mult_distr_l_reverse; - exact H0. -intros; unfold cos_approx in |- *; apply sum_eq; intros; - unfold cos_term in |- *; do 2 rewrite pow_Rsqr; rewrite Rsqr_neg; - unfold Rdiv in |- *; reflexivity. -apply Ropp_0_gt_lt_contravar; assumption. + cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1)). +Proof. + cut + ((forall (a:R) (n:nat), + 0 <= a -> + a <= PI / 2 -> + cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1))) -> + forall (a:R) (n:nat), + - PI / 2 <= a -> + a <= PI / 2 -> + cos_approx a (2 * n + 1) <= cos a <= cos_approx a (2 * (n + 1))). + intros H a n; apply H. + intros; unfold cos_approx in |- *. + rewrite (decomp_sum (cos_term a0) (2 * n0 + 1)). + rewrite (decomp_sum (cos_term a0) (2 * (n0 + 1))). + replace (cos_term a0 0) with 1. + cut + (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * n0 + 1)) <= cos a0 - 1 /\ + cos a0 - 1 <= + sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * (n0 + 1))) -> + 1 + sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * n0 + 1)) <= cos a0 /\ + cos a0 <= + 1 + sum_f_R0 (fun i:nat => cos_term a0 (S i)) (pred (2 * (n0 + 1)))). + intro; apply H2. + set (Un := fun n:nat => a0 ^ (2 * S n) / INR (fact (2 * S n))). + replace (pred (2 * n0 + 1)) with (2 * n0)%nat. + replace (pred (2 * (n0 + 1))) with (S (2 * n0)). + replace (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (2 * n0)) with + (- sum_f_R0 (tg_alt Un) (2 * n0)). + replace (sum_f_R0 (fun i:nat => cos_term a0 (S i)) (S (2 * n0))) with + (- sum_f_R0 (tg_alt Un) (S (2 * n0))). + cut + (sum_f_R0 (tg_alt Un) (S (2 * n0)) <= 1 - cos a0 <= + sum_f_R0 (tg_alt Un) (2 * n0) -> + - sum_f_R0 (tg_alt Un) (2 * n0) <= cos a0 - 1 <= + - sum_f_R0 (tg_alt Un) (S (2 * n0))). + intro; apply H3. + apply alternated_series_ineq. + unfold Un_decreasing in |- *; intro; unfold Un in |- *. + cut ((2 * S (S n1))%nat = S (S (2 * S n1))). + intro; rewrite H4; + replace (a0 ^ S (S (2 * S n1))) with (a0 ^ (2 * S n1) * (a0 * a0)). + unfold Rdiv in |- *; rewrite Rmult_assoc; apply Rmult_le_compat_l. + apply pow_le; assumption. + apply Rmult_le_reg_l with (INR (fact (S (S (2 * S n1))))). + rewrite <- H4; apply lt_INR_0; apply neq_O_lt; red in |- *; intro; + assert (H6 := sym_eq H5); elim (fact_neq_0 _ H6). + rewrite <- H4; rewrite (Rmult_comm (INR (fact (2 * S (S n1))))); + rewrite Rmult_assoc; rewrite <- Rinv_l_sym. + rewrite Rmult_1_r; rewrite H4; do 2 rewrite fact_simpl; do 2 rewrite mult_INR; + repeat rewrite Rmult_assoc; rewrite <- Rinv_r_sym. + rewrite Rmult_1_r; do 2 rewrite S_INR; rewrite mult_INR; repeat rewrite S_INR; + simpl in |- *; + replace + (((0 + 1 + 1) * (INR n1 + 1) + 1 + 1) * ((0 + 1 + 1) * (INR n1 + 1) + 1)) + with (4 * INR n1 * INR n1 + 14 * INR n1 + 12); [ idtac | ring ]. + apply Rle_trans with 12. + apply Rle_trans with 4. + replace 4 with (Rsqr 2); [ idtac | ring_Rsqr ]. + replace (a0 * a0) with (Rsqr a0); [ idtac | reflexivity ]. + apply Rsqr_incr_1. + apply Rle_trans with (PI / 2). + assumption. + unfold Rdiv in |- *; apply Rmult_le_reg_l with 2. + prove_sup0. + rewrite <- Rmult_assoc; rewrite Rinv_r_simpl_m. + replace 4 with 4; [ apply PI_4 | ring ]. + discrR. + assumption. + left; prove_sup0. + pattern 4 at 1 in |- *; rewrite <- Rplus_0_r; replace 12 with (4 + 8); + [ apply Rplus_le_compat_l; left; prove_sup0 | ring ]. + rewrite <- (Rplus_comm 12); pattern 12 at 1 in |- *; rewrite <- Rplus_0_r; + apply Rplus_le_compat_l. + apply Rplus_le_le_0_compat. + repeat apply Rmult_le_pos. + left; prove_sup0. + left; prove_sup0. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + apply Rmult_le_pos. + left; prove_sup0. + replace 0 with (INR 0); [ apply le_INR; apply le_O_n | reflexivity ]. + apply INR_fact_neq_0. + apply INR_fact_neq_0. + simpl in |- *; ring. + ring_nat. + assert (H4 := cv_speed_pow_fact a0); unfold Un in |- *; unfold Un_cv in H4; + unfold R_dist in H4; unfold Un_cv in |- *; unfold R_dist in |- *; + intros; elim (H4 eps H5); intros N H6; exists N; intros. + apply H6; unfold ge in |- *; apply le_trans with (2 * S N)%nat. + apply le_trans with (2 * N)%nat. + apply le_n_2n. + apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_Sn. + apply (fun m n p:nat => mult_le_compat_l p n m); apply le_n_S; assumption. + assert (X := exist_cos (Rsqr a0)); elim X; intros. + cut (x = cos a0). + intro; rewrite H4 in p; unfold cos_in in p; unfold infinit_sum in p; + unfold R_dist in p; unfold Un_cv in |- *; unfold R_dist in |- *; + intros. + elim (p _ H5); intros N H6. + exists N; intros. + replace (sum_f_R0 (tg_alt Un) n1) with + (1 - sum_f_R0 (fun i:nat => cos_n i * Rsqr a0 ^ i) (S n1)). + unfold Rminus in |- *; rewrite Ropp_plus_distr; rewrite Ropp_involutive; + repeat rewrite Rplus_assoc; rewrite (Rplus_comm 1); + rewrite (Rplus_comm (-1)); repeat rewrite Rplus_assoc; + rewrite Rplus_opp_l; rewrite Rplus_0_r; rewrite <- Rabs_Ropp; + rewrite Ropp_plus_distr; rewrite Ropp_involutive; + unfold Rminus in H6; apply H6. + unfold ge in |- *; apply le_trans with n1. + exact H7. + apply le_n_Sn. + rewrite (decomp_sum (fun i:nat => cos_n i * Rsqr a0 ^ i) (S n1)). + replace (cos_n 0) with 1. + simpl in |- *; rewrite Rmult_1_r; unfold Rminus in |- *; + rewrite Ropp_plus_distr; rewrite <- Rplus_assoc; rewrite Rplus_opp_r; + rewrite Rplus_0_l; + replace (- sum_f_R0 (fun i:nat => cos_n (S i) * (Rsqr a0 * Rsqr a0 ^ i)) n1) + with + (-1 * sum_f_R0 (fun i:nat => cos_n (S i) * (Rsqr a0 * Rsqr a0 ^ i)) n1); + [ idtac | ring ]; rewrite scal_sum; apply sum_eq; + intros; unfold cos_n, Un, tg_alt in |- *. + replace ((-1) ^ S i) with (- (-1) ^ i). + replace (a0 ^ (2 * S i)) with (Rsqr a0 * Rsqr a0 ^ i). + unfold Rdiv in |- *; ring. + rewrite pow_Rsqr; reflexivity. + simpl in |- *; ring. + unfold cos_n in |- *; unfold Rdiv in |- *; simpl in |- *; rewrite Rinv_1; + rewrite Rmult_1_r; reflexivity. + apply lt_O_Sn. + unfold cos in |- *; case (exist_cos (Rsqr a0)); intros; unfold cos_in in p; + unfold cos_in in c; eapply uniqueness_sum. + apply p. + apply c. + intros; elim H3; intros; replace (cos a0 - 1) with (- (1 - cos a0)); + [ idtac | ring ]. + split; apply Ropp_le_contravar; assumption. + replace (- sum_f_R0 (tg_alt Un) (S (2 * n0))) with + (-1 * sum_f_R0 (tg_alt Un) (S (2 * n0))); [ rewrite scal_sum | ring ]. + apply sum_eq; intros; unfold cos_term, Un, tg_alt in |- *; + replace ((-1) ^ S i) with (-1 * (-1) ^ i). + unfold Rdiv in |- *; ring. + reflexivity. + replace (- sum_f_R0 (tg_alt Un) (2 * n0)) with + (-1 * sum_f_R0 (tg_alt Un) (2 * n0)); [ rewrite scal_sum | ring ]; + apply sum_eq; intros; unfold cos_term, Un, tg_alt in |- *; + replace ((-1) ^ S i) with (-1 * (-1) ^ i). + unfold Rdiv in |- *; ring. + reflexivity. + replace (2 * (n0 + 1))%nat with (S (S (2 * n0))). + reflexivity. + ring. + replace (2 * n0 + 1)%nat with (S (2 * n0)). + reflexivity. + ring. + intro; elim H2; intros; split. + apply Rplus_le_reg_l with (-1). + rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; + rewrite (Rplus_comm (-1)); apply H3. + apply Rplus_le_reg_l with (-1). + rewrite <- Rplus_assoc; rewrite Rplus_opp_l; rewrite Rplus_0_l; + rewrite (Rplus_comm (-1)); apply H4. + unfold cos_term in |- *; simpl in |- *; unfold Rdiv in |- *; rewrite Rinv_1; + ring. + replace (2 * (n0 + 1))%nat with (S (S (2 * n0))). + apply lt_O_Sn. + ring. + replace (2 * n0 + 1)%nat with (S (2 * n0)). + apply lt_O_Sn. + ring. + intros; case (total_order_T 0 a); intro. + elim s; intro. + apply H; [ left; assumption | assumption ]. + apply H; [ right; assumption | assumption ]. + cut (0 < - a). + intro; cut (forall (x:R) (n:nat), cos_approx x n = cos_approx (- x) n). + intro; rewrite H3; rewrite (H3 a (2 * (n + 1))%nat); rewrite cos_sym; apply H. + left; assumption. + rewrite <- (Ropp_involutive (PI / 2)); apply Ropp_le_contravar; + unfold Rdiv in |- *; unfold Rdiv in H0; rewrite <- Ropp_mult_distr_l_reverse; + exact H0. + intros; unfold cos_approx in |- *; apply sum_eq; intros; + unfold cos_term in |- *; do 2 rewrite pow_Rsqr; rewrite Rsqr_neg; + unfold Rdiv in |- *; reflexivity. + apply Ropp_0_gt_lt_contravar; assumption. Qed. |