Python SciPy : スカラー関数の求根アルゴリズム

SciPy にあるスカラー関数の求根アルゴリズムについてまとめます。

関数について

SciPy には表 1 のスカラー関数の求根アルゴリズムがあります。

Table 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 しか使わないと思うので、これらを使用する例を示します。

# coding: utf-8
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]

コメント

Comments powered by Disqus
書籍更新情報
2016-10-21
Pythonによる科学技術計算 基礎編
PDF版の販売を開始しました。
販売ページはこちら

2016-09-09
Pythonによる科学技術計算 基礎編
1.2版への更新が可能になりました。
サポートページはこちら
電子書籍
Pythonによる科学技術計算 基礎編
Kindle ストア、Leanpubで販売中です
Pythonによる科学技術計算 基礎編
PDF版の販売はこちら
同人誌
技術書典(2016/6/25)
Emacs/org-modeのPDF作成術
電子版をBOOTHで販売中です
Emacs/org-modeのPDF作成術
Share