src/HOL/Deriv.thy
changeset 29667 53103fc8ffa3
parent 29472 a63a2e46cec9
child 29803 c56a5571f60a
equal deleted inserted replaced
29549:7187373c6cb1 29667:53103fc8ffa3
   139 by (simp add: deriv_def diff_minus [symmetric] DERIV_LIM_iff)
   139 by (simp add: deriv_def diff_minus [symmetric] DERIV_LIM_iff)
   140 
   140 
   141 lemma inverse_diff_inverse:
   141 lemma inverse_diff_inverse:
   142   "\<lbrakk>(a::'a::division_ring) \<noteq> 0; b \<noteq> 0\<rbrakk>
   142   "\<lbrakk>(a::'a::division_ring) \<noteq> 0; b \<noteq> 0\<rbrakk>
   143    \<Longrightarrow> inverse a - inverse b = - (inverse a * (a - b) * inverse b)"
   143    \<Longrightarrow> inverse a - inverse b = - (inverse a * (a - b) * inverse b)"
   144 by (simp add: ring_simps)
   144 by (simp add: algebra_simps)
   145 
   145 
   146 lemma DERIV_inverse_lemma:
   146 lemma DERIV_inverse_lemma:
   147   "\<lbrakk>a \<noteq> 0; b \<noteq> (0::'a::real_normed_field)\<rbrakk>
   147   "\<lbrakk>a \<noteq> 0; b \<noteq> (0::'a::real_normed_field)\<rbrakk>
   148    \<Longrightarrow> (inverse a - inverse b) / h
   148    \<Longrightarrow> (inverse a - inverse b) / h
   149      = - (inverse a * ((a - b) / h) * inverse b)"
   149      = - (inverse a * ((a - b) / h) * inverse b)"
   204 case 0
   204 case 0
   205   show ?case by (simp add: power_Suc f)
   205   show ?case by (simp add: power_Suc f)
   206 case (Suc k)
   206 case (Suc k)
   207   from DERIV_mult' [OF f Suc] show ?case
   207   from DERIV_mult' [OF f Suc] show ?case
   208     apply (simp only: of_nat_Suc ring_distribs mult_1_left)
   208     apply (simp only: of_nat_Suc ring_distribs mult_1_left)
   209     apply (simp only: power_Suc right_distrib mult_ac add_ac)
   209     apply (simp only: power_Suc algebra_simps)
   210     done
   210     done
   211 qed
   211 qed
   212 
   212 
   213 lemma DERIV_power:
   213 lemma DERIV_power:
   214   fixes f :: "'a \<Rightarrow> 'a::{real_normed_field,recpower}"
   214   fixes f :: "'a \<Rightarrow> 'a::{real_normed_field,recpower}"
   722       hence "\<forall>x. a \<le> x & x \<le> b --> isCont (%x. inverse (M - f x)) x"
   722       hence "\<forall>x. a \<le> x & x \<le> b --> isCont (%x. inverse (M - f x)) x"
   723         by (auto simp add: isCont_inverse isCont_diff con)
   723         by (auto simp add: isCont_inverse isCont_diff con)
   724       from isCont_bounded [OF le this]
   724       from isCont_bounded [OF le this]
   725       obtain k where k: "!!x. a \<le> x & x \<le> b --> inverse (M - f x) \<le> k" by auto
   725       obtain k where k: "!!x. a \<le> x & x \<le> b --> inverse (M - f x) \<le> k" by auto
   726       have Minv: "!!x. a \<le> x & x \<le> b --> 0 < inverse (M - f (x))"
   726       have Minv: "!!x. a \<le> x & x \<le> b --> 0 < inverse (M - f (x))"
   727         by (simp add: M3 compare_rls)
   727         by (simp add: M3 algebra_simps)
   728       have "!!x. a \<le> x & x \<le> b --> inverse (M - f x) < k+1" using k
   728       have "!!x. a \<le> x & x \<le> b --> inverse (M - f x) < k+1" using k
   729         by (auto intro: order_le_less_trans [of _ k])
   729         by (auto intro: order_le_less_trans [of _ k])
   730       with Minv
   730       with Minv
   731       have "!!x. a \<le> x & x \<le> b --> inverse(k+1) < inverse(inverse(M - f x))"
   731       have "!!x. a \<le> x & x \<le> b --> inverse(k+1) < inverse(inverse(M - f x))"
   732         by (intro strip less_imp_inverse_less, simp_all)
   732         by (intro strip less_imp_inverse_less, simp_all)
  1396   moreover
  1396   moreover
  1397   {
  1397   {
  1398     have "?h b - ?h a =
  1398     have "?h b - ?h a =
  1399          ((f b)*(g b) - (f a)*(g b) - (g b)*(f b) + (g a)*(f b)) -
  1399          ((f b)*(g b) - (f a)*(g b) - (g b)*(f b) + (g a)*(f b)) -
  1400           ((f b)*(g a) - (f a)*(g a) - (g b)*(f a) + (g a)*(f a))"
  1400           ((f b)*(g a) - (f a)*(g a) - (g b)*(f a) + (g a)*(f a))"
  1401       by (simp add: mult_ac add_ac right_diff_distrib)
  1401       by (simp add: algebra_simps)
  1402     hence "?h b - ?h a = 0" by auto
  1402     hence "?h b - ?h a = 0" by auto
  1403   }
  1403   }
  1404   ultimately have "(b - a) * (g'c * (f b - f a) - f'c * (g b - g a)) = 0" by auto
  1404   ultimately have "(b - a) * (g'c * (f b - f a) - f'c * (g b - g a)) = 0" by auto
  1405   with alb have "g'c * (f b - f a) - f'c * (g b - g a) = 0" by simp
  1405   with alb have "g'c * (f b - f a) - f'c * (g b - g a) = 0" by simp
  1406   hence "g'c * (f b - f a) = f'c * (g b - g a)" by simp
  1406   hence "g'c * (f b - f a) = f'c * (g b - g a)" by simp
  1425 lemma pderiv_pCons: "pderiv (pCons a p) = p + pCons 0 (pderiv p)"
  1425 lemma pderiv_pCons: "pderiv (pCons a p) = p + pCons 0 (pderiv p)"
  1426   unfolding pderiv_def by (simp add: poly_rec_pCons)
  1426   unfolding pderiv_def by (simp add: poly_rec_pCons)
  1427 
  1427 
  1428 lemma coeff_pderiv: "coeff (pderiv p) n = of_nat (Suc n) * coeff p (Suc n)"
  1428 lemma coeff_pderiv: "coeff (pderiv p) n = of_nat (Suc n) * coeff p (Suc n)"
  1429   apply (induct p arbitrary: n, simp)
  1429   apply (induct p arbitrary: n, simp)
  1430   apply (simp add: pderiv_pCons coeff_pCons ring_simps split: nat.split)
  1430   apply (simp add: pderiv_pCons coeff_pCons algebra_simps split: nat.split)
  1431   done
  1431   done
  1432 
  1432 
  1433 lemma pderiv_eq_0_iff: "pderiv p = 0 \<longleftrightarrow> degree p = 0"
  1433 lemma pderiv_eq_0_iff: "pderiv p = 0 \<longleftrightarrow> degree p = 0"
  1434   apply (rule iffI)
  1434   apply (rule iffI)
  1435   apply (cases p, simp)
  1435   apply (cases p, simp)
  1449 
  1449 
  1450 lemma pderiv_singleton [simp]: "pderiv [:a:] = 0"
  1450 lemma pderiv_singleton [simp]: "pderiv [:a:] = 0"
  1451 by (simp add: pderiv_pCons)
  1451 by (simp add: pderiv_pCons)
  1452 
  1452 
  1453 lemma pderiv_add: "pderiv (p + q) = pderiv p + pderiv q"
  1453 lemma pderiv_add: "pderiv (p + q) = pderiv p + pderiv q"
  1454 by (rule poly_ext, simp add: coeff_pderiv ring_simps)
  1454 by (rule poly_ext, simp add: coeff_pderiv algebra_simps)
  1455 
  1455 
  1456 lemma pderiv_minus: "pderiv (- p) = - pderiv p"
  1456 lemma pderiv_minus: "pderiv (- p) = - pderiv p"
  1457 by (rule poly_ext, simp add: coeff_pderiv)
  1457 by (rule poly_ext, simp add: coeff_pderiv)
  1458 
  1458 
  1459 lemma pderiv_diff: "pderiv (p - q) = pderiv p - pderiv q"
  1459 lemma pderiv_diff: "pderiv (p - q) = pderiv p - pderiv q"
  1460 by (rule poly_ext, simp add: coeff_pderiv ring_simps)
  1460 by (rule poly_ext, simp add: coeff_pderiv algebra_simps)
  1461 
  1461 
  1462 lemma pderiv_smult: "pderiv (smult a p) = smult a (pderiv p)"
  1462 lemma pderiv_smult: "pderiv (smult a p) = smult a (pderiv p)"
  1463 by (rule poly_ext, simp add: coeff_pderiv ring_simps)
  1463 by (rule poly_ext, simp add: coeff_pderiv algebra_simps)
  1464 
  1464 
  1465 lemma pderiv_mult: "pderiv (p * q) = p * pderiv q + q * pderiv p"
  1465 lemma pderiv_mult: "pderiv (p * q) = p * pderiv q + q * pderiv p"
  1466 apply (induct p)
  1466 apply (induct p)
  1467 apply simp
  1467 apply simp
  1468 apply (simp add: pderiv_add pderiv_smult pderiv_pCons ring_simps)
  1468 apply (simp add: pderiv_add pderiv_smult pderiv_pCons algebra_simps)
  1469 done
  1469 done
  1470 
  1470 
  1471 lemma pderiv_power_Suc:
  1471 lemma pderiv_power_Suc:
  1472   "pderiv (p ^ Suc n) = smult (of_nat (Suc n)) (p ^ n) * pderiv p"
  1472   "pderiv (p ^ Suc n) = smult (of_nat (Suc n)) (p ^ n) * pderiv p"
  1473 apply (induct n)
  1473 apply (induct n)
  1474 apply simp
  1474 apply simp
  1475 apply (subst power_Suc)
  1475 apply (subst power_Suc)
  1476 apply (subst pderiv_mult)
  1476 apply (subst pderiv_mult)
  1477 apply (erule ssubst)
  1477 apply (erule ssubst)
  1478 apply (simp add: smult_add_left ring_simps)
  1478 apply (simp add: smult_add_left algebra_simps)
  1479 done
  1479 done
  1480 
  1480 
  1481 lemma DERIV_cmult2: "DERIV f x :> D ==> DERIV (%x. (f x) * c :: real) x :> D * c"
  1481 lemma DERIV_cmult2: "DERIV f x :> D ==> DERIV (%x. (f x) * c :: real) x :> D * c"
  1482 by (simp add: DERIV_cmult mult_commute [of _ c])
  1482 by (simp add: DERIV_cmult mult_commute [of _ c])
  1483 
  1483