Python SciPy : スカラー関数の求根アルゴリズム
SciPy にあるスカラー関数の求根アルゴリズムについてまとめます。
関数について
SciPy には表 1 のスカラー関数の求根アルゴリズムがあります。
関数 | 説明 |
---|---|
brentq | Brent 法(逆 2 次補間) |
brenth | Brent 法(双曲線補間) |
ridde | Ridder 法 |
bisect | 二分法 |
newton | Newton-Raphson 法 |
fixed_point | Steffensen 法 |
brentq は Brent 法でゼロ点近くの収束に逆 2 次補間を組み合わせた方法です。 二分法による確実な収束性と、根の囲い込み法による速さを持っています。関数の微分が与えられない場合は、スカラー関数の解法としては brentq を使用するよう推奨されています。
brenth は Brent 法で逆 2 次補間の代わりに双曲線補間を使用した方法です。 場合によって逆 2 次補間では根の存在範囲を超えて発散してしまうことがあり、双曲線補間を使うことでより安定性を高めた方法です。 収束の速さは brentq に劣ります。
Ridder 法は実装が簡単で二分法より速く、そこそこ頑強な優秀な方法です。 しかし、二分法ほどの確実性はなく速さでも Brent 法に劣ります。
bisect は二分法で解を求めます。探索区間に根が存在するならば確実に解に辿りつけますが、収束が遅いのが欠点です。
Newton-Raphson 法は関数の微分が与えられるなら非常に高速に収束します。 しかし、初期値や関数によっては収束しないことがあるので注意が必要です。
fixed_point は Steffensen 法で \(x=g(x)\) となる 解 を見つけます。
なお、多変数用の関数 root 等でもスカラー関数の解を求めることができますが、スカラー関数なら brentq や newton の方が速いのでこちらを使うようにしましょう。
例
大抵は brentq か newton しか使わないと思うので、これらを使用する例を示します。
import numpy as np from scipy import optimize y = lambda x: x**3 + 2.*x**2 - 5. dy = lambda x: 3.*x**2 + 4.*x res1 = optimize.brentq(y, -10, 10) res2 = optimize.newton(y, 10, dy) [res1, res2]
[1.2418965630344794, 1.2418965630344798]