第9回
高階関数を用いた抽象化

例題

情報処理演習II

例題１．接線の傾き

入力と出力

 接線の傾きを求める関数 d/dx を定義し，実行する– 数値 x, h と関数 f から，x における f の傾き (つまり f '(x) ) の近似値を求める

f2
30.0001f2'(3) の近似値

d/dx
接線

f(x)

傾きは

f ( x + h)f ( x − h)0f ( x + h) − f ( x − h)2⋅hd/dx 関数の Contract(規約)d/dx: (number->number) number number -> number

数値

数値

数値

出力
入力

出力は数値

d/dx 関数

Contract (規約)

関数
入力：数値
出力：数値

入力は２つの数値と関数

d/dx は，関数を入力とするような関数（つまり高階関数）xx−h x+h

出力

入力;; d/dx: (number->number) number number -> number;; inclination of the tangent;; Example: (d/dx f 3 0.0001);;= ((- (f 3.0001) (f 2.9999)) 0.0002)(define (d/dx f x h)(/ (- (f (+ x h)) (f (- x h)))(* 2 h)))関数が，「d/dx」の入力になっている

1

d/dx 関数の定義と実行例(1/4)

d/dx 関数の定義と実行例(2/4)

まず，関数 d/dx を定義している
次に関数 f2 を定義している(define (f2 x)(- (* x x) 2))

d/dx 関数の定義と実行例(3/4)

d/dx 関数の定義と実行例(4/4)

これは，(d/dx f2 3 0.0001)と書いて，x の値を 3 に，
h の値を 0.0001 に，f を f2 に設定して実行

実行用ウィンドウで関数を定義しても構わない．
ここでは，関数 f3 を定義している

実行用ウィンドウで定義した関数 f3 を使って接線の傾きを計算している

実行結果である「6」が表示される(d/dx f2 3 0.0001) から 6 が得られる過程の概略(d/dx f2 3 0.0001) から 6 が得られる過程の概略(d/dx f2 3 0.0001) 最初の式

(d/dx f2 3 0.0001)= (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001)))= (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001)))(* 2 0.0001))(* 2 0.0001))

= ...

= ...

= (/ (- (- (* 3.0001 3.0001) 2)(f2 (- 3 0.0001))) (* 2 0.0001))
= ...
= 6

コンピュータ内部での計算

実行結果
但し，f2 は(define (f2 x)(- (* x x) 2))= (/ (- (- (* 3.0001 3.0001) 2)

これは，(f2 (3 0.0001)))(define(d/dx
f x h) (* 2 0.0001))= ... (/ (- (f (+ x h)) (f (- x h)))(* 2 h)))= 6の x を 3 で，h を 0.0001 で, f を f2 で置き換えたもの

2例題２．べき級数(d/dx f2 3 0.0001) から 6 が得られる過程の概略

 べき級数を求める高階関数 power_series を定義(d/dx f2 3 0.0001)= (/ (- (f2 (+ 3 0.0001)) (f2 (- 3 0.0001)))(* 2 0.0001))= ...
= (/ (- (- (* 3.0001 3.0001) 2)(f2 (- 3 0.0001))) (* 2 0.0001))

する– 自然数 n，数 x，関数 g から(* (g 0)(expt x 0)) +(* (g 1)(expt x 1)) +… +(* (g n)(expt x n))を求める• n = 0 の時n

∑ g(k ) ⋅ x = g(0) ⋅ x = g(0)
k

= ...

これは，
= 6
(define (f2 x)(- (* x x) 2))の x を (+ 3 0.0001)=3.0001 で置き換えたもの級数とべき級数0k =0• n > 0 の時
n −1n

∑ g (k ) ⋅ x = g (n) ⋅ x + ∑ g ( k ) ⋅ x
k

k =0

n

k

k =0

Contract (規約)

• 級数 （series 関数で実現可）
nn −1

power_series 関数の Contract(規約)

k =0

k =0

;;power_series: number N (N->number) -> number∑ f ( k ) = f ( n) + ∑ f ( k )• べき級数n −1

n∑ g (k ) ⋅ x = g (n) ⋅ x + ∑ g (k ) ⋅ x
k

n

k =0

k

k =0

数値 自然数 関数
入力：自然数
出力：数値

