Chapter 7
テイラー・フーリエ・Manipulate

整数でない実数は適当な有効数字の小数で表すのが実用的である．同じことを関数でやるのがたとえばテイラー展開であり，フーリエ展開である．
この章では Mathematica を利用してテイラー・フーリエ展開を計算し，さらに組込み関数 Manipulate を使って「動的に」グラフ化する方法を学ぶ．

無理数√2 = 1.4142 . . . は√4
1
42+ 2 + 3 + 4 + ···10 101010√という無限和で表現できる．たとえば 2 ≈ 1.41 と書くとき，それは上の無限和を 32=1+項目で打ち切って，残りは「誤差」として無視します，ということに他ならない．
同様に数直線 R 上の滑らかな関数（何度でも微分できる関数）f : R → R, y = f (x)に対し，x = a でのテイラー展開 (Taylor expansion)f ′ (a)f ′′ (a)f (n) (a)2f (x) = f (a) +(x − a) +(x − a) + · · · +(x − a)n + Rn+1 (x)1!
2!
n!
が得られる．右辺の Rn+1 (x) はいわゆる剰余項で，関数の「無視したい」部分である．*1 それ以外の部分が f (x) の a における n 次のテイラー多項式とよばれるもので，f (x) の「多項式による最良近似」にあたる．x − a = 1/10 としてみれば，上の√2との類似が感じられるだろう．一般に |x − a| がある程度小さければ n を増やすこと*2 実際のところテイラー多項式を求めるというのは重労働であっで近似は良くなるが，*1 実際 x → a と極限をとると Rn+1 (x)/(x − a)n → 0 となる（すなわち (x − a)n より速く 0 に収束する）が，x が a から離れた場合 Rn+1 (x) は発散するのが普通である．
*2 テイラー級数展開の収束半径より小さければよい．

80

7テイラー・フーリエ・Manipulateて，見たこともない関数の 5 階微分を求める，なんて考えただけでも数学をやめたくなってしまう．こういうことはぜひ，Mathematica にやらせてしまおう．
この章では与えられた関数のテイラー展開を求め，そのグラフを描くための知識を学ぶ．さらに，組込み関数 Manipulate を用いて，テイラー多項式の次数 n が増えると近似が良くなっていく様子を実感できるような「動く」グラフ作りを学ぶ．
また関数を三角関数の和で近似するフーリエ展開についても，同様に「動く」グラフを作成してその近似の様子を観察してみよう．

7.1

関数の定義（即時割り当て vs 遅延割り当て）

変数や関数を定義する際には，5 章で学んだ即時割り当て（即時的定義）とこれから学ぶ遅延割り当て（遅延的定義）の二種類があり，うまく使い分ける必要がある．
その違いを，乱数を発生させる組込み関数 RandomReal を用いて確認してみよう．
[1] RandomReal は 0 と 1 の間の実数をひとつランダムに選ぶ：
In[1]:=

Out[1]=RandomReal[ ]0.674587[ ] の 中 に 何 も 書 か な い の で 違 和 感 が あ る か も し れ な い が ，気 に し な く て よい．*3 RandomeReal は何も代入しなくても，勝手に値を決めて出力する関数なのである．（詳しくは 9 章参照．）[2] まずはイコール = で文字 x に RandomeReal[] を即時割り当て：
In[2]:=

Out[2]=

x = RandomReal[]
0.276893

右辺が一旦評価された上で，その値が（定数として） x に割り当てられる．
[3] そのあと x を使うときは，毎回同じ結果となる：
In[3]:=

Out[3]={x, x, x}80.276893, 0.276893, 0.276893<[4] 次にコロン・イコール := で文字 x に RandomeReal[] を遅延割り当て：
In[4]:=x := RandomReal[]

遅延割り当ての場合（セミコロン ; をつけなくても）何も出力されない．

*3 ここではわざと半角の空白を入れたが，それすら必要ない．RandomeReal[] と書けばよい．

フーリエ展開

7.5

89

na3

2Out[21]=1-105-510-1-2-3gr[a_, n_] はアのグラフに相当するものを描くための自作関数であり，pt[a_] は「赤く大きな点」を {a, f1[a]} に描くための自作関数である．これらを同時に表示するのが Show の役
割で，Manipulate で n, a の値を変化させる．

7.5¨

