sp-9. 高階関数
1
金子邦彦
Scheme プログラミング)
URL:https://www.kkaneko.jp/pro/scheme/index.html
トライン
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
(expt 11 200)
11200 を,有理数で計算
結果は有理数で得られる
(expt #i11 200)
11200 を,十数桁の小数で計算(近似値
結果は小数で得られる
(expt #i11 200) = #i1.8990527646046183e+208
この「#i」は「結果が近似値」とい意味
#i の意味
6
1.8990527646046183e+208
= 1.8990527646046183 ×10208
[参考]
1.23e-005 = 1.23 ×10-5
= 0.0000123
10 208 乗の意味
e+208 の意味
7
#iを付けると近似計算
計算結果として,近似値を得たいとき,#i を付ける
例)(expt #i11 200)
sin, cos, log 等の値は,近似値でしか得られない
例:「(sin 0.1)」を実行すると
#i0.09983341664682816
近似値を使った計算を繰り返すと,誤差が積み重な
近似計算について
8
9-2 パソコン演習
9
資料を見ながら,「例題」を行ってみる
各自,「課題」に挑戦する
自分のペースで先に進んで構いません
パソコン演習の進め方
10
DrScheme の起動
プログラム PLT Scheme
DrScheme
今日の演習では「Advanced Student
に設定
Language
→ Choose Language
Advanced Student
→ OK
Execute ボタン」
DrScheme の使用
11
高階関数を実行するとき
DrScheme Language Advanced Student
選択すること
Intermediat
e
Student
Advanced
Student
高階関数の
実行
不可 可能
ステップ実
行の機能
あり なし
Advanced Student
12
数のリスト a-list ら総和を求める関数 list-
sum を作る
但し,次の高階関数 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)))]))
例題1.リストの総和
13
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. その後,次を「実行用インド」で実行しなさい
次は,例題2に進んでください
(list-sum (list 1 2 3))
(list-sum empty)
「例題1.リストの総和」の手順
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
reduce
(g 1 (g 2 (g 3 0)))
の値
(g が足し算 + のときは
1+2+3+0 = 6
入力 出力
(list 1 2 3)
0
g
入力はリスト,数値
と関数
出力は数値
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]
[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))
関数 op が,「reduce
の入力になっている
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))
= …
= (+1 (reduce + 0 (list 2 3)))
= …
= (+1 (+2 (reduce + 0 (list 3))))
= …
= (+1 (+2 (+3 (reduce + 0
empty))))
= ...
= (+1 (+2 (+3 0)))
= …
= 6
(reduce + 0 (list 1 2 3))
= (cond
[(empty? (list 1 2 3)) 0]
[else (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))])
= (cond
[false 0]
[else (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))])
= (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))
= (+ 1 (reduce + 0 (rest (list 1 2 3))))
= (+ 1 (reduce + 0 (list 1 2)))
この
部分は
21
(reduce + 0 (list 1 2 3) から
(+ 1 (reduce + 0 (list 2 3) に至る過程
(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
(reduce + 0 (list 1 2 3))
= (cond
[(empty? (list 1 2 3)) 0]
[else (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))])
= (cond
[false 0]
[else (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))])
= (+ (first (list 1 2 3))
(reduce + 0 (rest (list 1 2 3))))
= (+ 1 (reduce + 0 (rest (list 1 2 3))))
= (+ 1 (reduce + 0 (list 1 2)))
この
部分は
これは,
(define (reduce op base L)
(cond
[(empty? L) base]
[else (op (first L)
(reduce op base (rest L)))]))
op + で,base 0 で,L(list 1 2 3) で置き換えたも
22
#iを付けた近似計算を試してみるために,expt
を使って,11 200 乗を計算してみる
(expt 11 200)
(expt #i11 200)
#i は近似値とい意味.近似計算でよい
ことをコンピュータに教えている
例題2.x n 乗の近似値
23
1. 次を「実行用インド」で実行しなさい
次は,例題3に進んでください
(expt 11 200)
(expt #i11 200)
「例題2.x n 乗の近似値」の手順
24
結果は「近似値」
である
この「#iは,「近似計算でよい」
ことをコンピュータに教えている
25
数列の和を求める高階関数 series
作る
数値 nと関数 fから,(f1), (f2), …. (f
n) の和を求める (f i) は数列の第 i
series を使って,簡単な数列の和を
求めてみる
2乗の和 12+ 22+ … + n2
3乗の和 13+ 23+ … + n3
n
k
kf
1
)(
つまり
数列の和
26
数列の和
n = 1 のとき
)1()(
1
fkf
n
k
n > 1 のとき
1
11
)()()( n
k
n
k
kfnfkf
27
28
数列の和
数列 k2
0
20
40
60
80
100
k2
k
12345678910
2
k
総和が
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
;; series: number (number -> number) -> number
;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1))))
(define (series n f)
(cond
[(= n1) (f1)]
[else (+ (f n)
(series (- n1) f))]))
(define (f2 k)
(* k k))
(define (f3 k)
(* k k k))
2. その後,次を「実行用インド」で実行しなさい
次は,例題4に進んでください
(series 3 f2)
(series 4 f3)
「例題3.数列の和」の手順
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
series
(f2 3), (f2 2), (f2 1) の和
入力 出力
3
f2
入力は1つの数値と
関数
出力は数値
series は,関数を入力とするな関数
(つまり高階関数)
入力と出力
33
;; series: number (number -> number) -> number
;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1))))
(define (series n f)
(cond
[(= n1) (f1)]
[else (+ (f n)
(series (- n1) f))]))
関数 f が,
series」の入力になっている
34
(series 3 f2) から 14 に至る過程の概略
(series 3f2)
= …
= (+ (f2 3) (series 2 f2))
= …
= (+ (f2 3) (+ (f2 2) (series 1 f2)))
= …
= (+ (f2 3) (+ (f2 2) (+ (f2 1))))
= …
= 14
最初の式
実行結果
コンピュータ内部での計算
但し,f2
(define (f2 k)
(* k k))
35
(series 3 f2) から
(+ (f2 3) (series 2 f2)) に至る過程
(series 3f2)
= …
= (+ (f2 3) (series 2 f2))
= …
= (+ (f2 3) (+ (f2 2) (series 1 f2)))
= …
= (+ (f2 3) (+ (f2 2) (+ (f2 1))))
= …
= 14
(series 3f2)
= (cond
[(= 3 1) (f2 1)]
[else (+ (f2 3)
(series (- 3 1) f2))])
= (cond
[false (f2 1)]
[else (+ (f2 3)
(series (- 3 1) f2))])
= (+ (f2 3) (series (- 3 1) f2))
= (+ (f2 3) (series 2 f2))
この
部分は
36
(series 3 f2) から
(+ (f2 3) (series 2 f2)) に至る過程
(series 3f2)
= …
= (+ (f2 3) (series 2 f2))
= …
= (+ (f2 3) (+ (f2 2) (series 1 f2)))
=
= (+ (f2 3) (+ (f2 2) (+ (f2 1))))
=
= 14
(series 3f2)
= (cond
[(= 3 1) (f2 1)]
[else (+ (f2 3)
(series (- 3 1) f2))])
= (cond
[false (f2 1)]
[else (+ (f2 3)
(series (- 3 1) f2))])
= (+ (f2 3) (series (- 3 1) f2))
= (+ (f2 3) (series 2 f2))
この
部分は
これは,
(define (series n f)
(cond
[(= n1) (f1)]
[else (+ (f n)
(series (- n1) f))]))
n3 で,ff2 で置き換えたもの
37
例題3の「series」を使って,数列の和のリストを作る高階関 series-
iter を作る
数値 nと関数 fから,
(f1), (f2), …. (fn) の和 ・・・ n 項までの和
(f1), (f2), …. (f(- n 1)) の和 ・・・ n-1 項までの和
...
(f1) の値 ・・・ 1項までの和
のリストを作る
series-iter を使って,次の数列の和 Π2/6 に近づく様子を観察
する
63
1
2
1
1
12
22
12
nn
数列の和
例題4.数列の和のリスト
38
1. 次を「定義用インド」で,実行しなさい
入力した後に,Execute ボタンを押す
;; series: number (number -> number) -> number
;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1))))
(define (series n f)
(cond
[(= n1) (f1)]
[else (+ (f n)
(series (- n1) f))]))
;; series-iter : number (number -> number) -> list
(define (series-iter n f)
(cond
[(= n0) empty]
[else (cons (series n f) (series-iter (- n1) f))]))
(define (f4 k)
(/ 1 (* k k)))
2. その後,次を「実行用インド」で実行しなさい
次は,例題5に進んでください
(series-iter #i100 f4)
「例題4.数列の和のリスト」の手順
39
まず,関数 series
series-iter 定義している
40
次に関数 f4 定義している
(define (f4 k)
(/ 1 (* k k)))
41
これは,
(series-iter #i100 f4)
と書いて,nの値を #i100,
fの値を f4 に設定して
の実行
実行結果が
表示される
42
series-iter
(f4 3), (f4 2), (f4 1) の和
(f4 2), (f4 1) の和
(f4 1) の値
からなるリスト
入力 出力
3
f4
入力は1つの数値と
関数
出力は数値のリスト
series-iter は,関数を入力とするよな関数
(つまり高階関数)
入力と出力
43
;; series: number (number -> number) -> number
;; (series f2 3) = (+ (f2 3) (+ (f2 2) (+ (f2 1))))
(define (series n f)
(cond
[(= n1) (f1)]
[else (+ (f n)
(series (- n1) f))]))
;; series-iter : number (number -> number) -> list
(define (series-iter n f)
(cond
[(= n0) empty]
[else (cons (series n f) (series-iter (- n1) f))]))
44
1. n = 0 ならば終了条件
empty 自明な解
2. で無ければ
長さが n-1 の「数列の和のリスト」を
作り,その先頭に「第 n 項」をつなげ
この第 n 項は, (series n f)で得られる
数列の和のリスト
45
べき級数を求める高階関数 taylor-series
を作る
数値 x, nと関数 gから,(g0),
(* (g1) (expt x1)), ..., (* (gn) (expt xn))
和を求める
taylor-series を使って,簡単なべき級数
1 + x + 2x2+ … + nxn 求めてみる
k
n
k
xkg
0
)(
つまり
例題5.べき級数
46
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
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (g1 k)
k)
2. その後,次を「実行用インド」で実行しなさい
次は,例題6に進んでください
(taylor-series 2 3 g1)
(taylor-series 2 4 g1)
「例題5.べき級数」の手順
47
級数
級数とは: 数列の和
べき級数とは: の形を
した級数
k
n
k
xkg
0
)(
48
べき級数
n = 0 のとき
n > 0 のとき
1
00
)()()( n
k
knk
n
k
xkgxngxkg
49
まず,関数 taylor-series
を定義してい
50
次に関数 g1 定義している
(define (g1 k)
k)
51
これは,
(taylor-series 2 3 g1)
と書いて,xの値を 2 に,
nの値を 3 に,gの値を g1
設定しての実
実行結果である「34」が
表示される
52
taylor-series
(g1 0),
(* (g1 1) (expt 2 1)),
(* (g1 2) (expt 2 2)),
(* (g1 3) (expt 2 3))
の値の合計
入力 出力
2
3
g1
入力は2つの数値と
関数
出力は数値
taylor-series は,関数を入力とするよな関数
= 高階関数
入力と出力
53
;; 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
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
taylor-series 関数
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)) (taylor-
series 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))
= …
= (+ (* (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)) (taylor-
series 2 0 g1))))
= …
= (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (+ (* (g1 1) (expt 2 1)) (g1 2 0))))
= ...
= 34
(taylor-series 2 3 g)
= (cond
[(= 3 0) (g1 0)]
[else (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))])
= (cond
[false (g1 0)]
[else (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))])
= (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))
= (+ (* (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))
= …
= (+ (* (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)) (taylor-
series 2 0 g1))))
=
= (+ (* (g1 3) (expt 2 3)) (+ (* (g1 2) (expt 2 2)) (+ (* (g1 1) (expt 2 1)) (g1 2 0))))
= ...
= 34
(taylor-series 2 3 g)
= (cond
[(= 3 0) (g1 0)]
[else (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))])
= (cond
[false (g1 0)]
[else (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))])
= (+ (* (g1 3) (expt 2 3))
(taylor-series 2 (- 3 1) g1))
= (+ (* (g1 3) (expt 2 3))
(taylor-series 2 2 g1))
この
部分は
これは,
(define (taylor-series x n g)
(cond
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
x2 で,n3 で,gg1 で置き換えたもの 57
テーラー展開の式
n
n
n
nx
n
f
x
n
f
x
f
x
f
fxf !
)(
)!1(!2
)0(''
!1
)0('
)0()( 1
)1(
2
関数 f が,0 の近傍で定義されていて,
0 n 階微分可能であるとき
但し,
10,
x
テーラー展開
58
!3!2!1
1
!
32
0
xxx
i
x
e
i
i
x
!7!5!3!1)!12(
)1(sin 753
0
12 xxxx
i
x
x
i
i
i
収束半径:
!8!6!4!2
1
)!2(
)1(cos 8642
0
2xxxx
i
x
x
i
i
i
収束半径:
収束半径:1
4321
)1()1(log 432
0
1xxx
x
i
x
x
i
i
i
e
収束半径:
75312
)1()(tan 753
0
12
1xxx
x
i
x
x
i
i
i
収束半径:1
テーラー展開
59
例題5の「taylor-series」を使って,指数関数のテー
ラー展開の値を求める
!3!2!1
1
!
32
0
xxx
i
x
e
i
i
x
例題6.指数関数のテーラー展開
60
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
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (factorial k)
(cond
[(= k0) 1]
[else (* k(factorial (- k1)))]))
(define (exp-term k)
(/ 1 (factorial k)))
(define (my-exp x)
(taylor-series x20 exp-term))
次ページに進んでください
例題5
と同じ
「例題6.指数関数のテーラー展開」の手順 (1/2)
61
2. その後,次を「実行用インド」で実行しなさい
次は,例題7に進んでください
(my-exp 0)
(my-exp 1)
(my-exp 2)
(my-exp 3)
(my-exp #i1)
(my-exp #i2)
(my-exp #i3)
「例題6.指数関数のテーラー展開」の手順 (2/2)
62
63
(define (taylor-series x n g)
(cond
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (factorial k)
(cond
[(= k0) 1]
[else (* k(factorial (- k1)))]))
(define (exp-term k)
(/ 1 (factorial k)))
(define (my-exp x)
(taylor-series x20 exp-term))
k の階乗
を求める
taylor-series を使って,
ex(の近似値)を計算
べき級数
(例題5と同じ)
係数
64
!3!2!1
1
!
32
0
xxx
i
x
e
i
i
x
(define (exp-term k)
(/ 1 (factorial k)))
指数関数のテーラー展開
65
(define (my-exp x)
(taylor-series x20 g2))
!21!20!3!2!1
1
!
212032
0
xxxxx
i
x
e
i
i
x
x20/20! の項まで計算 x21/21! 以降の
部分が誤差
my-exp での誤差
66
例題5の「taylor-series」を使って,cos 関数のテーラー
展開の値を求める
!8!6!4!2
1
)!2(
)1(cos 8642
0
2xxxx
i
x
x
i
i
i
例題7.cos 関数のテーラー展開
67
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
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (factorial k)
(cond
[(= k0) 1]
[else (* k(factorial (- k1)))]))
(define (cos-term k)
(cond
[(odd? k) 0]
[else
(cond
[(= (remainder k4) 0) (/ 1 (factorial k))]
[else (/ -1 (factorial k))])]))
(define (my-cos x)
(taylor-series x20 cos-term))
例題6
と同じ
「例題7.cos 関数のテーラー展開」の手順 (1/2)
68
2. その後,次を「実行用インド」で実行しなさい
次は,例題8に進んでください
(my-cos #i0)
(my-cos #i0.2)
(my-cos #i0.4)
(my-cos #i0.6)
(my-cos #i0.8)
「例題7.指数関数のテーラー展開」の手順 (2/2)
69
70
(define (taylor-series x n g)
(cond
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (factorial k)
(cond
[(= k0) 1]
[else (* k(factorial (- k1)))]))
(define (cos-term k)
(cond
[(odd? k) 0]
[else
(cond
[(= (remainder k4) 0) (/ 1 (factorial k))]
[else (/ -1 (factorial k))])]))
(define (my-cos x)
(taylor-series x20 cos-term))
k の階乗
を求める
(例題6と同じ)
taylor-series を使って,
cos x (の近似値)を計算
べき級数
(例題5と同じ)
係数
71
!8!6!4!2
1
)!2(
)1(cos 8642
0
2xxxx
i
x
x
i
i
i
!8!6
0
!4
0
!2
01 8
7
6
5
4
3
2x
x
x
x
x
x
x
x
(define (cos-term k)
(cond
[(odd? k) 0]
[else
(cond
[(= (remainder k4) 0) (/ 1 (factorial k))]
[else (/ -1 (factorial k))])]))
odd?
奇数ならば true
cos 関数のテーラー展開
72
例題5の「taylor-series」を使って,対数関数の
テーラー展開の値を求める
4321
)1()1(log 432
0
1xxx
x
i
x
x
i
i
i
e
例題8.対数関数のテーラー展開
73
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
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (log-term k)
(cond
[(= k0) 0]
[else (/ (expt -1 (- k 1)) k)]))
(define (my-log x)
(taylor-series (- x1) 20 log-term))
次ページに進んでください
例題7
と同じ
「例題8.対数関数のテーラー展開」の手順 (1/2)
74
2. その後,次を「実行用インド」で実行しなさい
次は,例題9に進んでください
(my-log #i1)
(my-log #i1.2)
(my-log #i1.4)
(my-log #i1.6)
(my-log #i1.8)
「例題8.対数関数のテーラー展開」の手順 (2/2)
75
76
(define (taylor-series x n g)
(cond
[(= n0) (g0)]
[else (+ (* (g n) (expt x n))
(taylor-series x(- n1) g))]))
(define (log-term k)
(cond
[(= k0) 0]
[else (/ (expt -1 (- k 1)) k)]))
(define (my-log x)
(taylor-series (- x1) 20 log-term))
taylor-series を使っ
て,
log x (の近似値)
を計算
べき級数
(例題5と同じ
係数
77
432
0432 xxx
x
(define (log-term k)
(cond
[(= k0) 0]
[else (/ (expt -1 (- k 1)) k)]))
4321
)1()1(log 432
0
1xxx
x
i
x
x
i
i
i
e
対数関数のテーラー展開
78
9-3 課題
79
次の数値の意味は何
#i9.313e+020
12100 を求めたい.次の3つを実行して,実行
結果を比較せよ
1. (expt 12 100)
2. (expt #i12 100)
3. (expt 12 #i100)
課題1
80
関数 my-exp 授業の例題6)についての問題
次の5つの値を報告しなさい.但し x = 1 とする
 の値
!1
1x
 の値
!3!2!1
132 xxx
 の値
!4!3!2!1
1432 xxxx
 の値
!5!4!3!2!1
15432 xxxxx
 の値
!2!1
12
xx
課題2
81
関数 series-iter (授業の例題4)についての問題
series-iter を使って,次の数列の和のリストを求めなさい
実行結果を報告しなさい
また、(series-iter #i10 f4) のよに実行した場合と,
(series-iter 10 f4) のよに実行した場合の違いを報告しな
さい
47
1
5
1
3
1
1
12
)1(
1
1
n
n
n
課題3.数列の和の列1
82
関数 series-iter (授業の例題4)についての問題
series-iter を使って,次の数列の和のリストを求めなさい
実行結果を報告しなさい
また、(series-iter #i10 f4) のよに実行した場合と,
(series-iter 10 f4) のよに実行した場合の違いを報告しな
さい
1
!3
1
!2
1
1
!
1
1
e
n
n
課題4.数列の和の列2
83
関数 taylor-series(授業の例題5)を使って,sin
関数のテーラー展開の値を求める関数 my-sin
作成し,実行結果を報告しなさい
even? (偶数ならば true)を使こと
正しい値が得られているか確認すること
!7!5!3!1)!12(
)1(sin 753
0
12 xxxx
i
x
x
i
i
i
課題5.sin 関数のテーラー展開
84
関数 taylor-series(授業の例題5)を使って
tan-1 関数のテーラー展開の値を求める関数 my-
atan を作成し,実行結果を報告しなさ
even? (偶数ならば true)を使こと
正しい値が得られているか確認すること
75312
)1()(tan 753
0
12
1xxx
x
i
x
x
i
i
i
課題6.tan-1 関数のテーラー展開
85