f (k )• べき級数の各項を f (k) と考えると級数と同じ手順で計算できることが分かる• この f (k) には，関数 g と値 x を与えないと計算で
きない

入力と出力

数値

出力

入力

べき級数 power_series 関数(g1 0),(* (g1 1) (expt 2 1)),(* (g1 2) (expt 2 2)),(* (g1 3) (expt 2 3))の値の合計;; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)))

入力

出力;; power_series: number N (N -> number) -> number

入力は２つの数値と
関数

出力は数値

2
3
g1
power_series(define (series n f)
(cond[(= n 0) (f 0)][else (+ (f n)(series (- n 1) f))]))(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )power_series は，関数を入力とするような関数= 高階関数3

定義の局所化 (local式)

べき級数 power_series 関数;; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)));; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)))

(define (series n f)
series 関数：(cond[(= n 0) (f 0)]
級数 Σf(k) を求める
[else (+ (f n)(series (- n 1) f))]))(define (series n f)
(cond[(= n 0) (f 0)][else (+ (f n)(series (- n 1) f))]));; power_series: number N (N -> number) -> number;; power_series: number N (N -> number) -> number(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )関数 power_term は，関数 power_series 内の局所（local）関数として定義されているべき級数関数の実行まで(1/3)

関数 series，関数 power_seriesを定義しているべき級数関数の実行まで(3/3)

べき級数関数の実行まで(2/3)

関数 g1 を定義している(define (g1 n) n)べき級数 power_series の計算例(概略)
power_series を使い簡単なべき級数 x + 2x2 +…+ nxn を計算

これは，(power_series 2 3 g1)と書いて，x の値を 2 に，n の値を 3 に，g の値を g1 に設定して実行

実行結果である「34」が表示される(power_series 2 3 g1) 最初の式 但し x=2, (define (g1 n) n)= (local ((define (power_term i) (* (g1 i) (expt 2 i))))(series 3 power_term))= (local ((define (power_term i) (* (g1 i) (expt 2 i))))(+ (power_term 3) (series 2 power_term))))= ...
= (local ((define (power_term i) (* (g1 i) (expt 2 i))))(+ (power_term 3)(+ (power_term 2)(+ (power_term 1) (power_term 0)))))= ...
= (+ (* (g1 3)(expt 2 3))(+ (* (g1 2)(expt 2 2))(+ (* (g1 1)(expt 2 1)) (* (g1 0)(expt 2 0)))))= ...
= (+ 24 (+ 8 (+ 2 0)))= ...
= 34 実行結果

4power_series関数のステップ実行「(power_series 2 3 g1)」 は関数の中身で置き換わる

power_series関数のステップ実行「(series 3 power_term_0)」 は関数の中身で置き換わる

power_series関数のステップ実行「(false (power_term_0 0))」 は消える

power_series関数のステップ実行「power_term」は局所関数「power_term_0」で置き換わる．（_0 は局所関数を示す番号）

power_series関数のステップ実行「(= 3 0)」 は「false」で置き換わる

power_series関数のステップ実行「(cond (else ...))」 は「...」の部分で置き換わる

5

power_series関数のステップ実行「(power_term_0 3)」 は関数の中身で置き換わる

power_series関数のステップ実行「(expt 2 3)」 は「8」で置き換わる

power_series関数のステップ実行

power_series関数のステップ実行「(g1 3)」 は「3」で置き換わる

power_series関数のステップ実行「(* 3 8)」 は「24」で置き換わる

power_series関数のステップ実行「(series 2 power_term_0)」 は関数の中身で置き換わる「(- 3 1)」 は「2」で置き換わる

6

power_series関数のステップ実行

power_series関数のステップ実行「(= 2 0)」 は「false」で置き換わる「(false (power_term_0 0))」 は
以後省略
消える

実習の進め方 資料を見ながら，「実習」を行ってみる

実習 その後，各自「課題」に挑戦する– 各自で自習 ＋ 巡回指導
– 遠慮なく質問してください 自分のペースで先に進んで構いません

DrScheme の使用
 DrScheme の起動

プログラム → PLT Scheme → DrScheme 今日の実習では「Intermediate Student」に設定
Language→ Choose Language

DrScheme の使用 / ステップ実行
 プログラム実行の振る舞いを観察するツール 「定義用ウインドウ」のみを使用（通常の実行と異なる）
 「Intermediate Student」に設定する必要あり
