【数学】テイラー展開(Taylor expansion)の復習とPythonでテイラー展開をする方法

背景

  • 久々に、学生時代に研究していた流体解析がしたくなった。
  • 学生時代は、流体解析に使用する数式の導出や原理の理解までできていなかった。
  • 流体解析をなんとなくではなく、自分なりに理解して楽しく分析して記事にしたいと思った。
  • 復習しはじめたが、数値解析の基本となるテイラー展開への理解が浅かったので復習してみた。

お願い

  • 数学科出身とかいうわけではないので、解釈違いや間違いがあれば是非優しくご指摘ください。

目標

  • 数値解析に必要なテイラー展開の知識を復習する。

テイラー展開と数値解析の関係

  • そもそも、数式の解は

    1. 解析解:理論的・代数的に算出できる解のこと

      • 厳密に求められるが式の形状によっては導出が困難になる。
    2. 数値解:数値計算によって得られる解のこと

      • 計算機でゴリゴリ計算するので、大抵の解は求められるが誤差を含む。

の2種類に分けられる。

  • パソコンは最終種的に全ての情報を2進数(01)で処理する都合上、解析解を求めるのは不得意である。
  • 基本的にパソコンで使用されているπなどは何かしらの方法で近似された有限な数字で置き換えられて計算されている。
  • その中でも、微分方程式を離散化する際にテイラー展開はよく使用されている。
    離散化:連続した関数などを何かしらパソコンが処理できるような別の数式への変換を行うこと
  • 物理の基礎方程式は大抵、微分方程式なので、差分法で数値解析をするならテイラー展開を使用する。

■基礎方程式の例

  • ニュートンの運動方程式

$$ma = m\frac{d^2\vec{r}}{dt^2} = \vec{F}$$

  • 今回はそもそもテイラー展開ってなんだっけ?ということを復習して、数値解析への理解を深めようと思う。

テイラー展開

  • とりあえず、説明の前に公式をドン。

===テイラー展開の公式===
無限回微分可能な関数$f(x)$について、

$f(x) = f(a) + f'(a)(x-a)+\frac{f''(a)}{2!}(x-a)^2 + ··· + \frac{f^{(n)}(a)}{n!}(x-a)^n + ···$

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

を$f(x)$の$x=a$のテイラー展開という。
特に$a=0$としたものをマクローリン展開という。

引用:https://w3e.kanazawa-it.ac.jp/math/category/suuretu/suuretu/henkan-tex.cgi?target=/math/category/suuretu/suuretu/taylor.html

  • なぜ、テイラー展開が成り立つかの証明はわかっていないので、スルーする。
  • とにかく数値解析的に大事なことは、連続な関数$f(x)$を右辺のような多項式で近似(離散化)できるということである。
  • これで難しい微分方程式も、テイラー展開で離散化して、差分法を適用すれば数値解を求められるようになる。
  • 微分方程式の差分をどう使っていくのかという話は勉強してまた記事にする予定。

pythonでテイラー展開をする

  • pythonには、テイラー展開を実現できるsympyというライブラリがある。
  • テイラー展開ができるsympyのseriesを紹介する。
  • 説明には、例として$f(x)=e^x$のテイラー展開を行う。
#sympyをインポートする
from sympy import*

# 変数として使用するシンボルを定義
x = Symbol('x')

#引数は series(展開する関数, x=使用する変数, x0=展開点, n=展開次数)
taylor_result = series(exp(x), x=x, x0=0, n=3)
print(taylor_result)
1 + x + x**2/2 + O(x**3)
  • 結果を見やすくしたもの
    $1+x+\frac{x^2}{2}+O(x^3)$

  • $f(x)$をつけて表記
    $f(x) = 1+x+\frac{x^2}{2}+O(x^3)$

  • $o(x^3)$は剰余項。

  • テイラー展開はあくまで関数の近似なので、どこかで展開を打ち切ることになる。

  • 剰余項はその打ち切り誤差分を表す記号。

テイラー展開前の式と展開後の式にx=1を代入にして値を比較してみる。

(1)展開前式に$x=1$を代入

$f(1) = e^1= 2.718・・・$

(2)展開後の式に$x=1$を代入(剰余項は無視)

$f(1) = 1+1+\frac{1^2}{2} = 2.5$

  • 3次までの近似しか行っていないので、まだ誤差が大きい。
  • 更に展開する次数を上げていけば精度は良くなる。

おまけ

  • sympyを知った時は「こやつすげぇな」と思った。
  • 数学系の記事を書いたのは初めてだったが、流れに沿って綺麗に数学の理論を伝えるのはすごく難しいと感じた。
  • 後、lataxの数式記述するのすごくめんどくさかった。lataxの生成ツールはどこかにないですかね?

参考資料

数値解析 - Wikipedia
テイラー展開
Python/sympyでテイラー展開した結果をグラフ化する方法
テイラー展開は任意点周りの近似計算をすることが出来るため、様々な工学的・物理的場面で活躍します。ここではsympyを使って面倒なテイラー展開をPythonにやらせ、グラフプロットまで自動で行うことを目標とします。
[Pythonによる科学・技術計算] テイラー展開, 数式, sympy - Qiita
sympyを利用してsin(x)のx=0まわりとx=1.5周りのテイラー展開を行う。from sympy import * """series関数を使う。series("関数", 変数, "x…
Series Expansions - SymPy 1.12 documentation

Qiita記事

【数学】テイラー展開(Taylor expansion)の復習とPythonでテイラー展開をする方法 - Qiita
背景久々に、学生時代に研究していた流体解析がしたくなった。学生時代は、流体解析に使用する数式の導出や原理の理解までできていなかった。流体解析をなんとなくではなく、自分なりに理解して楽しく分析し…