フーリエ展開フーリエ展開もアイディアはテイラー展開によく似ている．どちらも与えられた関数を，「よくわかっている関数の和」で近似するのである．ただしテイラーが x のべき乗 xk を用いるのに対して，フーリエは sin kx, cos kx (k = 0, ±1, ±2, . . .) の形の三角関数を用いる．
定義（フーリエ展開）．区分的に連続な関数 f : R → R および n = 0, 1, 2, . . . に対し，

1
an =π

∫ πf (x) cos nx dx,−π1bn =π∫ πf (x) sin nx dx,−πと定義する．このとき，∞a0 ∑f (x) ∼+{an cos nx + bn sin nx}
2n=1(∗)と表し，(∗) の右辺の級数を f (x) のフーリエ級数 (Fourier series) もしくはフーリエ展開 (Fourier expansion) とよぶ．
関数 f と x が適当な条件をみたせば，フーリエ級数は収束しかつ (∗) 式の ∼ を等号 = に変えた式が成立する．

907

テイラー・フーリエ・Manipulate

an , bn の定義より，関数 f のフーリエ級数は区間 [−π, π] での f の値だけで決まってしまう．また，フーリエ級数は（発散する場合もふくめて）周期 2π をもつことに注意しよう．
この節ではフーリエ級数が収束する様子を Mathematica で観察してみよう．
[22] 関数 f2[x] を適当に定義（f2 (x) = x）：
In[22]:=

f2[x_] = x;[23] FourierTrigSeries で関数 f2[x] の 5 次フーリエ展開を求める：
In[23]:=

Out[23]=

FourierTrigSeries[f2[x], x, 5]2 Sin@xD - Sin@2 xD +212
Sin@3 xD Sin@4 xD +Sin@5 xD
325こちらはテイラー展開の Series のように「剰余項」にあたるものがつかないので，出力はそのまま関数として使える．
[24] n 次のフーリエ展開を関数 g2 として「遅延的に」定義：
In[24]:=

g2[x_, n_] := FourierTrigSeries[f2[x], x, n][25] Manipulate で近似の様子を確認：
In[25]:=

Manipulate[Plot[Evaluate[g2[x, n]],{x, -2 Pi, 2 Pi}, PlotRange -> {-4, 4}],{n, 1, 100, 1}]n42Out[25]=-6-42-2

4

6-2-4