Language → Choose Language→ Intermediate Student→ Intermediate Student→ OK ボタン→ Run ボタン7

実習１．階乗

階乗

 階乗を計算する関数 ! を定義し，実行する• n = 0 のとき– 次の方針でプログラムを作成する
n > 0 のとき，n! = n × (n - 1)!

n! = 1• n > 0 のとき例） 6! = 6×5!

n ! = n × ( n − 1 )!

「実習１．階乗」の手順「実習１．階乗」の実行結果

1. 次を「定義用ウインドウ」で，実行しなさい• 入力した後に，Run ボタンを押す;;! : number -> number;;to compute n*(n-1)*...*2*1(define (! n)(cond[(= n 0) 1][else (* n (! (- n 1)))]))
2. その後，次を「実行用ウインドウ」で実行しなさい
(! 3)
(! 4)

入力と出力

! 関数

!

;; ! : number -> number;; to compute n*(n-1)*...*2*1;; Example: (! 4) = 24
(define (! n)
0! = 1 である(cond[(= n 0) 1][else (* n (! (- n 1)))]))

24

4
入力

入力は数値

出力

出力は数値

n! は (n-1)! を計算して，n を掛ける

8

階乗

階乗

1. n = 0 ならば：

→ 終了条件1→ 自明な解2. そうで無ければ：– 「(n – 1) の階乗」に n をかける
⇒ 結局，1 から n までのかけ算を繰り返す;; ! : number -> number;; to compute n*(n-1)*...*2*1;; Example: (! 4) = 24
(define (! n)
(cond
自明な解
[(= n 0) 1][else (* n (! (- n 1)))]))
終了条件

終了条件

実習２．ステップ実行
 関数 ! （実習１）について，実行結果に至る過程を見る– (! 3) から 6 に至る過程を見る

No– DrScheme のステップ実行機能を使用する(= n 0)Yes(* n (! (- n 1)))

1 が自明の解「実習２．ステップ実行」の手順
1. 次を「定義用ウインドウ」で，実行しなさい• Intermediate Student で実行すること• 入力した後に Run ボタンを押す(define (! n)(cond[(= n 0) 1][else (* n(! (- n 1)))]))

(! 3)
= ...
= (* 3 (! 2))= ...
= (* 3 (* 2 (! 1)))= ...
= (* 3 (* 2 (* 1 (! 0))))= ...
= (* 3 (* 2 (* 1 1)))= (* 3 (* 2 1))= (* 3 2)= 6

実習２のステップ実行例

実習１と同じ;;! : number -> number;;to compute n*(n-1)*...*2*1(define (! n)(cond[(= n 0) 1][else (* n (! (- n 1)))]))(! 3)
2. DrScheme を使って，ステップ実行の様子を確認しなさい （Step ボタン，Next ボタンを使用）! の「n」は「3」で置き換わる• 理解しながら進むこと9実習２のステップ実行例「(= 3 0)」は「false」で置き換わる

実習２のステップ実行例

実習２のステップ実行例「(cond [false 式Ｘ] [else 式Ｙ])」は「式Ｙ」で置き換わる

実習２のステップ実行例「(- 3 1)」は「2」で置き換わる! の「n」は「2」で置き換わる

実習２のステップ実行例「(= 2 0)」は「false」で置き換わる

実習２のステップ実行例「(cond [false 式Ｘ] [else 式Ｙ])」は「式Ｙ」で置き換わる

10

実習２のステップ実行例

実習２のステップ実行例「(- 2 1)」は「1」で置き換わる! の「n」は「1」で置き換わる

実習２のステップ実行例「(= 1 0)」は「false」で置き換わる

実習２のステップ実行例

実習２のステップ実行例「(cond [false 式Ｘ] [else 式Ｙ])」は「式Ｙ」で置き換わる

実習２のステップ実行例! の「n」は「1」で置き換わる「(- 1 1)」は「0」で
置き換わる

11

実習２のステップ実行例「(= 0 0)」は「true」で置き換わる

実習２のステップ実行例「(cond [true 式Ｘ] [else 式Ｙ])」は「式Ｘ」で置き換わる

実習２のステップ実行例

実習２のステップ実行例「(* 1 1)」は「1」で置き換わる「(* 2 1)」は「2」で置き換わる

