17 |
17 |
18 lemma Maclaurin_lemma: |
18 lemma Maclaurin_lemma: |
19 "0 < h ==> |
19 "0 < h ==> |
20 \<exists>B. f h = (\<Sum>m=0..<n. (j m / real (fact m)) * (h^m)) + |
20 \<exists>B. f h = (\<Sum>m=0..<n. (j m / real (fact m)) * (h^m)) + |
21 (B * ((h^n) / real(fact n)))" |
21 (B * ((h^n) / real(fact n)))" |
22 by (rule_tac x = "(f h - (\<Sum>m=0..<n. (j m / real (fact m)) * h^m)) * |
22 by (rule exI[where x = "(f h - (\<Sum>m=0..<n. (j m / real (fact m)) * h^m)) * |
23 real(fact n) / (h^n)" |
23 real(fact n) / (h^n)"]) simp |
24 in exI, simp) |
|
25 |
24 |
26 lemma eq_diff_eq': "(x = y - z) = (y = x + (z::real))" |
25 lemma eq_diff_eq': "(x = y - z) = (y = x + (z::real))" |
27 by arith |
26 by arith |
28 |
27 |
29 lemma fact_diff_Suc [rule_format]: |
28 lemma fact_diff_Suc [rule_format]: |
30 "n < Suc m ==> fact (Suc m - n) = (Suc m - n) * fact (m - n)" |
29 "n < Suc m ==> fact (Suc m - n) = (Suc m - n) * fact (m - n)" |
31 by (subst fact_reduce_nat, auto) |
30 by (subst fact_reduce_nat, auto) |
32 |
31 |
33 lemma Maclaurin_lemma2: |
32 lemma Maclaurin_lemma2: |
|
33 fixes B |
34 assumes DERIV : "\<forall>m t. m < n \<and> 0\<le>t \<and> t\<le>h \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" |
34 assumes DERIV : "\<forall>m t. m < n \<and> 0\<le>t \<and> t\<le>h \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" |
35 and INIT : "n = Suc k" |
35 and INIT : "n = Suc k" |
36 and DIFG_DEF: "difg = (\<lambda>m t. diff m t - ((\<Sum>p = 0..<n - m. diff (m + p) 0 / real (fact p) * t ^ p) + |
36 defines "difg \<equiv> (\<lambda>m t. diff m t - ((\<Sum>p = 0..<n - m. diff (m + p) 0 / real (fact p) * t ^ p) + |
37 B * (t ^ (n - m) / real (fact (n - m)))))" |
37 B * (t ^ (n - m) / real (fact (n - m)))))" (is "difg \<equiv> (\<lambda>m t. diff m t - ?difg m t)") |
38 shows "\<forall>m t. m < n & 0 \<le> t & t \<le> h --> DERIV (difg m) t :> difg (Suc m) t" |
38 shows "\<forall>m t. m < n & 0 \<le> t & t \<le> h --> DERIV (difg m) t :> difg (Suc m) t" |
39 proof (rule allI)+ |
39 proof (rule allI impI)+ |
40 fix m |
40 fix m t assume INIT2: "m < n & 0 \<le> t & t \<le> h" |
41 fix t |
41 have "DERIV (difg m) t :> diff (Suc m) t - |
42 show "m < n \<and> 0 \<le> t \<and> t \<le> h \<longrightarrow> DERIV (difg m) t :> difg (Suc m) t" |
42 ((\<Sum>x = 0..<n - m. real x * t ^ (x - Suc 0) * diff (m + x) 0 / real (fact x)) + |
43 proof |
43 real (n - m) * t ^ (n - Suc m) * B / real (fact (n - m)))" unfolding difg_def |
44 assume INIT2: "m < n & 0 \<le> t & t \<le> h" |
44 by (auto intro!: DERIV_intros DERIV[rule_format, OF INIT2]) |
45 hence INTERV: "0 \<le> t & t \<le> h" .. |
|
46 from INIT2 and INIT have mtok: "m < Suc k" by arith |
|
47 have "DERIV (\<lambda>t. diff m t - |
|
48 ((\<Sum>p = 0..<Suc k - m. diff (m + p) 0 / real (fact p) * t ^ p) + |
|
49 B * (t ^ (Suc k - m) / real (fact (Suc k - m))))) |
|
50 t :> diff (Suc m) t - |
|
51 ((\<Sum>p = 0..<Suc k - Suc m. diff (Suc m + p) 0 / real (fact p) * t ^ p) + |
|
52 B * (t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m))))" |
|
53 proof - |
|
54 from DERIV and INIT2 have "DERIV (diff m) t :> diff (Suc m) t" by simp |
|
55 moreover |
45 moreover |
56 have " DERIV (\<lambda>x. (\<Sum>p = 0..<Suc k - m. diff (m + p) 0 / real (fact p) * x ^ p) + |
46 from INIT2 have intvl: "{..<n - m} = insert 0 (Suc ` {..<n - Suc m})" and "0 < n - m" |
57 B * (x ^ (Suc k - m) / real (fact (Suc k - m)))) |
47 unfolding atLeast0LessThan[symmetric] by auto |
58 t :> (\<Sum>p = 0..<Suc k - Suc m. diff (Suc m + p) 0 / real (fact p) * t ^ p) + |
48 have "(\<Sum>x = 0..<n - m. real x * t ^ (x - Suc 0) * diff (m + x) 0 / real (fact x)) = |
59 B * (t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m)))" |
49 (\<Sum>x = 0..<n - Suc m. real (Suc x) * t ^ x * diff (Suc m + x) 0 / real (fact (Suc x)))" |
60 proof - |
50 unfolding intvl atLeast0LessThan by (subst setsum.insert) (auto simp: setsum.reindex) |
61 have "DERIV (\<lambda>x. \<Sum>p = 0..<Suc k - m. diff (m + p) 0 / real (fact p) * x ^ p) t |
51 moreover |
62 :> (\<Sum>p = 0..<Suc k - Suc m. diff (Suc m + p) 0 / real (fact p) * t ^ p)" |
52 have fact_neq_0: "\<And>x::nat. real (fact x) + real x * real (fact x) \<noteq> 0" |
63 proof - |
53 by (metis fact_gt_zero_nat not_add_less1 real_of_nat_add real_of_nat_mult real_of_nat_zero_iff) |
64 have "\<exists> d. k = m + d" |
54 have "\<And>x. real (Suc x) * t ^ x * diff (Suc m + x) 0 / real (fact (Suc x)) = |
65 proof - |
55 diff (Suc m + x) 0 * t^x / real (fact x)" |
66 from INIT2 have "m < n" .. |
56 by (auto simp: field_simps real_of_nat_Suc fact_neq_0 intro!: nonzero_divide_eq_eq[THEN iffD2]) |
67 hence "\<exists> d. n = m + d + Suc 0" by arith |
57 moreover |
68 with INIT show ?thesis by (simp del: setsum_op_ivl_Suc) |
58 have "real (n - m) * t ^ (n - Suc m) * B / real (fact (n - m)) = |
69 qed |
59 B * (t ^ (n - Suc m) / real (fact (n - Suc m)))" |
70 from this obtain d where kmd: "k = m + d" .. |
60 using `0 < n - m` by (simp add: fact_reduce_nat) |
71 have "DERIV (\<lambda>x. (\<Sum>ma = 0..<d. diff (Suc (m + ma)) 0 * x ^ Suc ma / real (fact (Suc ma))) + |
61 ultimately show "DERIV (difg m) t :> difg (Suc m) t" |
72 diff m 0) |
62 unfolding difg_def by simp |
73 t :> (\<Sum>p = 0..<d. diff (Suc (m + p)) 0 * t ^ p / real (fact p))" |
63 qed |
74 |
|
75 proof - |
|
76 have "DERIV (\<lambda>x. (\<Sum>ma = 0..<d. diff (Suc (m + ma)) 0 * x ^ Suc ma / real (fact (Suc ma))) + diff m 0) t :> (\<Sum>r = 0..<d. diff (Suc (m + r)) 0 * t ^ r / real (fact r)) + 0" |
|
77 proof - |
|
78 from DERIV and INTERV have "DERIV (\<lambda>x. (\<Sum>ma = 0..<d. diff (Suc (m + ma)) 0 * x ^ Suc ma / real (fact (Suc ma)))) t :> (\<Sum>r = 0..<d. diff (Suc (m + r)) 0 * t ^ r / real (fact r))" |
|
79 proof - |
|
80 have "\<forall>r. 0 \<le> r \<and> r < 0 + d \<longrightarrow> |
|
81 DERIV (\<lambda>x. diff (Suc (m + r)) 0 * x ^ Suc r / real (fact (Suc r))) t |
|
82 :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" |
|
83 proof (rule allI) |
|
84 fix r |
|
85 show " 0 \<le> r \<and> r < 0 + d \<longrightarrow> |
|
86 DERIV (\<lambda>x. diff (Suc (m + r)) 0 * x ^ Suc r / real (fact (Suc r))) t |
|
87 :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" |
|
88 proof |
|
89 assume "0 \<le> r & r < 0 + d" |
|
90 have "DERIV (\<lambda>x. diff (Suc (m + r)) 0 * |
|
91 (x ^ Suc r * inverse (real (fact (Suc r))))) |
|
92 t :> diff (Suc (m + r)) 0 * (t ^ r * inverse (real (fact r)))" |
|
93 proof - |
|
94 have "(1 + real r) * real (fact r) \<noteq> 0" by auto |
|
95 from this have "real (fact r) + real r * real (fact r) \<noteq> 0" |
|
96 by (metis add_nonneg_eq_0_iff mult_nonneg_nonneg real_of_nat_fact_not_zero real_of_nat_ge_zero) |
|
97 from this have "DERIV (\<lambda>x. x ^ Suc r * inverse (real (fact (Suc r)))) t :> real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (fact (Suc r))) + |
|
98 0 * t ^ Suc r" |
|
99 apply - by ( rule DERIV_intros | rule refl)+ auto |
|
100 moreover |
|
101 have "real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (fact (Suc r))) + |
|
102 0 * t ^ Suc r = |
|
103 t ^ r * inverse (real (fact r))" |
|
104 proof - |
|
105 |
|
106 have " real (Suc r) * t ^ (Suc r - Suc 0) * |
|
107 inverse (real (Suc r) * real (fact r)) + |
|
108 0 * t ^ Suc r = |
|
109 t ^ r * inverse (real (fact r))" by (simp add: mult_ac) |
|
110 hence "real (Suc r) * t ^ (Suc r - Suc 0) * inverse (real (Suc r * fact r)) + |
|
111 0 * t ^ Suc r = |
|
112 t ^ r * inverse (real (fact r))" by (subst real_of_nat_mult) |
|
113 thus ?thesis by (subst fact_Suc) |
|
114 qed |
|
115 ultimately have " DERIV (\<lambda>x. x ^ Suc r * inverse (real (fact (Suc r)))) t |
|
116 :> t ^ r * inverse (real (fact r))" by (rule lemma_DERIV_subst) |
|
117 thus ?thesis by (rule DERIV_cmult) |
|
118 qed |
|
119 thus "DERIV (\<lambda>x. diff (Suc (m + r)) 0 * x ^ Suc r / |
|
120 real (fact (Suc r))) |
|
121 t :> diff (Suc (m + r)) 0 * t ^ r / real (fact r)" by (simp (no_asm) add: divide_inverse mult_assoc del: fact_Suc power_Suc) |
|
122 qed |
|
123 qed |
|
124 thus ?thesis by (rule DERIV_sumr) |
|
125 qed |
|
126 moreover |
|
127 from DERIV_const have "DERIV (\<lambda>x. diff m 0) t :> 0" . |
|
128 ultimately show ?thesis by (rule DERIV_add) |
|
129 qed |
|
130 moreover |
|
131 have " (\<Sum>r = 0..<d. diff (Suc (m + r)) 0 * t ^ r / real (fact r)) + 0 = (\<Sum>p = 0..<d. diff (Suc (m + p)) 0 * t ^ p / real (fact p))" by simp |
|
132 ultimately show ?thesis by (rule lemma_DERIV_subst) |
|
133 qed |
|
134 with kmd and sumr_offset4 [of 1] show ?thesis by (simp del: setsum_op_ivl_Suc fact_Suc power_Suc) |
|
135 qed |
|
136 moreover |
|
137 have " DERIV (\<lambda>x. B * (x ^ (Suc k - m) / real (fact (Suc k - m)))) t |
|
138 :> B * (t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m)))" |
|
139 proof - |
|
140 have " DERIV (\<lambda>x. x ^ (Suc k - m) / real (fact (Suc k - m))) t |
|
141 :> t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m))" |
|
142 proof - |
|
143 have "DERIV (\<lambda>x. x ^ (Suc k - m)) t :> real (Suc k - m) * t ^ (Suc k - m - Suc 0)" by (rule DERIV_pow) |
|
144 moreover |
|
145 have "DERIV (\<lambda>x. real (fact (Suc k - m))) t :> 0" by (rule DERIV_const) |
|
146 moreover |
|
147 have "(\<lambda>x. real (fact (Suc k - m))) t \<noteq> 0" by simp |
|
148 ultimately have " DERIV (\<lambda>y. y ^ (Suc k - m) / real (fact (Suc k - m))) t |
|
149 :> ( real (Suc k - m) * t ^ (Suc k - m - Suc 0) * real (fact (Suc k - m)) + - (0 * t ^ (Suc k - m))) / |
|
150 real (fact (Suc k - m)) ^ Suc (Suc 0)" |
|
151 apply - |
|
152 apply (rule DERIV_cong) by (rule DERIV_intros | rule refl)+ auto |
|
153 moreover |
|
154 from mtok and INIT have "( real (Suc k - m) * t ^ (Suc k - m - Suc 0) * real (fact (Suc k - m)) + - (0 * t ^ (Suc k - m))) / |
|
155 real (fact (Suc k - m)) ^ Suc (Suc 0) = t ^ (Suc k - Suc m) / real (fact (Suc k - Suc m))" by (simp add: fact_diff_Suc) |
|
156 ultimately show ?thesis by (rule lemma_DERIV_subst) |
|
157 qed |
|
158 moreover |
|
159 thus ?thesis by (rule DERIV_cmult) |
|
160 qed |
|
161 ultimately show ?thesis by (rule DERIV_add) |
|
162 qed |
|
163 ultimately show ?thesis by (rule DERIV_diff) |
|
164 qed |
|
165 from INIT and this and DIFG_DEF show "DERIV (difg m) t :> difg (Suc m) t" by clarify |
|
166 qed |
|
167 qed |
|
168 |
|
169 |
64 |
170 lemma Maclaurin: |
65 lemma Maclaurin: |
171 assumes h: "0 < h" |
66 assumes h: "0 < h" |
172 assumes n: "0 < n" |
67 assumes n: "0 < n" |
173 assumes diff_0: "diff 0 = f" |
68 assumes diff_0: "diff 0 = f" |
175 "\<forall>m t. m < n & 0 \<le> t & t \<le> h --> DERIV (diff m) t :> diff (Suc m) t" |
70 "\<forall>m t. m < n & 0 \<le> t & t \<le> h --> DERIV (diff m) t :> diff (Suc m) t" |
176 shows |
71 shows |
177 "\<exists>t. 0 < t & t < h & |
72 "\<exists>t. 0 < t & t < h & |
178 f h = |
73 f h = |
179 setsum (%m. (diff m 0 / real (fact m)) * h ^ m) {0..<n} + |
74 setsum (%m. (diff m 0 / real (fact m)) * h ^ m) {0..<n} + |
180 (diff n t / real (fact n)) * h ^ n" |
75 (diff n t / real (fact n)) * h ^ n" |
181 proof - |
76 proof - |
182 from n obtain m where m: "n = Suc m" |
77 from n obtain m where m: "n = Suc m" |
183 by (cases n, simp add: n) |
78 by (cases n) (simp add: n) |
184 |
79 |
185 obtain B where f_h: "f h = |
80 obtain B where f_h: "f h = |
186 (\<Sum>m = 0..<n. diff m (0\<Colon>real) / real (fact m) * h ^ m) + |
81 (\<Sum>m = 0..<n. diff m (0\<Colon>real) / real (fact m) * h ^ m) + |
187 B * (h ^ n / real (fact n))" |
82 B * (h ^ n / real (fact n))" |
188 using Maclaurin_lemma [OF h] .. |
83 using Maclaurin_lemma [OF h] .. |
189 |
84 |
190 obtain g where g_def: "g = (%t. f t - |
85 def g \<equiv> "(\<lambda>t. f t - |
191 (setsum (%m. (diff m 0 / real(fact m)) * t^m) {0..<n} |
86 (setsum (\<lambda>m. (diff m 0 / real(fact m)) * t^m) {0..<n} |
192 + (B * (t^n / real(fact n)))))" by blast |
87 + (B * (t^n / real(fact n)))))" |
193 |
88 |
194 have g2: "g 0 = 0 & g h = 0" |
89 have g2: "g 0 = 0 & g h = 0" |
195 apply (simp add: m f_h g_def del: setsum_op_ivl_Suc) |
90 apply (simp add: m f_h g_def del: setsum_op_ivl_Suc) |
196 apply (cut_tac n = m and k = "Suc 0" in sumr_offset2) |
91 apply (cut_tac n = m and k = "Suc 0" in sumr_offset2) |
197 apply (simp add: eq_diff_eq' diff_0 del: setsum_op_ivl_Suc) |
92 apply (simp add: eq_diff_eq' diff_0 del: setsum_op_ivl_Suc) |
198 done |
93 done |
199 |
94 |
200 obtain difg where difg_def: "difg = (%m t. diff m t - |
95 def difg \<equiv> "(%m t. diff m t - |
201 (setsum (%p. (diff (m + p) 0 / real (fact p)) * (t ^ p)) {0..<n-m} |
96 (setsum (%p. (diff (m + p) 0 / real (fact p)) * (t ^ p)) {0..<n-m} |
202 + (B * ((t ^ (n - m)) / real (fact (n - m))))))" by blast |
97 + (B * ((t ^ (n - m)) / real (fact (n - m))))))" |
203 |
98 |
204 have difg_0: "difg 0 = g" |
99 have difg_0: "difg 0 = g" |
205 unfolding difg_def g_def by (simp add: diff_0) |
100 unfolding difg_def g_def by (simp add: diff_0) |
206 |
101 |
207 have difg_Suc: "\<forall>(m\<Colon>nat) t\<Colon>real. |
102 have difg_Suc: "\<forall>(m\<Colon>nat) t\<Colon>real. |
208 m < n \<and> (0\<Colon>real) \<le> t \<and> t \<le> h \<longrightarrow> DERIV (difg m) t :> difg (Suc m) t" |
103 m < n \<and> (0\<Colon>real) \<le> t \<and> t \<le> h \<longrightarrow> DERIV (difg m) t :> difg (Suc m) t" |
209 using diff_Suc m difg_def by (rule Maclaurin_lemma2) |
104 using diff_Suc m unfolding difg_def by (rule Maclaurin_lemma2) |
210 |
105 |
211 have difg_eq_0: "\<forall>m. m < n --> difg m 0 = 0" |
106 have difg_eq_0: "\<forall>m. m < n --> difg m 0 = 0" |
212 apply clarify |
107 apply clarify |
213 apply (simp add: m difg_def) |
108 apply (simp add: m difg_def) |
214 apply (frule less_iff_Suc_add [THEN iffD1], clarify) |
109 apply (frule less_iff_Suc_add [THEN iffD1], clarify) |
317 (\<Sum>m=0..<n. diff m 0 / real (fact m) * h ^ m) + |
211 (\<Sum>m=0..<n. diff m 0 / real (fact m) * h ^ m) + |
318 diff n t / real (fact n) * h ^ n)" |
212 diff n t / real (fact n) * h ^ n)" |
319 by (blast intro: Maclaurin2) |
213 by (blast intro: Maclaurin2) |
320 |
214 |
321 lemma Maclaurin_minus: |
215 lemma Maclaurin_minus: |
322 assumes INTERV : "h < 0" and |
216 assumes "h < 0" "0 < n" "diff 0 = f" |
323 INIT : "0 < n" "diff 0 = f" and |
217 and DERIV: "\<forall>m t. m < n & h \<le> t & t \<le> 0 --> DERIV (diff m) t :> diff (Suc m) t" |
324 ABL : "\<forall>m t. m < n & h \<le> t & t \<le> 0 --> DERIV (diff m) t :> diff (Suc m) t" |
|
325 shows "\<exists>t. h < t & t < 0 & |
218 shows "\<exists>t. h < t & t < 0 & |
326 f h = (\<Sum>m=0..<n. diff m 0 / real (fact m) * h ^ m) + |
219 f h = (\<Sum>m=0..<n. diff m 0 / real (fact m) * h ^ m) + |
327 diff n t / real (fact n) * h ^ n" |
220 diff n t / real (fact n) * h ^ n" |
328 proof - |
221 proof - |
329 from INTERV have "0 < -h" by simp |
222 txt "Transform @{text ABL'} into @{text DERIV_intros} format." |
330 moreover |
223 note DERIV' = DERIV_chain'[OF _ DERIV[rule_format], THEN DERIV_cong] |
331 from INIT have "0 < n" by simp |
224 from assms |
332 moreover |
225 have "\<exists>t>0. t < - h \<and> |
333 from INIT have "(% x. ( - 1) ^ 0 * diff 0 (- x)) = (% x. f (- x))" by simp |
|
334 moreover |
|
335 have "\<forall>m t. m < n \<and> 0 \<le> t \<and> t \<le> - h \<longrightarrow> |
|
336 DERIV (\<lambda>x. (- 1) ^ m * diff m (- x)) t :> (- 1) ^ Suc m * diff (Suc m) (- t)" |
|
337 proof (rule allI impI)+ |
|
338 fix m t |
|
339 assume tINTERV:" m < n \<and> 0 \<le> t \<and> t \<le> - h" |
|
340 with ABL show "DERIV (\<lambda>x. (- 1) ^ m * diff m (- x)) t :> (- 1) ^ Suc m * diff (Suc m) (- t)" |
|
341 proof - |
|
342 |
|
343 from ABL and tINTERV have "DERIV (\<lambda>x. diff m (- x)) t :> - diff (Suc m) (- t)" (is ?tABL) |
|
344 proof - |
|
345 from ABL and tINTERV have "DERIV (diff m) (- t) :> diff (Suc m) (- t)" by force |
|
346 moreover |
|
347 from DERIV_ident[of t] have "DERIV uminus t :> (- 1)" by (rule DERIV_minus) |
|
348 ultimately have "DERIV (\<lambda>x. diff m (- x)) t :> diff (Suc m) (- t) * - 1" by (rule DERIV_chain2) |
|
349 thus ?thesis by simp |
|
350 qed |
|
351 thus ?thesis |
|
352 proof - |
|
353 assume ?tABL hence "DERIV (\<lambda>x. -1 ^ m * diff m (- x)) t :> -1 ^ m * - diff (Suc m) (- t)" by (rule DERIV_cmult) |
|
354 hence "DERIV (\<lambda>x. -1 ^ m * diff m (- x)) t :> - (-1 ^ m * diff (Suc m) (- t))" by (subst minus_mult_right) |
|
355 thus ?thesis by simp |
|
356 qed |
|
357 qed |
|
358 qed |
|
359 ultimately have t_exists: "\<exists>t>0. t < - h \<and> |
|
360 f (- (- h)) = |
226 f (- (- h)) = |
361 (\<Sum>m = 0..<n. |
227 (\<Sum>m = 0..<n. |
362 (- 1) ^ m * diff m (- 0) / real (fact m) * (- h) ^ m) + |
228 (- 1) ^ m * diff m (- 0) / real (fact m) * (- h) ^ m) + |
363 (- 1) ^ n * diff n (- t) / real (fact n) * (- h) ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin) |
229 (- 1) ^ n * diff n (- t) / real (fact n) * (- h) ^ n" |
364 from this obtain t where t_def: "?P t" .. |
230 by (intro Maclaurin) (auto intro!: DERIV_intros DERIV') |
|
231 then guess t .. |
365 moreover |
232 moreover |
366 have "-1 ^ n * diff n (- t) * (- h) ^ n / real (fact n) = diff n (- t) * h ^ n / real (fact n)" |
233 have "-1 ^ n * diff n (- t) * (- h) ^ n / real (fact n) = diff n (- t) * h ^ n / real (fact n)" |
367 by (auto simp add: power_mult_distrib[symmetric]) |
234 by (auto simp add: power_mult_distrib[symmetric]) |
368 moreover |
235 moreover |
369 have "(SUM m = 0..<n. -1 ^ m * diff m 0 * (- h) ^ m / real (fact m)) = (SUM m = 0..<n. diff m 0 * h ^ m / real (fact m))" |
236 have "(SUM m = 0..<n. -1 ^ m * diff m 0 * (- h) ^ m / real (fact m)) = (SUM m = 0..<n. diff m 0 * h ^ m / real (fact m))" |
395 lemma Maclaurin_bi_le_lemma [rule_format]: |
262 lemma Maclaurin_bi_le_lemma [rule_format]: |
396 "n>0 \<longrightarrow> |
263 "n>0 \<longrightarrow> |
397 diff 0 0 = |
264 diff 0 0 = |
398 (\<Sum>m = 0..<n. diff m 0 * 0 ^ m / real (fact m)) + |
265 (\<Sum>m = 0..<n. diff m 0 * 0 ^ m / real (fact m)) + |
399 diff n 0 * 0 ^ n / real (fact n)" |
266 diff n 0 * 0 ^ n / real (fact n)" |
400 by (induct "n", auto) |
267 by (induct "n") auto |
401 |
268 |
402 lemma Maclaurin_bi_le: |
269 lemma Maclaurin_bi_le: |
403 assumes INIT : "diff 0 = f" |
270 assumes "diff 0 = f" |
404 and DERIV : "\<forall>m t. m < n & abs t \<le> abs x --> DERIV (diff m) t :> diff (Suc m) t" |
271 and DERIV : "\<forall>m t. m < n & abs t \<le> abs x --> DERIV (diff m) t :> diff (Suc m) t" |
405 shows "\<exists>t. abs t \<le> abs x & |
272 shows "\<exists>t. abs t \<le> abs x & |
406 f x = |
273 f x = |
407 (\<Sum>m=0..<n. diff m 0 / real (fact m) * x ^ m) + |
274 (\<Sum>m=0..<n. diff m 0 / real (fact m) * x ^ m) + |
408 diff n t / real (fact n) * x ^ n" |
275 diff n t / real (fact n) * x ^ n" (is "\<exists>t. _ \<and> f x = ?f x t") |
409 proof (cases "n = 0") |
276 proof cases |
410 case True from INIT True show ?thesis by force |
277 assume "n = 0" with `diff 0 = f` show ?thesis by force |
411 next |
278 next |
412 case False |
279 assume "n \<noteq> 0" |
413 from this have n_not_zero:"n \<noteq> 0" . |
280 show ?thesis |
414 from False INIT DERIV show ?thesis |
281 proof (cases rule: linorder_cases) |
415 proof (cases "x = 0") |
282 assume "x = 0" with `n \<noteq> 0` `diff 0 = f` DERIV |
416 case True show ?thesis |
283 have "\<bar>0\<bar> \<le> \<bar>x\<bar> \<and> f x = ?f x 0" by (force simp add: Maclaurin_bi_le_lemma) |
417 proof - |
284 thus ?thesis .. |
418 from n_not_zero True INIT DERIV have "\<bar>0\<bar> \<le> \<bar>x\<bar> \<and> |
|
419 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n 0 / real (fact n) * x ^ n" by(force simp add: Maclaurin_bi_le_lemma) |
|
420 thus ?thesis .. |
|
421 qed |
|
422 next |
285 next |
423 case False |
286 assume "x < 0" |
424 note linorder_less_linear [of "x" "0"] |
287 with `n \<noteq> 0` DERIV |
425 thus ?thesis |
288 have "\<exists>t>x. t < 0 \<and> diff 0 x = ?f x t" by (intro Maclaurin_minus) auto |
426 proof (elim disjE) |
289 then guess t .. |
427 assume "x = 0" with False show ?thesis .. |
290 with `x < 0` `diff 0 = f` have "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> f x = ?f x t" by simp |
428 next |
291 thus ?thesis .. |
429 assume x_less_zero: "x < 0" moreover |
292 next |
430 from n_not_zero have "0 < n" by simp moreover |
293 assume "x > 0" |
431 have "diff 0 = diff 0" by simp moreover |
294 with `n \<noteq> 0` `diff 0 = f` DERIV |
432 have "\<forall>m t. m < n \<and> x \<le> t \<and> t \<le> 0 \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" |
295 have "\<exists>t>0. t < x \<and> diff 0 x = ?f x t" by (intro Maclaurin) auto |
433 proof (rule allI, rule allI, rule impI) |
296 then guess t .. |
434 fix m t |
297 with `x > 0` `diff 0 = f` have "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> f x = ?f x t" by simp |
435 assume "m < n & x \<le> t & t \<le> 0" |
298 thus ?thesis .. |
436 with DERIV show " DERIV (diff m) t :> diff (Suc m) t" by (fastsimp simp add: abs_if) |
|
437 qed |
|
438 ultimately have t_exists:"\<exists>t>x. t < 0 \<and> |
|
439 diff 0 x = |
|
440 (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin_minus) |
|
441 from this obtain t where t_def: "?P t" .. |
|
442 from t_def x_less_zero INIT have "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> |
|
443 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" |
|
444 by (simp add: abs_if order_less_le) |
|
445 thus ?thesis by (rule exI) |
|
446 next |
|
447 assume x_greater_zero: "x > 0" moreover |
|
448 from n_not_zero have "0 < n" by simp moreover |
|
449 have "diff 0 = diff 0" by simp moreover |
|
450 have "\<forall>m t. m < n \<and> 0 \<le> t \<and> t \<le> x \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" |
|
451 proof (rule allI, rule allI, rule impI) |
|
452 fix m t |
|
453 assume "m < n & 0 \<le> t & t \<le> x" |
|
454 with DERIV show " DERIV (diff m) t :> diff (Suc m) t" by fastsimp |
|
455 qed |
|
456 ultimately have t_exists:"\<exists>t>0. t < x \<and> |
|
457 diff 0 x = |
|
458 (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin) |
|
459 from this obtain t where t_def: "?P t" .. |
|
460 from t_def x_greater_zero INIT have "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> |
|
461 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" |
|
462 by fastsimp |
|
463 thus ?thesis .. |
|
464 qed |
|
465 qed |
299 qed |
466 qed |
300 qed |
467 |
|
468 |
301 |
469 lemma Maclaurin_all_lt: |
302 lemma Maclaurin_all_lt: |
470 assumes INIT1: "diff 0 = f" and INIT2: "0 < n" and INIT3: "x \<noteq> 0" |
303 assumes INIT1: "diff 0 = f" and INIT2: "0 < n" and INIT3: "x \<noteq> 0" |
471 and DERIV: "\<forall>m x. DERIV (diff m) x :> diff(Suc m) x" |
304 and DERIV: "\<forall>m x. DERIV (diff m) x :> diff(Suc m) x" |
472 shows "\<exists>t. 0 < abs t & abs t < abs x & |
305 shows "\<exists>t. 0 < abs t & abs t < abs x & f x = |
473 f x = (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |
306 (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |
474 (diff n t / real (fact n)) * x ^ n" |
307 (diff n t / real (fact n)) * x ^ n" (is "\<exists>t. _ \<and> _ \<and> f x = ?f x t") |
475 proof - |
308 proof (cases rule: linorder_cases) |
476 have "(x = 0) \<Longrightarrow> ?thesis" |
309 assume "x = 0" with INIT3 show "?thesis".. |
477 proof - |
310 next |
478 assume "x = 0" |
311 assume "x < 0" |
479 with INIT3 show "(x = 0) \<Longrightarrow> ?thesis".. |
312 with assms have "\<exists>t>x. t < 0 \<and> f x = ?f x t" by (intro Maclaurin_minus) auto |
480 qed |
313 then guess t .. |
481 moreover have "(x < 0) \<Longrightarrow> ?thesis" |
314 with `x < 0` have "0 < \<bar>t\<bar> \<and> \<bar>t\<bar> < \<bar>x\<bar> \<and> f x = ?f x t" by simp |
482 proof - |
315 thus ?thesis .. |
483 assume x_less_zero: "x < 0" |
316 next |
484 from DERIV have "\<forall>m t. m < n \<and> x \<le> t \<and> t \<le> 0 \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" by simp |
317 assume "x > 0" |
485 with x_less_zero INIT2 INIT1 have "\<exists>t>x. t < 0 \<and> f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin_minus) |
318 with assms have "\<exists>t>0. t < x \<and> f x = ?f x t " by (intro Maclaurin) auto |
486 from this obtain t where "?P t" .. |
319 then guess t .. |
487 with x_less_zero have "0 < \<bar>t\<bar> \<and> |
320 with `x > 0` have "0 < \<bar>t\<bar> \<and> \<bar>t\<bar> < \<bar>x\<bar> \<and> f x = ?f x t" by simp |
488 \<bar>t\<bar> < \<bar>x\<bar> \<and> |
321 thus ?thesis .. |
489 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" by simp |
|
490 thus ?thesis .. |
|
491 qed |
|
492 moreover have "(x > 0) \<Longrightarrow> ?thesis" |
|
493 proof - |
|
494 assume x_greater_zero: "x > 0" |
|
495 from DERIV have "\<forall>m t. m < n \<and> 0 \<le> t \<and> t \<le> x \<longrightarrow> DERIV (diff m) t :> diff (Suc m) t" by simp |
|
496 with x_greater_zero INIT2 INIT1 have "\<exists>t>0. t < x \<and> f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin) |
|
497 from this obtain t where "?P t" .. |
|
498 with x_greater_zero have "0 < \<bar>t\<bar> \<and> |
|
499 \<bar>t\<bar> < \<bar>x\<bar> \<and> |
|
500 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" by fastsimp |
|
501 thus ?thesis .. |
|
502 qed |
|
503 ultimately show ?thesis by (fastsimp) |
|
504 qed |
322 qed |
505 |
323 |
506 |
324 |
507 lemma Maclaurin_all_lt_objl: |
325 lemma Maclaurin_all_lt_objl: |
508 "diff 0 = f & |
326 "diff 0 = f & |
522 |
340 |
523 |
341 |
524 lemma Maclaurin_all_le: |
342 lemma Maclaurin_all_le: |
525 assumes INIT: "diff 0 = f" |
343 assumes INIT: "diff 0 = f" |
526 and DERIV: "\<forall>m x. DERIV (diff m) x :> diff (Suc m) x" |
344 and DERIV: "\<forall>m x. DERIV (diff m) x :> diff (Suc m) x" |
527 shows "\<exists>t. abs t \<le> abs x & |
345 shows "\<exists>t. abs t \<le> abs x & f x = |
528 f x = (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |
346 (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |
529 (diff n t / real (fact n)) * x ^ n" |
347 (diff n t / real (fact n)) * x ^ n" (is "\<exists>t. _ \<and> f x = ?f x t") |
530 proof - |
348 proof cases |
531 note linorder_le_less_linear [of n 0] |
349 assume "n = 0" with INIT show ?thesis by force |
532 thus ?thesis |
|
533 proof |
|
534 assume "n\<le> 0" with INIT show ?thesis by force |
|
535 next |
350 next |
536 assume n_greater_zero: "n > 0" show ?thesis |
351 assume "n \<noteq> 0" |
537 proof (cases "x = 0") |
352 show ?thesis |
538 case True |
353 proof cases |
539 from n_greater_zero have "n \<noteq> 0" by auto |
354 assume "x = 0" |
540 from True this have f_0:"(\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) = diff 0 0" by (rule Maclaurin_zero) |
355 with `n \<noteq> 0` have "(\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) = diff 0 0" |
541 from n_greater_zero have "n \<noteq> 0" by (rule gr_implies_not0) |
356 by (intro Maclaurin_zero) auto |
542 hence "\<exists> m. n = Suc m" by (rule not0_implies_Suc) |
357 with INIT `x = 0` `n \<noteq> 0` have " \<bar>0\<bar> \<le> \<bar>x\<bar> \<and> f x = ?f x 0" by force |
543 with f_0 True INIT have " \<bar>0\<bar> \<le> \<bar>x\<bar> \<and> |
358 thus ?thesis .. |
544 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n 0 / real (fact n) * x ^ n" |
359 next |
545 by force |
360 assume "x \<noteq> 0" |
546 thus ?thesis .. |
361 with INIT `n \<noteq> 0` DERIV have "\<exists>t. 0 < \<bar>t\<bar> \<and> \<bar>t\<bar> < \<bar>x\<bar> \<and> f x = ?f x t" |
547 next |
362 by (intro Maclaurin_all_lt) auto |
548 case False |
363 then guess t .. |
549 from INIT n_greater_zero this DERIV have "\<exists>t. 0 < \<bar>t\<bar> \<and> |
364 hence "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> f x = ?f x t" by simp |
550 \<bar>t\<bar> < \<bar>x\<bar> \<and> f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" (is "\<exists> t. ?P t") by (rule Maclaurin_all_lt) |
365 thus ?thesis .. |
551 from this obtain t where "?P t" .. |
|
552 hence "\<bar>t\<bar> \<le> \<bar>x\<bar> \<and> |
|
553 f x = (\<Sum>m = 0..<n. diff m 0 / real (fact m) * x ^ m) + diff n t / real (fact n) * x ^ n" by (simp add: order_less_le) |
|
554 thus ?thesis .. |
|
555 qed |
|
556 qed |
366 qed |
557 qed |
367 qed |
558 |
|
559 |
368 |
560 lemma Maclaurin_all_le_objl: "diff 0 = f & |
369 lemma Maclaurin_all_le_objl: "diff 0 = f & |
561 (\<forall>m x. DERIV (diff m) x :> diff (Suc m) x) |
370 (\<forall>m x. DERIV (diff m) x :> diff (Suc m) x) |
562 --> (\<exists>t. abs t \<le> abs x & |
371 --> (\<exists>t. abs t \<le> abs x & |
563 f x = (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |
372 f x = (\<Sum>m=0..<n. (diff m 0 / real (fact m)) * x ^ m) + |