数値微分(高階関数)
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2020/03/19 03:24 UTC 版)
「Standard ML」の記事における「数値微分(高階関数)」の解説
SMLは関数型言語なので、関数を生成し処理することが容易である。これには様々な応用が考えられる。関数の数値微分もその1つである。以下のSML関数 "d" は与えられた関数 "f" の "x" における数値微分を計算する。 - fun d delta f x = (f (x + delta) - f (x - delta)) / (2.0 * delta); val d = fn : real -> (real -> real) -> real -> real この関数は小さい値 "delta" を必要とする。例えば、マシンイプシロンの立方根を delta として使うことができる。 関数 "d" の型は、型 "(real -> real) -> real -> real" を持つ別の関数へ "real" を与える、というものである。このように、「関数を、必要な全ての引数より少ない数の引数を取り、さらに残りの引数を取るような関数を返す関数にする」方式をカリー化と呼ぶ。これにより、引数を一部だけ適用する(部分適用という。部分適用のことないし「ある関数をカリー化し、それに部分適用したものを返す」ことについて誤って「カリー化」と言及されていることがあるので注意する)こともできるようになる。ここでは "delta" を具体的に指定し、より特化した関数を得る。 - val d = d 1E~8; val d = fn : (real -> real) -> real -> real ここで推論された型を見ると、置換された "d" は第一引数が "real -> real" という型の関数になっている。これを使って、例えば x^3-x-1 での x=3 のときの微分値の近似を計算する。 - d (fn x => x * x * x - x - 1.0) 3.0; val it = 25.9999996644 : real 正しい値は f'(x) = 3x^2-1 => f'(3) = 27-1 = 26 である。 関数 "d" は別の関数 "f" を引数としてとるので、「高階関数 (higher-order function)」と呼ばれる。 カリー化と高階関数は冗長コードを排除できる。例えば、ライブラリに a -> b という型の関数が必要だとする。しかし、a 型と c 型のオブジェクトに固定的な関係がある場合、a * c -> b という型の関数を書くほうが便利である。(a * c -> b) -> (a -> b) という型の高階関数を使えば、共通点を取り除くことができる。これは Adapter パターンの一例である。
※この「数値微分(高階関数)」の解説は、「Standard ML」の解説の一部です。
「数値微分(高階関数)」を含む「Standard ML」の記事については、「Standard ML」の概要を参照ください。
- 数値微分のページへのリンク