実習２のステップ実行例(! 3) から 6 が得られる過程の概略「(* 3 2)」は「6」で置き換わる(! 3) 最初の式
= ...
= (* 3 (! 2))= ...
= (* 3 (* 2 (! 1)))= ...
= (* 3 (* 2 (* 1 (! 0))))= ...
= (* 3 (* 2 (* 1 1)))= (* 3 (* 2 1))= (* 3 2)
コンピュータ内部での計算= 6 実行結果12

(! 3) から 6 が得られる過程の概略
(! 3)
(! 3)
= (condこの部= ...
[(= 3 0) 1]
分は[else (* 3 (! (- 3 1)))])= (* 3 (! 2))= (cond= ...
[false 1][else (* 3 (! (- 3 1)))])= (* 3 (* 2 (! 1)))= (* 3 (! (- 3 1)))= ...
= (* 3 (! 2))= (* 3 (* 2 (* 1 (! 0))))= ...
= (* 3 (* 2 (* 1 1)))= (* 3 (* 2 1))= (* 3 2)= 6(! 3) から 6 が得られる過程の概略
(! 3)
(! 3)
= (condこの部= ...
[(= 3 0) 1]
分は[else (* 3 (! (- 3 1)))])= (* 3 (! 2))= (cond= ...
[false 1][else (* 3 (! (- 3 1)))])= (* 3 (* 2 (! 1)))= (* 3 (! (- 3 1)))
これは，
= ...
(define (! n) = (* 3 (! 2))= (* 3 (*
2 (* 1 (! 0))))
(cond
= ...
[(= n 0) 1]
n (! (- n 1)))]))= (* 3 (* 2[else(* 1 (*
1)))
の
n
を
3
で置き換えたもの= (* 3 (* 2 1))= (* 3 2)= 6(! 3) から 6 に至る過程(! 3) から 6 に至る過程

(! 3)
= ...
基本的な計算式= (* 3 (! 2))
への展開
= ...
「(! 3)」 が膨張して= (* 3 (* 2 (! 1)))「(* 3 (* 2 (* 1(! 0))))」= ...
になる= (* 3 (* 2 (* 1 (! 0))))= ...
= (* 3 (* 2 (* 1 1)))
演算の実行
= (* 3 (* 2 1))「(* 3 (* 2 (* 1(! 0))))」= (* 3 2)が収縮して「6」になる= 6(! 3) ①= ...
= (* 3 (! 2))②= ...
= (* 3 (* 2 (! 1))) ③= ...
= (* 3 (* 2 (* 1 (! 0)))) ④= ...
= (* 3 (* 2 (* 1 1)))= (* 3 (* 2 1))
n = 3 のとき，
= (* 3 2)
4回繰り返して実行される= 6(! 3) から 6 に至る過程

テーラ展開(! 4) ①= ...
= (* 4 (! 3)) ②= ...
= (* 4 (* 3 (! 2))) ③= ...
= (* 4 (* 3 (* 2 (! 1)))) ④= ...
= (* 4 (* 3 (* 2 (* 1 (! 0))))) ⑤= ...
= (* 4 (* 3 (* 2 (* 1 1))))= (* 4 (* 3 (* 2 1)))= (* 4 (* 3 2))
n = 4 のとき，
= (* 4 6)
5回繰り返して実行される= 24

テーラ展開：関数 f が，a の近傍で定義されていて，点a で n 階微分可能であるとき

f ' (a)f ' ' (a)( x − a) +( x − a)2 + L
1!
2!
f (n−1) (a)f ( n) (ξ )+( x − a)n−1 +( x − a)n(n −1)!
n!

f ( x) = f (a) +ただしξ = a + θ ( x − a), 0 < θ < 1
関数が無限階微分可能な場合⇒テーラ級数 (剰余項(末尾項)が 0 に限りなく近づく)
三角関数や指数関数など様々な関数の級数表現が可能

13

テーラ展開(例)∞xi
x x2 x3= 1+ +
+
+L
1! 2!
3!
i = 0 i!

ex = ∑∞

sin x = ∑ (−1)ii =0∞x 2i +1x x3 x5 x 7= − + − + L 収束半径：∞( 2i + 1)! 1! 3! 5! 7!

cos x = ∑ ( −1) ii =0

収束半径：∞

x 2i
x 2 x 4 x 6 x8
= 1−
+
−
+
− L 収束半径：∞( 2i )!
2! 4! 6! 8!

x i +1x2 x3 x4
= x−+−
+ L 収束半径：１log e ( x + 1) = ∑ ( − 1)
2
3
4
i +1
i =0
∞

実習３．テーラ展開 −指数関数−
例題２の power_series を使い，指数関数のテーラ展開式にもとづいた ex の近似値を求める∞

xi
x x2 x3= 1+ +++L
1! 2! 3!
i = 0 i!

ex = ∑

べき乗にかかる係数はi(define (exp_term i)(/ 1 (! i)))x 2 i +1x3 x5 x7tan ( x ) = ∑ ( − 1)= x−+−
+ L 収束半径：１2i + 1
3
5
7
i =0
−1

∞

i

「実習３．テーラ展開 −指数関数−」の手順「実習３．テーラ展開 −指数関数−」の手順

1. 次を「定義用ウインドウ」に入力後，Run ボタンを押す;; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)))
(define (series n f)
(cond[(= n 0) (f 0)]
例題２[else (+ (f n)と同じ(series (- n 1) f))]));;power_series: number N (N -> number) -> number(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )(define (! k)(cond [(= k 0) 1]
k の階乗[else (* k (! (- k 1)))]))(define (exp-term i) (/ 1 (! i)))(define (taylor-exp x) (power_series x 10 exp-term))

