【ゲーム数学】第八回 p5.jsで学ぶゲーム数学「テイラー展開と近似式の計算」

JavaScript
マイケル
マイケル
みなさんこんにちは!
マイケルです!
エレキベア
エレキベア
こんにちクマ〜〜〜
マイケル
マイケル
今回も引き続きゲーム数学!
これまで微分、積分と進めてきたので、最後に テイラー展開 で遊んで締めようと思います!
エレキベア
エレキベア
テイラー展開・・・聞いたことあるクマが難しそうクマ〜〜〜
マイケル
マイケル
パッと見の式はややこしいけど、実装して見える形で表すと中々面白いんだ!
さっそくやっていこう!!
エレキベア
エレキベア
楽しみクマ〜〜〜〜
スポンサーリンク

テイラー展開(マクローリン展開)とは

マイケル
マイケル
実装に入る前に、テイラー展開がどのようなものなのか見ていきます!

テイラーの定理

マイケル
マイケル
テイラー展開はテイラーの定理というものに基づいていて、
n+1回微分出来る関数はxの多項式で近似できる、という定理なんだ!
下記はある関数の2点をx、aとして表したものです。

$$ f(x)=f(a)+f'(a)(x-a)+\frac{f”(a)}{2!}(x-a)^2+…+\frac{f^{(n)}(a)}{n!}(x-a)^n+\frac{f^{(n+1)}(c)}{n+1!}(x-a)^{n+1} $$

エレキベア
エレキベア
うへ〜〜中々すごいクマね
これは微分すればするほど近づくということクマね
マイケル
マイケル
これの面白い点として、sinやcos等の三角関数にも適用できて、
それらもxの多項式で表すことができる
、といったものがあるんだ。
この辺りはこの後実装してみるよ!

テイラー展開

マイケル
マイケル
テイラーの定理の最後の項は剰余項といって、n回微分して近似した際の誤差になります。

$$ R_{n+1}=\frac{f^{(n+1)}(c)}{n+1!}(x-a)^{n+1} $$

マイケル
マイケル
剰余項は微分する回数が多くなるほど誤差が小さくなって無視できるので、最終的に下記のような級数で求めることができます。
このような形で近似計算するのをテイラー展開と言います!

$$ f(x)=\sum_{n=0}^\infty\frac{f^{(n)}(a)}{k!}(x-a)^n $$

エレキベア
エレキベア
何とか計算できそうな形になったクマね

マクローリン展開

マイケル
マイケル
そしてこれらのaの値を0として計算を簡易化したものをそれぞれマクローリンの定理マクローリン展開と言います。

$$ f(x)=f(0)+f'(0)x+\frac{f”(0)}{2!}x^2+…+\frac{f^{(n)}(0)}{n!}x^n+\frac{f^{(n+1)}(c)}{n+1!}x^{n+1} $$

$$ f(x)=\sum_{n=0}^\infty\frac{f^{(n)}(0)}{k!}x^n $$

エレキベア
エレキベア
おお〜〜だいぶシンプルになったクマね
マイケル
マイケル
これからいくつかの関数を実装してみるけど、それはこのマクローリン展開で求めた近似式を使って進めていきます!

マクローリン展開を使用した近似式の描画

マイケル
マイケル
それではいくつかの関数をマクローリン展開を使って実装してみます!
今回は有名な例である
・sin(x)
・cos(x)
・e^x
の3つのサンプルを作ってみました!
エレキベア
エレキベア
どこまで近似できるのか楽しみクマ〜〜

sin(x)

マイケル
マイケル
まずはsin(x)から!
f(x)=sin(x)をマクローリン展開に当てはめると、下記のように表すことができます。

$$ f(x)=\sum_{n=0}^\infty(-1)^n\frac{x^{2n+1}}{(2n+1)!} $$

マイケル
マイケル
この式を使用して実装してみたのがこちらです!

See the Pen
20221220_maclaurin_sin
by masarito617 (@masarito617)
on CodePen.

// マクローリン展開(sin)
function maclaurinSin(x, derCount) {
  let ret = 0;
  for (let n = 0; n < derCount; n++) {
    ret += (-1)**n * (x**(2*n+1)) / factorial(2*n+1);
  }
  return ret;
}

// 階乗計算
function factorial(n) {
  let fact = 1;
  for (let i = 1; i <= n; i++) {
    fact *= i;
  }
  return fact;
}
ScreenShot 2022 12 23 0 39 37
マイケル
マイケル
上の図はn=5の例ですが、中々近似できているのではないでしょうか?
Nの値を変えてみると下記のように、内側からどんどんsin(x)の関数に近づいていくのが確認できます!
01 sin↑nの値を変えると面白い
エレキベア
エレキベア
こんな感じで近づくのクマね
見ていて中々面白いクマ
マイケル
マイケル
なんだか可愛らしくも見えてくるね()

cos(x)

マイケル
マイケル
次はcos(x)
こちらはsin(x)とも似ていますが、下記の式で表すことができます。

$$ f(x)=\sum_{n=0}^\infty(-1)^n\frac{x^{2n}}{(2n)!} $$

マイケル
マイケル
こちらも同様にサンプルを作ってみました!

See the Pen
20221220_maclaurin_cos
by masarito617 (@masarito617)
on CodePen.

// マクローリン展開(cos)
function maclaurinCos(x, derCount) {
  let ret = 0;
  for (let n = 0; n < derCount; n++) {
    ret += (-1)**n * (x**(2*n)) / factorial(2*n);
  }
  return ret;
}
ScreenShot 2022 12 23 0 41 16
02 cos
マイケル
マイケル
これも中々いい感じに近づく様子が確認できますね
エレキベア
エレキベア
これでsin、cos制覇クマ〜〜〜

指数関数e^x

マイケル
マイケル
最後は指数関数e^xです!
こちらは前の例よりも更にシンプルで、下記の式で表すことができます。

$$ f(x)=\sum_{n=0}^\infty\frac{x^n}{n!} $$

マイケル
マイケル
サンプルは下記になります!!

See the Pen 20221220_maclaurin_napier by masarito617 (@masarito617) on CodePen.

// マクローリン展開(e^x)
function maclaurinNapier(x, derCount) {
  let ret = 0;
  for (let n = 0; n < derCount; n++) {
    ret += (x**(n)) / factorial(n);
  }
  return ret;
}
ScreenShot 2022 12 23 0 42 57
03 e
エレキベア
エレキベア
直線の方が近似するのクマか・・・
マイケル
マイケル
そうきたかって感じだね・・・

おわりに

マイケル
マイケル
というわけで、テイラー展開を使った近似の例をいくつか実装してみました!
どうだったかな??
エレキベア
エレキベア
テイラー展開、マクローリン展開について理解できた気がして嬉しいクマ〜〜〜
近づく様子は見ていて面白いクマね
マイケル
マイケル
微分するほど近づいていくというのも面白いし、美しさも感じるね!
エレキベア
エレキベア
これでテイラー展開マウントも取れるクマね
マイケル
マイケル
最悪なクマだな・・・・
全三回、微分積分を触ってきたけど、実装してみると分かりやすいし楽しかったね!
ゲーム開発にも上手く活かしていこう!!
マイケル
マイケル
それでは今日はこの辺で!
アデューー!!
エレキベア
エレキベア
クマ〜〜〜〜

【ゲーム数学】第八回 p5.jsで学ぶゲーム数学「テイラー展開と近似式の計算」〜完〜

コメント