もとの関数 f2 (x) = x 自体は数直線 R 上で連続だが，得られたフーリエ展開は（不連続点をもつ）関数{f˜2 (x) =x (−π < x < π)
0 (x = ±π)

7.5フーリエ展開91を周期 2π で R 全体に拡張したものに各点収束するのである．*8 また，不連続点のまわりに発生する「ギザギザ」はギブズ現象 (Gibbs phenomenon) とよばれる．n を増やしてもこの「ギザギザ」は消えないが，不連続点に寄っていくので級数の各点収束性には矛盾しない．
問題 7.4f (x) = x2 もしくは f (x) = |x| について，フーリエ展開（級数）が収束していく様子を Manipulate で図示せよ．（ただし，x の絶対値は Abs[x] で与えられる．）また，極限として得られる関数はどのようなものか？
【解答】 [22]–[25] の関数を変えるだけであるから，Mathematica による入出力は省略する（下の図 7.2 参照）．これらの例では f (π) = f (−π) が成り立つことに注意しよう．フーリエ級数
1086443212-105-5図 7.210-10-5510-1

偶関数 x2 および |x| の 40 次のフーリエ展開．の極限として得られる関数は f (x) (−π ≤ x ≤ π) を周期 2π で R 全体に拡張して得られる連続関数となり，収束する過程でギブズ現象はおきない．*9¨問題 7.5 (矩形波 (Square wave) のフーリエ展開) 次の関数はある関数のフーリエ展開であり，R 全体で各点収束する．その収束の様子を Manipulate と Plot で視覚化せよ．

4sn (x) =π()sin 3x sin 5xsin(2n − 1)xsin x +++ ··· +35(2n − 1)

これはどのような関数のフーリエ展開だと考えられるか？
【解答】 [24] のかわりに sn (x) にあたる関数を Sum を用いて（即時的に）定義し，[25] のように収束の様子を視覚化すればよい：*8 関数の列 {gn : R → R}∞
n=1 が関数 g : R → R に各点収束するとは，すべての実数 x について数∞
列 {gn (x)}n=1 が g(x) に収束することをいう．
*9 こ の 場 合 フ ー リ エ 級 数 は 極 限 関 数 に 一 様 収 束す る ．こ こ で 周 期 2π を も つ 周 期 関 数 の 列{gn : R → R}∞「 誤 差 の 最 大 値 」 Mn =n=1 が 関 数 g : R → R に 一 様 収 束 す る と は ，max|x|≤π |gn (x) − g(x)| が n → ∞ のとき 0 に収束することをいう．

92

テイラー・フーリエ・Manipulate

7

その上で ：
In[ ]:=

s[x_, n_] = (4/Pi)*Sum[Sin[(2 k - 1) x]/(2 k - 1), {k, 1, n}];Manipulate[ Plot[Evaluate[s[x, n]], {x, -2 Pi, 2 Pi},
PlotRange -> {-3, 3}],{n, 1, 100, 1}]n21Out[ ]=-6-42-2

4

6-1-2n を大きくすれば，sn (x) が [−π, π] 上の不連続点をもつ関数
8(0 < x < π)
< 1˜−1 (−π < x < 0)f (x) =:0(x = 0, ±π)を周期 2π で実数全体に拡張したものに各点収束することが観察できる．

7.6¨

研究問題 7.6 ((リサジュー曲線再訪) Manipulate と ParametricPlot を用いて，リサジ)
ュー曲線

cos mtsin ntが n, m （整数とは限らない）に応じて変化する様子を確認せよ．

【解答】 たとえば次のように入力する*10 ：In[ ]:=

lissa[t_, m_, n_] = {Cos[m*t], Sin[n*t]};
Manipulate[ParametricPlot[lissa[t, m, n],{t, -2 Pi, 2 Pi}, PlotRange -> {-1, 1}],{m, 1, 100}, {n, 1, 100}]*10 6 章問題 6.3 のように m と n が整数であれば曲線 (cos mt, sin nt) は閉曲線（ループ）を描くが，この問題の場合は閉曲線とは限らず，出力で描かれる |t| ≤ 2π での絵は曲線の一部ということになる．

7.6

研究93mn1.0

Out[ ]=

0.5-1.00.5-0.5

1.0-0.5-1.0¨

問題 7.7 (等位面の変化) Manipulate と ContourPlot3D を用いて，陰関数 xyz = kで表される 3 次元空間内の曲面が定数 k に応じて変化する様子を確認せよ．
【解答】 ContourPlot3D は ContourPlot の 3 次元版で，関数の等高面を描く．たとえば：
In[ ]:=

ContourPlot3D[x y z, {x, -2, 2}, {y, -2, 2}, {z, -2, 2},Contours -> 7, ContourStyle -> Opacity[0.7],
Mesh -> None]

Out[ ]=

オプション Contours -> 7 で等高面の数を 7 枚に指定し，ContourStyle -> Opacity[0.7]で面の透明度を指定し，最後の Mesh -> None で面上のメッシュが描かれないようにする．
特定 の等 高面 xyz = k を描か せた い 場 合 ，ContourPlot の と き と同様に ，方程式をx y z == k の形で書き入れればよい．（4 章 4.5 節も参照．）Manipulate と組み合わせると次のようになる：
In[ ]:=

Manipulate[ContourPlot3D[x y z == k,{x, -2, 2}, {y, -2, 2}, {z, -2, 2}, Mesh -> None],{k, -2, 2}]

94

7

テイラー・フーリエ・ManipulatekOut[ ]=¨

問題 7.8 (ドーナツを食べる) トーラスを

tor[u_, v_] = {(3 + Cos[v])Cos[u], (3 + Cos[v])Sin[u], Sin[v]};で定義する．以下を実行し，トーラスの断面を確認せよ．

Manipulate[ParametricPlot3D[tor[u, v],{u, 0, 2 Pi}, {v, 0, 2 Pi}, PlotStyle -> Brown,
PlotRange -> {{-4, 4}, {a, 4}, {-1, 1}}],{a, -4, 4}]

その他の研究課題(1) 問題 7.3 を参考にして，問題 7.2 の「動く接線グラフ」をもっと見やすくせよ．
(2) z = f (x, y) のグラフの点 (p, q, f (p, q)) における接平面は
z = f (p, q) + fx (p, q)(x − p) + fy (p, q)(y − q)で与えられる．関数 z = xy に対して，「動く接平面のグラフ」を作成せよ．

(3) Mathematica は高次元のテイラー展開・フーリエ展開にも対応している．ドキュメントセンターで使い方と具体例を調べよ．