2. その後，次を「実行用ウインドウ」で実行しなさい(taylor-exp 0)(taylor-exp 1)(taylor-exp 2)

power_series を使い，ex を計算 (10項までの近似計算)「指数関数のテーラ展開」の実行例

taylor-exp での誤差
(define (taylor-exp x)(power_series x 10 exp_term))
∞

xi
x x2
x3
x 10
x 11
= 1+ +
+
+L +
+
+L
1! 2!
3!
10 ! 11!
i = 0 i!

ex = ∑

x10/10! の項まで計算

誤差：x11/11! 以降

taylor級数第10項までの計算→ 確かに近似値

数値の先頭に #i → 限定的(inexact)表現(近似値)14

練習4．cos 関数のテーラ展開
例題２の power_series を使い，cos 関数のテーラ展開式に基づいた cos(x) の近似値を求
める
∞

x 2i
x 2 x 4 x 6 x8
cos x = ∑ ( − 1) i
= 1−
+
−
+
−L
( 2i )!
2! 4! 6! 8!
i =0= 1 + 0 ⋅ x1 −

x2
x4
x6
x8
+ 0 ⋅ x3 + + 0 ⋅ x5 − + 0 ⋅ x7 + − L
2!
4!
6!
8!

 初項は第0項，奇数項の値は 0 と考える
 k を i で割った余りは (remaindercos 関数のテーラ展開∞

cos x = ∑ ( − 1) ii =0

= 1+ 0 ⋅ x −x 2i
x 2 x 4 x 6 x8
= 1−
+
−
+
−L
( 2i )!
2! 4! 6! 8!

x2
x4
x6
x8
+ 0 ⋅ x 3 + + 0 ⋅ x 5 − + ⋅x 7 + − L
2!
4!
6!
8!

(define (cos-term k)(cond [(odd? k) 0][(= (remainder k 4) 0) (/ 1 (! k))][else (/ -1 (! k))])]))
odd? 関数は奇数ならば truek i)

「実習４．cos 関数のテーラ展開」の手順「実習４．cos 関数のテーラ展開」の手順

1. 次を「定義用ウインドウ」に入力後，Run ボタンを押す;; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)))
(define (series n f)
(cond[(= n 0) (f 0)][else (+ (f n)
実習３(series (- n 1) f))]));;power_series: number N (N -> number) -> number と同じ(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )(define (! k)(cond [(= k 0) 1]
k の階乗[else (* k (! (- k 1)))]))(define (cos-term k)(cond [(odd? k) 0][(= (remainder k 4) 0) (/ 1 (! k))][else (/ -1 (! k))]))(define (taylor-cos x) (power_series x 10 cos-term))

2. その後，次を「実行用ウインドウ」で実行しなさい(taylor-cos 0)(taylor-cos 0.2)
(taylor-cos 0.4)
(taylor-cos 0.6)
(taylor-cos 0.8)

