区間演算

区間演算（くかんえんざん、英: Interval arithmetic、独: Intervall arithmetik）（あるいはそれを用いた区間解析(interval analysis)）は数学者たちによって1950年代から1960年代にかけて作られた手法であり、数学的計算における丸め誤差と測定誤差に対して評価を行い信頼できる結果をもたらす数値的な手法を開発するものである。簡単に言うと、すべての値をとりうる数値の範囲で表現するのである。例えば、人の身長を通常の計算で2メートルと表わす代わりに、1.97メートルから2.03メートルの範囲であると表すのである。 この概念は様々な用途がある。主な使用方法は計算途中の丸め誤差を把握することである。区間演算は最適化問題や微分方程式の信頼できる求解を助けるという役割もある。 数学的に表現すると、不確かな実数xについて扱う代わりに、xを含む区間[a, b]を扱う。xを代入した関数fの値も不明である。区間演算において関数fは区間[c, d]を生成する。[c, d]は[a, b]内にある全てのxについてf(x)が取りうる値を表す。 区間演算の主な目的は与えられた関数の値域の上界と下界を簡単に計算することである。端点は上限、下限とは限らない。なぜならば端点の具体的計算は困難もしくは不可能な場合があるからだ。伝統的な実数の計算と同様に、四則演算と区間値の関数が定義されなければならない。より複雑な関数もこれに基づいて計算される。 区間演算では四則演算を以下のようにして行う： 加法: [ x 1 , x 2 ] + [ y 1 , y 2 ] = [ x 1 + y 1 , x 2 + y 2 ] {\displaystyle [x_{1},x_{2}]+[y_{1},y_{2}]=[x_{1}+y_{1},x_{2}+y_{2}]} 減法: [ x 1 , x 2 ] − [ y 1 , y 2 ] = [ x 1 − y 2 , x 2 − y 1 ] {\displaystyle [x_{1},x_{2}]-[y_{1},y_{2}]=[x_{1}-y_{2},x_{2}-y_{1}]} 乗法: [ x 1 , x 2 ] ⋅ [ y 1 , y 2 ] = [ min ( x 1 y 1 , x 1 y 2 , x 2 y 1 , x 2 y 2 ) , max ( x 1 y 1 , x 1 y 2 , x 2 y 1 , x 2 y 2 ) ] {\displaystyle [x_{1},x_{2}]\cdot [y_{1},y_{2}]=[\min(x_{1}y_{1},x_{1}y_{2},x_{2}y_{1},x_{2}y_{2}),\max(x_{1}y_{1},x_{1}y_{2},x_{2}y_{1},x_{2}y_{2})]} 除法: [ x 1 , x 2 ] [ y 1 , y 2 ] = [ x 1 , x 2 ] ⋅ 1 [ y 1 , y 2 ] , {\displaystyle {\frac {[x_{1},x_{2}]}{[y_{1},y_{2}]}}=[x_{1},x_{2}]\cdot {\frac {1}{[y_{1},y_{2}]}},} ただし、 1 [ y 1 , y 2 ] = [ 1 y 2 , 1 y 1 ] 0 ∉ [ y 1 , y 2 ] 1 [ y 1 , 0 ] = [ − ∞ , 1 y 1 ] 1 [ 0 , y 2 ] = [ 1 y 2 , ∞ ] 1 [ y 1 , y 2 ] = [ − ∞ , 1 y 1 ] ∪ [ 1 y 2 , ∞ ] = [ − ∞ , ∞ ] 0 ∈ ( y 1 , y 2 ) {\displaystyle {\begin{aligned}{\frac {1}{[y_{1},y_{2}]}}&=\left[{\tfrac {1}{y_{2}}},{\tfrac {1}{y_{1}}}\right]&&0\notin [y_{1},y_{2}]\\{\frac {1}{[y_{1},0]}}&=\left[-\infty ,{\tfrac {1}{y_{1}}}\right]\\{\frac {1}{[0,y_{2}]}}&=\left[{\tfrac {1}{y_{2}}},\infty \right]\\{\frac {1}{[y_{1},y_{2}]}}&=\left[-\infty ,{\tfrac {1}{y_{1}}}\right]\cup \left[{\tfrac {1}{y_{2}}},\infty \right]=[-\infty ,\infty ]&&0\in (y_{1},y_{2})\end{aligned}}} である。 数式中における区間の表記を簡明にするため、カギ括弧が使われる。 よって [ x ] ≡ [ x 1 , x 2 ] {\displaystyle [x]\equiv [x_{1},x_{2}]} を区間の表記のために使うことができる。有限区間全体の集合を表す記号として [ R ] := { [ x 1 , x 2 ] | x 1 ≤ x 2  and  x 1 , x 2 ∈ R ∪ { − ∞ , ∞ } } {\displaystyle [\mathbb {R} ]:=\left\{\,[x_{1},x_{2}]\,|\,x_{1}\leq x_{2}{\text{ and }}x_{1},x_{2}\in \mathbb {R} \cup \{-\infty ,\infty \}\right\}} も使われる。区間を成分に持つベクトルについては ( [ x ] 1 , … , [ x ] n ) ∈ [ R ] n {\displaystyle \left([x]_{1},\ldots ,[x]_{n}\right)\in [\mathbb {R} ]^{n}} または [ x ] {\displaystyle [\mathbf {x} ]} を用いる。 区間は中心から一定の距離を持った点の軌跡として定義することができて、この定義は実数から複素数に拡張することもできる。 実数の場合と同様に、複素数の計算も不確かなデータを含む。区間が実の閉区間で複素数が実数のペアであることから、区間演算の応用を実数計算の不確かさを測るのに限定する理由はない。よって区間演算は複素数計算での不確かさの領域を特定するために複素区間へ拡張できる。 実の閉区間に対する基本的な代数的操作は複素数に拡張できる。ゆえに複素区間演算が「通常の複素計算と全く同じではないが類似している」のは驚くことではない 。複素区間演算は実数区間演算と同様に（特別な場合を除いて）加法と乗法に分配側がないことと、逆元が常に存在するわけではないことが知られている。また、複素共役の加法的、乗法的性質は複素区間の共役については成り立たない。 区間演算は複素の場合と同様に、四元数や八元数などの多次元の数に拡張できるが、通常の計算における便利な性質が犠牲になるという特徴がある。 区間演算は確かな数値を持たない推定量を扱うために様々な分野で使われる。例えば集合反転（英語版）、ロボットの行動計画（英語版、フランス語版、スペイン語版、中国語版）、集合推定（英語版）、安定性解析などに使われる。 区間演算は計算ごとに生じる丸め誤差を制御するために誤差解析で用いられる。区間演算の利点は計算が終わるごとに必ず真値を含む区間が得られることである。区間の端点間の距離は計算の誤差量を表している。丸め誤差解析の研究ではジェームズ・H・ウィルキンソンが著名である。 区間ニュートン法 (英: Interval Newton method) はニュートン法の一部を区間演算に置き換えた手法であり、非線形方程式の精度保証付き数値計算に用いられる。ゲッツ・アールフェルトによって提案された。区間ニュートン法については解の存在定理があり、その証明にはブラウワーの不動点定理が使われる。 ウォリック・タッカーは区間演算を活用して、14番目のスメイルの問題を解決した。 3次元多様体の双曲性を判定するために区間演算が活用されている。 区間演算は数学において全く新しいものではない。数学の歴史において、異なる名前で複数回現れている。例えばアルキメデスは紀元前3世紀に223/71 < π < 22/7を計算した。区間を用いた具体的計算は他の数値的手法のように人気になることはなかったが、完璧に忘れられることもなかった。 区間などの演算規則は1931年にケンブリッジ大学の博士課程学生であったRosalind Cicely Youngによって出版された。その後、デジタル系の信頼性を高めるために区間の数的研究がミシガン大学のPaul Dwyerによって出版された。区間は浮動小数点数に伴う丸め誤差を把握するために使われた。数値解析における区間代数の体系的研究は須永照夫によって発表された。 現代の区間演算はRamon E. Mooreが1966年に出版したInterval Analysisに端を発する。彼は1958年の春にはアイデアを持っており、数年後にコンピュータによる区間演算についての記事を出版する。その利点は単純な原理から出発して自動的な（丸め誤差以外の誤差を含む）誤差解析のための一般的方法を提供することであった。 上記とは独立に1956年、Mieczyslaw Warmusが区間を用いた計算の公式を提案した。だが最初に非自明な応用を発見したのはMooreであった。 その後20年にわたってカールスルーエ工科大学のゲッツ・アールフェルト とウルリヒ・クリッシュを中心にしたドイツのグループが研究を推進した。 例えば、Karl Nickel（ドイツ語版）がより効果的な実装を探求すると同時に、Arnold Neumaierなどが方程式系の解集合を包含する手順を改良した。1960年代にはEldon R. Hansen（英語版）が線型方程式系の区間拡張を扱い、大域最適化に重要な貢献を果たした。この研究は今日でいうHansen法を含んでおり、もしかしたらこれが最も広く使われる区間アルゴリズムかもしれない。 このような古典的手法はしばしば最大（もしくは最小）の大域値を決定するのに問題が起きるが、局所最適解を見つけてより良い値が見つけられなかった。Helmut RatschekとJon George Rokneは分枝限定法を開発し、それまでは整数値にしか適用できなかったが、区間を使うことで連続値に対しても応用を与えることが可能になった。 1988年にはRudolf LohnerがODEの初期値問題に対して信頼できる解を得るためにFORTRANに基づいたソフトウェアを開発した。 論文誌Reliable Computing (元々は Interval Computations)は1990年代以降に刊行され、コンピュータによる数値計算の信頼性に貢献した。この論文誌の編集者を務め、大域最適化の研究でも知られるR. Baker Kearfottは区間演算で用いられる表記と用語の統一に大きく貢献した。 なお近年の研究はフランスのINRIA傘下のCOPRINに集中している。 2015年6月に区間演算のための規格が改正された。2つの実装が無料で使える。これらは規格のワーキンググループの構成員たちによって作成された。この企画の一部はIEEE Std 1788.1-2017として2017年12月に改正され、2018年2月に公開された。これは実装の簡略化、高速化を助けるであろう 。 区間演算に関連する研究集会は世界中でいくつか行われている。代表的なのはSCAN（International Symposium on Scientific Computing, Computer Arithmetic, and Verified Numerical Computation）であり、他にはSWIM（Small Workshop on Interval Methods）、PPAM（International Conference on Parallel Processing and Applied Mathematics）、 REC（International Workshop on Reliable Engineering Computing）がある。 区間演算（九州大学の講義資料） (PDF) INTLAB MATLAB/GNU Octaveによる区間演算ライブラリ arb - GitHub JuliaIntervals - GitHub (Juliaによる区間演算ライブラリ) kv - GitHub (C++による区間演算ライブラリ) kv-日本語ページ LILIB (C++による多倍長区間演算ライブラリ) Interval and related software (区間演算ライブラリの一覧サイト) SWIM (Summer Workshop on Interval Methods) International Conference on Parallel Processing and Applied Mathematics