475 Views
January 26, 22
スライド概要
Scheme プログラミング
URL: https://www.kkaneko.jp/pro/scheme/index.html
金子邦彦研究室
URL: https://www.kkaneko.jp/index.html
金子邦彦(かねこくにひこ) 福山大学・工学部・教授 ホームページ: https://www.kkaneko.jp/index.html 金子邦彦 YouTube チャンネル: https://youtube.com/user/kunihikokaneko
sp-9. 高階関数 (Scheme プログラミング) URL: https://www.kkaneko.jp/pro/scheme/index.html 金子邦彦 1
アウトライン 9-1 高階関数 9-2 パソコン演習 9-3 課題 2
今日の到達目標 • 高階関数のプログラムを理解できるように なる 1. リスト処理の関数 reduce 2. 数列の和 series 3. べき級数 taylor-series – 指数関数のテーラー展開 my-exp – cos 関数のテーラー展開 my-cos, my-log – 対数関数のテーラー展開 my-cos, my-log 3
高階関数とは • 関数の入力が,関数である 4
置き換えモデル 置き換えモデル(substitution model)のプロセス • 関数のパラメータが,実際の値で置き換わる • 変数が実際の値で置き換わる • 関数が,その「中身」で置き換わる 5
#i の意味 • (expt 11 200) 11200 を,有理数で計算 ⇒ 結果は有理数で得られる • (expt #i11 200) 11200 を,十数桁の小数で計算(近似値) ⇒ 結果は小数で得られる (expt #i11 200) = #i1.8990527646046183e+208 この「#i」は「結果が近似値」という意味 6
e+208 の意味 10 の 208 乗の意味 • 1.8990527646046183e+208 = 1.8990527646046183 × 10208 [参考] 1.23e-005 = 1.23 × 10-5 = 0.0000123 7
近似計算について • #iを付けると近似計算 • 計算結果として,近似値を得たいとき,#i を付ける 例)(expt #i11 200) • sin, cos, log 等の値は,近似値でしか得られない 例:「(sin 0.1)」を実行すると → #i0.09983341664682816 • 近似値を使った計算を繰り返すと,誤差が積み重な る 8
9-2 パソコン演習 9
パソコン演習の進め方 • 資料を見ながら,「例題」を行ってみる • 各自,「課題」に挑戦する • 自分のペースで先に進んで構いません 10
DrScheme の使用 • DrScheme の起動 プログラム → PLT Scheme → DrScheme • 今日の演習では「Advanced Student」 に設定 Language → Choose Language → Advanced Student → OK → 「Execute ボタン」 11
Advanced Student • 高階関数を実行するとき • DrScheme の Language で Advanced Student を 選択すること Intermediat Advanced e Student Student 高階関数の 不可 可能 実行 ステップ実 あり なし 行の機能 12
例題1.リストの総和 • 数のリスト a-list から総和を求める関数 listsum を作る • 但し,次の高階関数 reduce を使う ;; reduce: (number, data)->data, data, list -> data ;; (reduce g 0 (list 1 2 3)) = (g 1 (g 2 (g 3 0))) (define (reduce op base L) (cond [(empty? L) base] [else (op (first L) (reduce op base (rest L)))])) 13
「例題1.リストの総和」の手順 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; reduce: (number data -> data) data list -> data ;; (reduce g 0 (list 1 2 3)) = (g 1 (g 2 (g 3 0))) (define (reduce op base L) (cond [(empty? L) base] [else (op (first L) (reduce op base (rest L)))])) ;; list-sum: list -> number ;; total of a list ;; (list-sum (list 40 90 80)) = 210 (define (list-sum a-list) (reduce + 0 a-list)) 2. その後,次を「実行用ウインドウ」で実行しなさい (list-sum (list 1 2 3)) (list-sum empty) ☆ 次は,例題2に進んでください 14
まず,関数 reduce を定義している 15
次に関数 list-sum を定義している (define (list-sum a-list) (reduce + 0 a-list)) 16
これは, (list-sum (list 1 2 3)) と書いて,a-list の値を (list 1 2 3) に設定しての実行 実行結果である「6」が 表示される 17
入力と出力 (list 1 2 3) 0 g (g 1 (g 2 (g 3 0))) の値 (g が足し算 + のときは 1+2+3+0 = 6) reduce 入力 入力はリスト,数値 と関数 出力 出力は数値 reduce は,関数を入力とするような関数 (つまり高階関数) 18
;; reduce: (number data -> data) data list -> data ;; (reduce g 0 (list 1 2 3)) = (g 1 (g 2 (g 3 0))) (define (reduce op base L) (cond [(empty? L) base] 関数 op が,「reduce」 の入力になっている [else (op (first L) (reduce op base (rest L)))])) ;; list-sum: list -> number ;; total of a list ;; (list-sum (list 40 90 80)) = 210 (define (list-sum a-list) (reduce + 0 a-list)) 19
(list-sum (list 1 2 3)) から 6 に至る過程の概略 (list-sum (list 1 2 3)) 最初の式 = (reduce + 0 (list 1 2 3)) =… = (+ 1 (reduce + 0 (list 2 3))) =… = (+ 1 (+ 2 (reduce + 0 (list 3)))) =… = (+ 1 (+ 2 (+ 3 (reduce + 0 empty)))) = ... = (+ 1 (+ 2 (+ 3 0))) コンピュータ内部での計算 = … 実行結果 =6 20
(reduce + 0 (list 1 2 3) から (+ 1 (reduce + 0 (list 2 3) に至る過程 この (list-sum (list 1 2 3)) 部分は = (reduce + 0 (list 1 2 3)) (reduce + 0 (list 1 2 3)) = (cond =… [(empty? (list 1 2 3)) 0] = (+ 1 (reduce + 0 (list 2 3))) [else (+ (first (list 1 2 3)) (reduce + 0 (rest (list 1 2 3))))]) =… = (cond = (+ 1 (+ 2 (reduce + 0 (list 3))))[false 0] [else (+ (first (list 1 2 3)) =… (reduce + 0 (rest (list 1 2 3))))]) = (+ 1 (+ 2 (+ 3 (reduce + 0 = (+ (first (list 1 2 3)) (reduce + 0 (rest (list 1 2 3)))) empty)))) = (+ 1 (reduce + 0 (rest (list 1 2 3)))) = ... = (+ 1 (reduce + 0 (list 1 2))) = (+ 1 (+ 2 (+ 3 0))) =… 21 =6
(reduce + 0 (list 1 2 3) から (+ 1 (reduce + 0 (list 2 3) に至る過程 (list-sum (list 1 2 3)) この 部分は = (reduce + 0 (list 1 2 3)) (reduce + 0 (list 1 2 3)) = (cond =… [(empty? (list 1 2 3)) 0] = (+ 1 (reduce + 0 (list 2 3))) [else (+ (first (list 1 2 3)) (reduce + 0 (rest (list 1 2 3))))]) =… = (cond = (+ 1 (+ 2 (reduce + 0 (list 3))))[false 0] [else (+ (first (list 1 2 3)) = …これは, (reduce + 0 (rest (list 1 2 3))))]) (define (reduce op base L) = (+ (first (list 1 2 3)) = (+ 1 (+ 2 (+ 3 (reduce + 0 (cond (reduce + 0 (rest (list 1 2 3)))) empty)))) [(empty? L) base] = (+ 1 (reduce + 0 (rest (list 1 2 3)))) = ... = (+ 1 (reduce + 0 (list 1 2))) [else (op (first L) = (+ 1 (+ 2 (+(reduce 3 0))) op base (rest L)))])) = …の op を + で,base を 0 で,L を (list 1 2 3) で置き換えたも の 22 =6
例題2.x の n 乗の近似値 • #iを付けた近似計算を試してみるために,expt を使って,11 の 200 乗を計算してみる (expt 11 200) (expt #i11 200) 「#i」 は近似値という意味.近似計算でよい ことをコンピュータに教えている 23
「例題2.x の n 乗の近似値」の手順 1. 次を「実行用ウインドウ」で実行しなさい (expt 11 200) (expt #i11 200) ☆ 次は,例題3に進んでください 24
この「#i」は,「近似計算でよい」 ことをコンピュータに教えている 結果は「近似値」 である 25
数列の和 • 数列の和を求める高階関数 series を 作る • 数値 n と関数 f から,(f 1), (f 2), …. (f n) の和を求める ⇒ (f i) は数列の第 i 項 n つまり f ( k ) k =1 • series を使って,簡単な数列の和を 求めてみる • 2乗の和 12 + 22 + … + n2 • 3乗の和 13 + 23 + … + n3 26
数列の和 • n = 1 のとき n f ( k ) = f (1) k =1 • n > 1 のとき n f (k ) = k =1 n −1 f ( n) + f ( k ) k =1 27
数列の和 k2 数列 k2 100 80 総和が 60 k 40 2 20 0 1 2 3 4 5 6 7 8 9 10 k 28
「例題3.数列の和」の手順 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; series: number (number -> number) -> number ;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) (define (series n f) (cond [(= n 1) (f 1)] [else (+ (f n) (series (- n 1) f))])) (define (f2 k) (* k k)) (define (f3 k) (* k k k)) 2. その後,次を「実行用ウインドウ」で実行しなさい (series 3 f2) (series 4 f3) ☆ 次は,例題4に進んでください 29
まず,関数 series を定義している 30
次に関数 f2, f3 を定義している (define (f2 k) (* k k)) (define (f3 k) (* k k k)) 31
これは, (series 3 f2) と書いて,n の値を 3, f の値を f2 に設定しての実行 実行結果である「14」が 表示される 32
入力と出力 3 f2 (f2 3), (f2 2), (f2 1) の和 series 入力 入力は1つの数値と 関数 出力 出力は数値 series は,関数を入力とするような関数 (つまり高階関数) 33
;; series: number (number -> number) -> number ;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) (define (series n f) (cond [(= n 1) (f 1)] [else (+ (f n) 関数 f が, 「series」の入力になっている (series (- n 1) f))])) 34
(series 3 f2) から 14 に至る過程の概略 (series 3 f2) 最初の式 =… = (+ (f2 3) (series 2 f2)) =… 但し,f2 は (define (f2 k) (* k k)) = (+ (f2 3) (+ (f2 2) (series 1 f2))) =… = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) =… = 14 実行結果 コンピュータ内部での計算 35
(series 3 f2) から (+ (f2 3) (series 2 f2)) に至る過程 この 部分は (series 3 f2) = (cond =… [(= 3 1) (f2 1)] = (+ (f2 3) (series 2 f2)) [else (+ (f2 3) (series (- 3 1) f2))]) =… = (cond = (+ (f2 3) (+ (f2 2) (series 1 f2))) [false (f2 1)] [else (+ (f2 3) =… (series (- 3 1) f2))]) = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) = (+ (f2 3) (series (- 3 1) f2)) = (+ (f2 3) (series 2 f2)) =… (series 3 f2) = 14 36
(series 3 f2) から (+ (f2 3) (series 2 f2)) に至る過程 この 部分は (series 3 f2) = (cond =… [(= 3 1) (f2 1)] = (+ (f2 3) (series 2 f2)) [else (+ (f2 3) (series (- 3 1) f2))]) =… = (cond = (+ (f2 3) (+ (f2 2) (series 1 f2))) [false (f2 1)] これは, [else (+ (f2 3) = … (define (series n f) (cond (series (- 3 1) f2))]) = (+ (f2 3)[(=(+n 1) (f2(f 2) 1)] (+ (f2 1)))) = (+ (f2 3) (series (- 3 1) f2)) [else (+ (f n) = (+ (f2 3) (series 2 f2)) =… (series (- n 1) f))])) (series 3 f2) の n を 3 で,f を f2 で置き換えたもの = 14 37
例題4.数列の和のリスト • 例題3の「series」を使って,数列の和のリストを作る高階関数 seriesiter を作る • 数値 n と関数 f から, (f 1), (f 2), …. (f n) の和 ・・・ n 項までの和 (f 1), (f 2), …. (f (- n 1)) の和 ・・・ n-1 項までの和 ... (f 1) の値 ・・・ 1項までの和 のリストを作る • series-iter を使って,次の数列の和が Π2/6 に近づく様子を観察 する 1 1 1 = 1+ 2 + 2 + = 2 2 3 6 n =1 n 2 数列の和 38
「例題4.数列の和のリスト」の手順 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; series: number (number -> number) -> number ;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) (define (series n f) (cond [(= n 1) (f 1)] [else (+ (f n) (series (- n 1) f))])) ;; series-iter : number (number -> number) -> list (define (series-iter n f) (cond [(= n 0) empty] [else (cons (series n f) (series-iter (- n 1) f))])) (define (f4 k) (/ 1 (* k k))) 2. その後,次を「実行用ウインドウ」で実行しなさい (series-iter #i100 f4) ☆ 次は,例題5に進んでください 39
まず,関数 series と series-iter を定義している 40
次に関数 f4 を定義している (define (f4 k) (/ 1 (* k k))) 41
これは, (series-iter #i100 f4) と書いて,n の値を #i100, f の値を f4 に設定して の実行 実行結果が 表示される 42
入力と出力 •(f4 3), (f4 2), (f4 1) の和 •(f4 2), (f4 1) の和 •(f4 1) の値 からなるリスト 3 f4 series-iter 入力 入力は1つの数値と 関数 出力 出力は数値のリスト series-iter は,関数を入力とするような関数 (つまり高階関数) 43
;; series: number (number -> number) -> number ;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1)))) (define (series n f) (cond [(= n 1) (f 1)] [else (+ (f n) (series (- n 1) f))])) ;; series-iter : number (number -> number) -> list (define (series-iter n f) (cond [(= n 0) empty] [else (cons (series n f) (series-iter (- n 1) f))])) 44
数列の和のリスト 1. n = 0 ならば: empty → 終了条件 → 自明な解 2. そうで無ければ: – 長さが n-1 の「数列の和のリスト」を 作り,その先頭に「第 n 項」をつなげ る – この第 n 項は, (series n f) で得られる 45
例題5.べき級数 • べき級数を求める高階関数 taylor-series を作る • 数値 x, n と関数 g から,(g 0), (* (g 1) (expt x 1)), ..., (* (g n) (expt x n)) の 和を求める つまり n g (k ) x k k =0 • taylor-series を使って,簡単なべき級数 1 + x + 2x2 + … + nxn を求めてみる 46
「例題5.べき級数」の手順 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; taylor-series: number number (number -> number) ;; -> number ;; (taylor-series 2 3 g) = ;; (+ (* (g 3) (expt 2 3) ;; (+ (* (g 2) (expt 2 2)) ;; (+ (* (g 1) (expt 2 1)) ;; (g 0)))) (define (taylor-series x n g) (cond [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (g1 k) k) 2. その後,次を「実行用ウインドウ」で実行しなさい (taylor-series 2 3 g1) (taylor-series 2 4 g1) ☆ 次は,例題6に進んでください 47
級数 • 級数とは: 数列の和 • べき級数とは: した級数 n g (k ) x k の形を k =0 48
べき級数 • n = 0 のとき n g (k ) x k = g ( 0) k =0 • n > 0 のとき n −1 n g (k ) x k =0 k = g ( n) x + g ( k ) x n k k =0 49
まず,関数 taylor-series を定義している 50
次に関数 g1 を定義している (define (g1 k) k) 51
これは, (taylor-series 2 3 g1) と書いて,x の値を 2 に, n の値を 3 に,g の値を g1 に 設定しての実行 実行結果である「34」が 表示される 52
入力と出力 (g1 0), (* (g1 1) (expt 2 1)), (* (g1 2) (expt 2 2)), (* (g1 3) (expt 2 3)) の値の合計 2 3 g1 taylor-series 入力 入力は2つの数値と 関数 出力 出力は数値 taylor-series は,関数を入力とするような関数 = 高階関数 53
taylor-series 関数 ;; taylor-series: number number (number -> number) ;; -> number ;; (taylor-series 2 3 g) = ;; (+ (* (g 3) (expt 2 3) ;; (+ (* (g 2) (expt 2 2)) ;; (+ (* (g 1) (expt 2 1)) ;; (g 0)))) (define (taylor-series x n g) (cond [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) 54
(taylor-series 2 3 g1) から 34 に至る過程の概略 (taylor-series 2 3 g1) 最初の式 =… = (+ (* (g1 3) (expt 2 3)) (taylor-series 2 2 g1)) =… = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (taylor-series 2 1 g1))) =… = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (+ (* (g1 1) (expt 2 1)) (taylorseries 2 0 g1)))) =… = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (+ (* (g1 1) (expt 2 1)) (g1 2 0)))) コンピュータ内部での計算 = ... = 34 実行結果 但し,g1 は (define (g1 k) k) 55
(taylor-series 2 3 g1) から 34 に至る過程の概略 (taylor-series 2 3 g1) =… = (+ (* (g1 3) (expt 2 3)) (taylor-series 2 2 g1)) =… (taylor-series 2 3 g) この = (+ (* (g1 3) (expt 2 3))部分は (+ (* (g1 = 2)(cond (expt 2 2)) (taylor-series 2 1 g1))) [(= 3 0) (g1 0)] =… [else (+ (* (g1 3) (expt 2 3)) 3 1) g1))]) = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (taylor-series (+ (* (g1 1) (expt2 2(-1)) (taylor= (cond series 2 0 g1)))) [false (g1 0)] =… [else (+ (* (g1 3) (expt 2 3)) = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (taylor-series (+ (* (g1 1) (expt2 2(-1)) (g1g1))]) 2 0)))) 3 1) = (+ (* (g1 3) (expt 2 3)) = ... (taylor-series 2 (- 3 1) g1)) = 34 = (+ (* (g1 3) (expt 2 3)) (taylor-series 2 2 g1)) 56
(taylor-series 2 3 g1) から 34 に至る過程の概略 (taylor-series 2 3 g1) =… = (+ (* (g1 3) (expt 2 3)) (taylor-series 2 2 g1)) =… (taylor-series 2 3 g) この = (+ (* (g1 3) (expt 2 3))部分は (+ (* (g1 = 2)(cond (expt 2 2)) (taylor-series 2 1 g1))) [(= 3 0) (g1 0)] =… [else (+ (* (g1 3) (expt 2 3)) 3 1) g1))]) = (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (taylor-series (+ (* (g1 1) (expt2 2(-1)) (taylor= (cond series 2 0 g1)))) これは, [false (g1 0)] =… (define (taylor-series x n g) [else (+ (* (g1 3) (expt 2 3)) = (+ (* (cond (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (taylor-series (+ (* (g1 1) (expt2 2(-1)) (g1g1))]) 2 0)))) 3 1) = (+ (* (g1 3) (expt 2 3)) [(= n 0) (g 0)] = ... (taylor-series 2 (- 3 1) g1)) [else (+ (* (g n) (expt x n)) = 34 (+n(*1)(g1 3) (expt 2 3)) (taylor-series =x (g))])) (taylor-series 2 2 g1)) の x を 2 で,n を 3 で,g を g1 で置き換えたもの 57
テーラー展開 テーラー展開の式 関数 f が,0 の近傍で定義されていて, 点 0 でn 階微分可能であるとき f ' (0) f ' ' (0) 2 f ( n−1) n−1 f n ( ) n f ( x) = f (0) + x+ x ++ x + x 1! 2! (n − 1)! n! = x,0 1 但し, 58
テーラー展開 i 2 3 x x x x ex = =1 + + + + 1! 2! 3! i =0 i! 収束半径:∞ 2i +1 3 5 7 x x x x x i sin x = (−1) = − + − + 収束半径:∞ (2i + 1)! 1! 3! 5! 7! i =0 2i 2 4 6 8 x x x x x i cos x = (−1) =1 − + − + − 収束半径:∞ (2i)! 2! 4! 6! 8! i =0 i +1 2 3 4 x x x x log e ( x + 1) = (−1)i =x − + − + 収束半径:1 i +1 2 3 4 i =0 2i +1 3 5 7 x x x x tan ( x) = (−1) =x − + − + 収束半径:1 2i + 1 3 5 7 59 i =0 −1 i
例題6.指数関数のテーラー展開 • 例題5の「taylor-series」を使って,指数関数のテー ラー展開の値を求める i 2 3 x x x x e = =1 + + + + 1! 2! 3! i =0 i! x 60
「例題6.指数関数のテーラー展開」の手順 (1/2) 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; taylor-series: number number (number -> number) ;; -> number ;; (taylor-series 2 3 g) = ;; (+ (* (g 3) (expt 2 3) ;; (+ (* (g 2) (expt 2 2)) ;; (+ (* (g 1) (expt 2 1)) ;; (g 0)))) (define (taylor-series x n g) (cond [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (factorial k) (cond [(= k 0) 1] [else (* k (factorial (- k 1)))])) (define (exp-term k) (/ 1 (factorial k))) (define (my-exp x) (taylor-series x 20 exp-term)) ☆ 例題5 と同じ 次ページに進んでください 61
「例題6.指数関数のテーラー展開」の手順 (2/2) 2. その後,次を「実行用ウインドウ」で実行しなさい (my-exp 0) (my-exp 1) (my-exp 2) (my-exp 3) (my-exp #i1) (my-exp #i2) (my-exp #i3) ☆ 次は,例題7に進んでください 62
63
(define (taylor-series x n g) (cond べき級数 [(= n 0) (g 0)] (例題5と同じ) [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (factorial k) (cond k の階乗 [(= k 0) 1] を求める [else (* k (factorial (- k 1)))])) (define (exp-term k) 係数 (/ 1 (factorial k))) (define (my-exp x) taylor-series を使って, (taylor-series x 20 exp-term)) ex (の近似値)を計算 64
指数関数のテーラー展開 i 2 3 x x x x e = =1 + + + + 1! 2! 3! i =0 i! x (define (exp-term k) (/ 1 (factorial k))) 65
my-exp での誤差 (define (my-exp x) (taylor-series x 20 g2)) i 2 3 20 21 x x x x x x ex = =1 + + + ++ + + 1! 2! 3! 20! 21! i =0 i! x20/20! の項まで計算 x21/21! 以降の 部分が誤差 66
例題7.cos 関数のテーラー展開 • 例題5の「taylor-series」を使って,cos 関数のテーラー 展開の値を求める 2i 2 4 6 8 x x x x x cos x = (−1) =1 − + − + − (2i)! 2! 4! 6! 8! i =0 i 67
「例題7.cos 関数のテーラー展開」の手順 (1/2) 1. 次を「定義用ウインドウ」で,実行しなさい ;; taylor-series: number number (number -> number) ;; -> number ;; (taylor-series 2 3 g) = ;; (+ (* (g 3) (expt 2 3) ;; (+ (* (g 2) (expt 2 2)) ;; (+ (* (g 1) (expt 2 1)) ;; (g 0)))) (define (taylor-series x n g) (cond [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (factorial k) (cond [(= k 0) 1] [else (* k (factorial (- k 1)))])) (define (cos-term k) (cond [(odd? k) 0] [else (cond [(= (remainder k 4) 0) (/ 1 (factorial k))] [else (/ -1 (factorial k))])])) (define (my-cos x) (taylor-series x 20 cos-term)) 例題6 と同じ 68
「例題7.指数関数のテーラー展開」の手順 (2/2) 2. その後,次を「実行用ウインドウ」で実行しなさい (my-cos #i0) (my-cos #i0.2) (my-cos #i0.4) (my-cos #i0.6) (my-cos #i0.8) ☆ 次は,例題8に進んでください 69
70
(define (taylor-series x n g) (cond べき級数 [(= n 0) (g 0)] (例題5と同じ) [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (factorial k) k の階乗 (cond を求める [(= k 0) 1] (例題6と同じ) [else (* k (factorial (- k 1)))])) (define (cos-term k) (cond [(odd? k) 0] [else 係数 (cond [(= (remainder k 4) 0) (/ 1 (factorial k))] [else (/ -1 (factorial k))])])) taylor-series を使って, (define (my-cos x) cos x (の近似値)を計算 (taylor-series x 20 cos-term)) 71
cos 関数のテーラー展開 2i 2 4 6 8 x x x x x i cos x = (−1) =1 − + − + − (2i)! 2! 4! 6! 8! i =0 4 6 8 x2 x x x = 1 + 0 x − + 0 x 3 + + 0 x 5 − + x 7 + − 2! 4! 6! 8! (define (cos-term k) (cond [(odd? k) 0] odd? は [else 奇数ならば true (cond [(= (remainder k 4) 0) (/ 1 (factorial k))] [else (/ -1 (factorial k))])])) 72
例題8.対数関数のテーラー展開 • 例題5の「taylor-series」を使って,対数関数の テーラー展開の値を求める i +1 2 3 4 x x x x log e ( x + 1) = (−1) =x − + − + i +1 2 3 4 i =0 i 73
「例題8.対数関数のテーラー展開」の手順 (1/2) 1. 次を「定義用ウインドウ」で,実行しなさい • 入力した後に,Execute ボタンを押す ;; taylor-series: number number (number -> number) ;; -> number ;; (taylor-series 2 3 g) = ;; (+ (* (g 3) (expt 2 3) ;; (+ (* (g 2) (expt 2 2)) ;; (+ (* (g 1) (expt 2 1)) ;; (g 0)))) (define (taylor-series x n g) (cond [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (log-term k) (cond [(= k 0) 0] [else (/ (expt -1 (- k 1)) k)])) (define (my-log x) (taylor-series (- x 1) 20 log-term)) ☆ 例題7 と同じ 次ページに進んでください 74
「例題8.対数関数のテーラー展開」の手順 (2/2) 2. その後,次を「実行用ウインドウ」で実行しなさい (my-log #i1) (my-log #i1.2) (my-log #i1.4) (my-log #i1.6) (my-log #i1.8) ☆ 次は,例題9に進んでください 75
76
(define (taylor-series x n g) (cond べき級数 (例題5と同じ [(= n 0) (g 0)] [else (+ (* (g n) (expt x n)) (taylor-series x (- n 1) g))])) (define (log-term k) (cond 係数 [(= k 0) 0] [else (/ (expt -1 (- k 1)) k)])) (define (my-log x) (taylor-series (- x 1) 20 log-term)) taylor-series を使っ て, log x (の近似値) を計算 77
対数関数のテーラー展開 i +1 2 3 4 x x x x i log e ( x + 1) = (−1) =x − + − + i +1 2 3 4 i =0 x 2 x3 x 4 = 0+ x− + − 2 3 4 (define (log-term k) (cond [(= k 0) 0] [else (/ (expt -1 (- k 1)) k)])) 78
9-3 課題 79
課題1 • 次の数値の意味は何か #i9.313e+020 • 12100 を求めたい.次の3つを実行して,実行 結果を比較せよ 1. (expt 12 100) 2. (expt #i12 100) 3. (expt 12 #i100) 80
課題2 • 関数 my-exp (授業の例題6)についての問題 • 次の5つの値を報告しなさい.但し x = 1 とする x 1+ の値 1! x x2 1+ + の値 1! 2! x x 2 x3 1+ + + の値 1! 2! 3! x x 2 x3 x 4 1+ + + + の値 1! 2! 3! 4! x x 2 x3 x 4 x5 1+ + + + + の値 1! 2! 3! 4! 5! 81
課題3.数列の和の列1 • 関数 series-iter (授業の例題4)についての問題 • series-iter を使って,次の数列の和のリストを求めなさい • 実行結果を報告しなさい • また、(series-iter #i10 f4) のように実行した場合と, (series-iter 10 f4) のように実行した場合の違いを報告しな さい (−1) 1 1 1 = 1− + − + = 3 5 7 4 n =1 2n − 1 n +1 82
課題4.数列の和の列2 • 関数 series-iter (授業の例題4)についての問題 • series-iter を使って,次の数列の和のリストを求めなさい • 実行結果を報告しなさい • また、(series-iter #i10 f4) のように実行した場合と, (series-iter 10 f4) のように実行した場合の違いを報告しな さい 1 1 1 = 1+ + + = e −1 2! 3! n =1 n! 83
課題5.sin 関数のテーラー展開 • 関数 taylor-series(授業の例題5)を使って,sin 関数のテーラー展開の値を求める関数 my-sin を 作成し,実行結果を報告しなさい • even? (偶数ならば true)を使うこと • 正しい値が得られているか確認すること 2i +1 3 5 7 x x x x x sin x = (−1) = − + − + (2i + 1)! 1! 3! 5! 7! i =0 i 84
課題6.tan-1 関数のテーラー展開 • 関数 taylor-series(授業の例題5)を使って, tan-1 関数のテーラー展開の値を求める関数 myatan を作成し,実行結果を報告しなさい • even? (偶数ならば true)を使うこと • 正しい値が得られているか確認すること 2i +1 3 5 7 x x x x tan ( x) = (−1) =x − + − + 2i + 1 3 5 7 i =0 −1 i 85