power_series を使い10項までの近似計算「cos関数のテーラ展開」の実行例

実習５．対数関数のテーラ展開
 例題２の power_series 関数を使い，対数関数のテーラ展開式に基づいた近似値を求める∞

log e ( x + 1) = ∑ ( − 1) ii =0x i +1x2 x3 x4
=x −
+
−
+L
i +1
2
3
4

15

対数関数のテーラ展開「実習５．対数関数のテーラ展開」の手順
1. 次を「定義用ウインドウ」に入力後，Run ボタンを押す∞

log e ( x + 1) = ∑ ( − 1) ii =0x2 x3 x4
x i +1
=x −
+
−
+L
2
3
4
i +1

= 0+ x−x 2 x3 x 4
+ − L
2
3
4

(define (log-term k)(cond[(= k 0) 0][else (/ (expt -1 (- k 1)) k)]));; series: N (N -> number) -> number;; sum up the first n numbers in the sequence f;; (series 3 f2) = (+ (f2 3) (+ (f2 2) (f2 1)))
(define (series n f)
(cond[(= n 0) (f 0)]
例題２[else (+ (f n)と同じ(series (- n 1) f))]));;power_series: number N (N -> number) -> number(define (power_series x n g)
(local ((define (power_term i)(* (g i) (expt x i))))(series n power_term) ) )(define (log-term k)(cond[(= k 0) 0][else (/ (expt -1 (- k 1)) k)]))(define (taylor-log x) (power_series (- x 1) 10 log-term))

power_series を使い10項までの近似計算「実習５．対数関数のテーラ展開」の手順「対数関数のテーラ展開」の実行例

2. その後，次を「実行用ウインドウ」で実行しなさい(taylor-log 1)(taiyor-log 1.2)
(taylor-log 1.4)
(taylor-log 1.6)
(taylor-log 1.8)

限定値(近似値)
sin，cos，tan，log 等の実数についての関数は，
コンピュータを使っても近似値しか求まらない

補足説明事項

コンピュータで計算/表現可能なデータは，範囲と精度に限りがある

DrScheme の実行用ウインドウ
数値の先頭に 「#i」
→ 限定的(inexact)表現(近似値)16近似計算の例

課題
組込み関数 sin はもともと結果を「近似値」として計算

この「#i」は意図的な近似計算を指示
結果は「近似値」

どちらが
正確?
見易い?

課題２．級数課題１
1.

次の数列を求める関数 f を定義せよ

1.

a0 = 0

次に，高階関数 series を使い n 項までの
和 Σan を求める関数を定義し，実行結果を報告せよ(series 関数を使っていないものは，正解と認めない)(−1) k +1nan = 3an −1 + 12.

次の級数を求める関数を定義し，実行結果を報告しなさい1

1

1π∑ 2k − 1 = 1 − 3 + 5 − 7 + L (n → ∞で 4 に近づく)
k =1

2.

次の級数を求める関数を定義し，実行結果を報告しなさいn

1

1

1∑ k! = 1 + 2! + 3! + L (n → ∞でe − 1に近づく)
k =1

例題１が参考になるが，いずれも k = 1 から開始していることに注意

課題３．sin 関数のテーラ展開

課題４．tan-1 関数のテーラ展開

下のテーラ展開の値を求める関数を定義し，実行結果を報告せよ

下のテーラ展開の値を求める関数を定義し，実行結果を報告せよ∞

sin x = ∑ (−1)ii =0x 2i +1x x3 x5 x7= − + − +L
(2i + 1)! 1! 3! 5! 7!

∞

tan −1 ( x) = ∑ (−1) ii =0x 2i +1x3 x5 x7
= x − + − +L
2i + 13 5 7

式がちがっている17

課題５．関数のグラフ
 関数 d/dx （例題１）を使って，関数のグラフをグラフィックスで表示させる– プログラムは次ページ以降にある．このプログラムを実行し，実行結果を報告しなさい．
– このプログラムが描くグラフは上下さかさまになっている．これを普通のグラフ表示にするには，どのようにすればよいか．
– 但し，関数 f2 は必ず別のもの（自分で考えた独自のもの）に書き換えてから，実行結果の報告を行う
こと．

関数のグラフ表示プログラム(2/9); window size
(define WX 500)
(define WY 500)
; grid color, axis color and graph color(define GRID_COLOR 'blue)(define AXIS_COLOR 'red)(define GRAPH_COLOR 'red)関数のグラフ表示プログラム(4/9); draw-polyline(define (draw-polyline a-poly)(cond[(empty? (rest a-poly)) true][else (and (draw-solid-line(first a-poly) (first (rest a-poly))
GRAPH_COLOR)(draw-polyline (rest a-poly)))]))関数のグラフ表示プログラム(1/9);; d/dx: (number->number) number number -> number;; inclination of the tangent;; Example: (d/dx f 3 0.0001);;= (/ (- (f 3.0001) (f 2.9999)) 0.0002)(define (d/dx f x h)(/ (- (f (+ x h)) (f (- x h)))(* 2 h)));; samples: (number->number) number number number ->;; (listof posn)(define (samples f a h k)
(cond[(= k 1) (cons (make-posn (+ a h) (f (+ a h)))empty)][else (cons (make-posn (+ a (* h k))(f (+ a (* h k))))(samples f a h (- k 1)))]))関数のグラフ表示プログラム(3/9); draw-a-line(define (sessen x px py d) (+ (* d (- x px)) py))(define (draw-a-sessen from to px py d x0 y0 sx sy)(draw-solid-line(make-posn (+ (* from sx) x0)(+ (* (sessen from px py d) sy) y0))(make-posn (+ (* tosx) x0)(+ (* (sessen topx py d) sy) y0))
GRAPH_COLOR))(define (draw-sessen f px x0 y0 sx sy)(draw-a-sessen(/ (- x0) sx) (/ (- WX x0) sx)
px (f px) (d/dx f px 0.00001) x0 y0 sx sy))関数のグラフ表示プログラム(5/9); draw-h-lines(define (draw-h-lines start skip stop width)(cond[(>= start stop)(draw-solid-line (make-posn 0 stop)(make-posn width stop) GRID_COLOR)][else (and(draw-solid-line (make-posn 0 start)(make-posn width start)
GRID_COLOR)(draw-h-lines (+ start skip)
skip stop width))]))

18

関数のグラフ表示プログラム(6/9); draw-v-lines(define (draw-v-lines start skip stop height)(cond[(>= start stop)(draw-solid-line (make-posn stop 0)(make-posn stop height)
GRID_COLOR)][else (and(draw-solid-line (make-posn start 0)(make-posn start height)
GRID_COLOR)(draw-v-lines (+ start skip)
skip stop height))]))関数のグラフ表示プログラム(8/9); (x0, y0) is the origin.
; sx and sy represent one grid size
(define (scaling a-list x0 y0 sx sy)(cond[(empty? a-list) empty]
[else
(cons
(make-posn (+ (* (posn-x (first a-list)) sx) x0)(+ (* (posn-y (first a-list)) sy) y0))(scaling (rest a-list) x0 y0 sx sy))]));; f2: number -> number(define (f2 x)(- (* x x) 2))

独自のものに変えなさい．
簡単なものでは無く，ある程度複雑なものが望ましい．

関数のグラフ表示プログラム(7/9); (x0, y0) is the origin.
; sx and sy represent one grid size
(define (draw-grid x0 y0 sx sy)(and(draw-v-lines (- x0 (* (quotient x0 sx) sx)) sx(+ (* (quotient (- WX x0) sx) sx) x0) WY)(draw-h-lines (- y0 (* (quotient y0 sy) sy)) sy(+ (* (quotient (- WY y0) sy) sy) y0) WX)(draw-solid-line (make-posn 0 y0)(make-posn WX y0) AXIS_COLOR)(draw-solid-line (make-posn x0 0)(make-posn x0 WY) AXIS_COLOR)))関数のグラフ表示プログラム(9/9); (X0, Y0) reprerents the origin of the graph.
; SX and SY represent the size of one grid(define X0 (/ WX 2))(define Y0 (/ WY 2))(define SX 50)(define SY 50)(define PX 0.5)
(start WX WY)(draw-grid X0 Y0 SX SY)(draw-polyline (scaling(samples f2 (/ (- X0) SX)(/ 1 SX) WX) X0 Y0 SX SY))
(draw-sessen f2 PX X0 Y0 SX SY)

実行画面の例

本来なら，下のようなグラフになって欲しい19