数値解析

出典: Wikipedio


画像:Ybc7289-bw.jpg
バビロニア粘土板 YBC 7289 (紀元前1800-1600年頃)
2の平方根の近似値は60進法で4桁、10進法では約6桁に相当する。1 + 24/60 + 51/602 + 10/603 = 1.41421296... [1]。(Image by Bill Casselman)

数値解析(すうちかいせき、Numerical Analysis)は、数学および物理学の一分野で、代数的に解を得ることが不可能な解析学上の問題を近似的に解く手法に関する学問。

史上最初の数学的記述の一つとして、バビロニア粘土板 YBC 7289 を挙げることができる。これは六十進法で <math>\sqrt{2}</math> (単位矩形の対角線の長さ)を数値的に近似したものである<ref>Photograph, illustration, and description of the root(2) tablet from the Yale Babylonian Collection</ref>。三角形の辺の長さを計算できること(そして、平方根を計算できること)は、特に建築において重要である。例えば、縦横それぞれ2メートルの正方形の壁の対角線は <math>\sqrt{8} \approx 2.83</math> メートルとなる<ref>ピタゴラスの定理によれば、各辺が2メートルの正方形の対角線の長さは <math>\sqrt{2^2+2^2}=\sqrt{8}</math> メートルとなる。</ref>。

数値解析は、このような実用的計算の長い伝統に続くものである。バビロニアの <math>\sqrt{2}</math> の近似のように、現代の数値解析も正確な解を求めようとするものではない。何故なら、正確な解を有限時間で求めることは不可能だからである。その代わりに、数値解析の多くは、ある程度の誤差の範囲内の近似解を求めようとする。

数値解析は自然科学および工学のあらゆる分野で応用され、21世紀に入ってからは生命科学や芸術にも科学技術計算が利用されるようになってきた。常微分方程式天体(惑星、恒星、小宇宙)の軌道の計算に登場する。資産管理には最適化が利用されている。数値線型代数はデータ解析に不可欠である。確率微分方程式マルコフ連鎖は、医学や生物学における生体細胞のシミュレーションの基本である。

コンピュータが発明される以前、数値的な手法は巨大な数表を使った手計算での内挿によるものが多かった。コンピュータの発達以降は数表が使われることはほとんどなくなり、コンピュータで必要な関数を必要な精度で計算できるようになった。内挿アルゴリズムは、微分方程式などを解く際に現在でも使用されている。

目次

概要

数値解析の目標は、難しい問題への近似解を与える技法の設計と解析である。この考え方を具体化するため、次のような問題と手法を挙げる。

  • 気象予報には、高度な数値計算手法が不可欠である。
  • ロケットの軌道を計算するためには、常微分方程式の高精度な数値解が必要となる。
  • 自動車会社は自動車事故での安全性を向上させるため、衝突のコンピュータシミュレーションを行っている。そのようなシミュレーションには、偏微分方程式の数値計算が不可欠である。
  • ヘッジファンドは様々な数値解析ツールを駆使し、他の市場参加者よりも正確に株やデリバティブの価値を計算しようとする。
  • 航空会社は、チケット価格設定、航空機や乗務員のスケジュール設定、燃料補給のスケジュール設定などに洗練された最適化アルゴリズムを利用する。この分野はオペレーションズ・リサーチとも呼ばれる。
  • 保険会社はアクチュアリー分析に数値解析プログラムを利用する。

歴史

数値解析は、コンピュータの発明以前から多くの国々で行われていた。線型補間は2000年以上前から行われている。ニュートン法ラグランジュ補間ガウスの消去法オイラー法などの名称からも分かるように、歴史上の偉大な数学者の多くは数値解析に夢中だった。

計算を手で行うため、方程式と数表を掲載した分厚い書籍が生み出された。例えば、関数の小数点以下16桁まで計算された数表を使って、与えられた方程式にその値を代入し、関数の正確な近似値を得ることができた。この分野での正統的な業績として、Abramowitz と Stegun が編集したNISTの書籍などを挙げることができる。これは1000ページを超えるもので、典型的な方程式や関数の数表を多数集めている。コンピュータが利用可能になると数表はあまり役に立たなくなったが、方程式を多数集めている点では有用である。

機械式計算機も計算ツールとして開発された。そのような計算機が1940年代に電子式コンピュータへと進化し、コンピュータは数値解析以外にも使えることが明らかとなっていった。しかし、コンピュータの発明は数値解析を目的としていたことは間違いなく、その後はさらに複雑な計算が行えるようになっている。

直接解法と反復解法

直接解法と反復解法

次の式を x について解くことを考える。

3x3+4=28
直接解法
  3x3 + 4 = 28
4を引く 3x3 = 24
3で割る x3 = 8
立方根を求める x = 2

反復解法では、f(x) = 3x3 + 4 に二分法を適用する。初期値として a = 0 と b = 3 を使うと、f(a) = 4、f(b) = 85 である。

反復解法
a b mid f(mid)
0 3 1.5 14.125
1.5 3 2.25 38.17...
1.5 2.25 1.875 23.77...
1.875 2.25 2.0625 30.32...

ここまでで、解は 1.875 と 2.0625 の間にあるとわかる。このアルゴリズムでは、誤差 0.2 未満でこの範囲にある任意の値を返す。

離散化と数値積分

2時間のレースで、自動車の速度を3回測定した結果が次表のようになっている。

時間  0:20 1:00 1:40
km/h  140  150  180 

離散化とは、この場合、0:00 から 0:40 までの自動車の速度が一定とみなし、同様に 0:40 から 1:20 までと、1:20 から 2:00 までも一定とみなすことである。すると、最初の40分の走行距離は約 (2/3h x 140 km/h)=93.3 km となる。したがって、全走行距離は 93.3 km + 100 km + 120 km = 313.3 km と見積もられる。これがリーマン和を使った一種の数値積分である(走行距離は速度の積分であるため)。

悪条件問題: 関数 f(x) = 1/(x − 1) を考える。f(1.1) = 10 で f(1.001) = 1000 である。x が 0.1 の範囲内で変化したとき、f(x) は約1000も変化する。この f(x) の x = 1 での評価は悪条件問題である。

良条件問題: 対照的に関数 <math>f(x)=\sqrt{x}</math> は連続であるため、その評価は良条件である。

直接解法は、問題の解を有限個のステップで計算する。その解は、演算精度が無限ならば正確である。例えば、線型方程式系を解くガウスの消去法QR分解線形計画問題シンプレックス法などがある。実際には有限な浮動小数点数が使われるため、得られる解は近似値となる。

これに対して反復解法は一定のステップ数で完了するとは限らない。ある初期予測値から開始して、反復的に計算を行って徐々に解に収束させていく。一般にこの場合、たとえ無限の精度で計算したとしても、有限回の反復では正確な解にたどり着くことはない。例として、ニュートン法二分法ヤコビ法などがある。数値線型代数の大規模な問題には、反復解法が一般に必要とされる。

数値解析では、反復解法が直接解法よりも一般的である。いくつかの手法は基本的には直接解法だが、GMRES法共役勾配法などのように、反復解法として使うことも多い。これらの技法では厳密解を得るために必要なステップ数が大きくなるため、反復解法として近似解を利用する。

離散化

さらに、連続問題を近似的に離散問題に変換して解くことも必要となる。この変換過程を「離散化(discretization)」という。例えば、微分方程式を解く場合が挙げられる。微分方程式を数値的に解くには、有限長のデータでなければならず、定義域が連続であっても、有限個の点を選んで値を計算する。

誤差の発生と伝播

誤差の研究は、数値解析の重要な一分野である。問題の解に誤差が入り込む原因はいくつかある。

丸め

全てのデジタルコンピュータのモデルである有限状態機械では、あらゆる実数を正確に表現するのは不可能であるため、丸め誤差が発生する。

打ち切り誤差と離散化誤差

打ち切り誤差は、反復解法で本来は無限に繰り返す反復を中途で打ち切ったときに発生する近似解と厳密解の差である。また、離散化近似を行って得た問題の解は元の連続問題の解とは正確に一致しない。このため、離散化によって離散化誤差が発生する。例えば右の欄にある <math>3x^3+4=28</math> を解く問題で、10回程度の反復では、解は約 1.99 となる。このとき打ち切り誤差は 0.01 である。

誤差が発生すると、計算を通じてそれが伝播していく。実際、電卓やコンピュータでの(浮動小数点数の)加算は正確ではない。そして、a+b+c+d+e のような計算はさらに不正確になっていく。

数値的安定性と良条件性

このような誤差の研究から数値的安定性の概念が生まれた。あるアルゴリズムが数値的に安定であるとは、誤差が発生したときに計算によってその誤差があまりにも大きくならないことを意味する。これは問題が良条件の場合のみ可能である。良条件とは、データが少しだけ変化したとき、解も少しだけ変化するような性質を持つことを意味する。逆に問題が悪条件であれば、データに含まれる誤差は大きく成長する。

しかし、良条件の問題を解くアルゴリズムは必ずしも数値的に安定とは言えない。数値解析の技術は、良条件の問題を解く安定なアルゴリズムを見つけるためにある。例えば、2の平方根(約 1.41421)の計算は良条件問題である。この問題を解く多くのアルゴリズムは、初期近似値 x1 から開始して <math>\sqrt{2}</math> になるべく近い値を求めようとする。つまり、x1=1.4 として、よりよい近似値を x2x3、…と計算していく。有名なアルゴリズムとしてバビロニアの平方根があり、この場合の式は xk+1 = xk/2 + 1/xk である。別の Method X では xk + 1 = (xk2−2)2 + xk という式を使う<ref>これは <math>x=(x^2-2)^2+x=f(x)</math> という方程式についての不動点反復法である。この方程式の解には <math>\sqrt{2}</math> もある。<math>f(x)\geq x</math> なので、反復は常に右方向に向かう。そのため、<math>x_1=1.4<\sqrt{2}</math> では収束するが、<math>x_1=1.42>\sqrt{2}</math> では発散する。</ref>。この2つのアルゴリズムについて、x1 = 1.4 と x1 = 1.42 の場合の反復結果の一部を以下に示す。

バビロニア バビロニア Method X Method X
x1 = 1.4 x1 = 1.42 x1 = 1.4 x1 = 1.42
x2 = 1.4142857... x2 = 1.41422535... x2 = 1.4016 x2 = 1.42026896
x3 = 1.414213564... x3 = 1.41421356242... x3 = 1.4028614... x3 = 1.42056...
... ...
x1000000 = 1.41421... x28 = 7280.2284...

見ての通り、バビロニアの平方根は初期値がどうであっても素早く収束するが、Method X は初期値が1.4の時は収束が遅く、1.42を初期値にすると発散する。したがって、バビロニアの平方根は数値的に安定だが、Method X は数値的に不安定である。

研究分野

数値解析は、解こうとしている問題によっていくつかの分野に分かれる。

関数の値の計算

補間: 気温の観測値が1:00には20℃、3:00には14℃だったとする。このデータを線型補間すると、2:00の気温は17℃、1:30の気温は18.5℃となる。

補外: ある国の国内総生産が毎年平均5%伸びていて、昨年の値が1000億ドルだったとする。ここで補外すると、今年は1050億ドルとなる。

回帰: 線型回帰では、n 個の点が与えられたとき、それら n 個の点のなるべく近くを通る直線を求める。

最適化: レモネード売りがレモネードを売っている。1杯1ドルでは、1日に197杯売れる。1杯あたり1セント値段を上げると、1日に売れるレモネードは1杯減る。1杯を1.485ドルにすると売り上げが最大となるが、1セント未満を使った値段は付けられないので、1.49ドルにすると一日の最大売り上げ 220.52 ドルが得られる。

微分方程式: ある部屋で一方からもう一方へ空気が流れるように100個の扇風機を配置し、羽根をそこに落としてみる。何が起きるだろうか? 羽根は空気の流れに従って漂うが、非常に複雑な動きになるかもしれない。その近似としては、羽根が漂っている付近の空気の速度を1秒おきに測定し、シミュレートされた羽根が1秒間は測定された方向にその速度で進むと仮定する。このような手法をオイラー法と呼び、常微分方程式を解くのに使われる。

最も単純な問題は、関数のある点での値を求めることである。単純に数式に値を代入する直接的な手法は、効率的でないこともある。多項式の場合、ホーナー法を使うことで乗算と加算の回数を減らすことができる。一般に、浮動小数点演算を使うことで生じる丸め誤差を予測して制御することが重要となる。

補間、補外、回帰

補間が役立つのは、ある未知の関数のいくつかの点の値があるとき、それら以外の中間点でのその関数の値を求める場合である。単純な手法としては線型補間があり、既知の点の間で関数が線型に変化するとみなすものである。これを一般化した多項式補間はもっと正確となることが多いが、ルンゲ現象に悩まされることもある。その他の補間手法としてはスプラインウェーブレットといった局所化関数を使うものがある。

補外は補間とよく似ているが、未知の関数の値が判っている点の外側の点について値を求めることをいう。

回帰も類似した手法だが、既存のデータが不正確であることを考慮する。いくつかの点とその値があり、それらデータが誤差を含みつつ何らかの関数に従っているとして、その未知の関数を決定する。このための手法として、最小二乗法がよく知られている。

方程式、方程式系の解

基本的な問題のひとつとして、与えられた方程式の解を計算する問題がある。その方程式が線型か否かによって手法が分類される。例えば、<math>2x+5=3</math> は線型だが、<math>2x^2+5=3</math> は線型ではない。

線型方程式系を解く手法については研究が進んでいる。標準的な直接解法としては何らかの行列分解を使うものがあり、ガウスの消去法LU分解対称行列エルミート行列に関するコレスキー分解、非正方行列に関するQR分解がある。反復解法としては、ヤコビ法ガウス=ザイデル法SOR法共役勾配法があり、大規模な方程式系でよく使われる。

非線型方程式には求根アルゴリズムが用いられる(根とは、関数がゼロとなる変数の値を意味する)。関数が可微分で導関数が分かっている場合には、ニュートン法が利用されることが多い。他にも線型化などの手法がある。

固有値と特異値

固有値分解特異値分解も重要な問題である。例えば、Spectral Image Compression<ref>The Singular Value Decomposition and Its Applications in Image Compression</ref> は特異値分解に基づいたアルゴリズムである。これに対応した統計学上のツールを主成分分析という。例えば、World Wide Web上での話題トップ100を自動的に抽出し、各Webページをどの話題に属するか分類するといった作業で使われる。

最適化問題

Template:Main 最適化問題は、与えられた関数が最大(または最小)になる点を問う問題である。多くの場合、解は何らかの制約条件を満たさなければならない。

最適化問題はさらに、関数や制約の形式によっていくつかに分類される。例えば、線形計画問題は関数と制約が共に線型である場合を扱う。線形計画問題の主な解法として、シンプレックス法などを挙げることができる。

ラグランジュの未定乗数法は、制約条件のある最適化問題を制約のない問題に変換するために用いられる。

積分

数値積分(数値的求積法)は、定積分の値を求めるものである。一般的手法としては、ニュートン・コーツの公式を使った手法(中点法やシンプソンの公式)やガウスの求積法などがある。これらは分割統治戦略に基づくもので、大きな集合についての積分を小さな集合の積分に分割して値を求める。高次元になるとこれらの手法は計算の手間が膨大となるため、モンテカルロ法などの手法が使われる。

微分方程式

数値解析では、微分方程式(常微分方程式や偏微分方程式)を(近似的に)解く問題も扱う。

偏微分方程式を解くには、まず方程式を離散化し、有限次元の部分空間で計算を行う。そのような手法として、有限要素法差分法、特に工学分野で使われる有限体積法などを挙げることができる。これらの手法は関数解析学の定理などに基づいている。これによって、問題を代数方程式の求根に還元することができる。

主な手法

ソフトウェア

Template:Main 20世紀後半以降、多くのアルゴリズムはコンピュータ上で実装され、実行されてきた。Netlib には数値解析用の各種ルーチンがあり、その多くはFORTRANC言語で書かれている。各種数値解析アルゴリズムを実装した商用製品としては IMSLNAG がある。フリーなものとしては GNU Scientific Library がある。

MATLABは数値計算用の商用プログラミング言語として有名だが、他にも商用ではSASSPSSS-PLUSIDL などがある。

フリーソフトとして、「MATLAB」と互換性の高い ScilabGNU OctaveFreeMat、「S言語」や「S-PLUS」の言語仕様に準じるR言語、SPSS の代替を目指す PSPPgretl、そのほかIT++(C++ライブラリ)、Pythonの派生品 (SciPyNumPy) など、様々な数値解析ソフトウェアが使われている。

性能も様々で、ベクトルや行列の演算は一般に高速だが、スカラーのループは10倍以上の差があるものもある。<ref>Speed comparison of various number crunching packages</ref>

MathematicaMaple のような数式処理システムの多くは数値解析にも使える。Sage は数値解析と数式処理の両方を備えた統合システムである。また、簡単な問題なら表計算ソフトでも解くことが可能である。

関連項目

脚注

Template:Reflist

参考文献

  • Trefethen, Lloyd N. (2006). "Numerical analysis", 20 pages. To appear in: Timothy Gowers and June Barrow-Green (editors), Princeton Companion of Mathematics, Princeton University Press.

外部リンク

Template:Spedia

Template:数学af:Numeriese analise ar:تحليل عددي cs:Numerická matematika da:Numerisk analyse de:Numerische Mathematik en:Numerical analysis eo:Cifereca analitiko es:Análisis numérico fa:آنالیز عددی fi:Numeerinen analyysi fr:Analyse numérique he:אנליזה נומרית hi:आंकिक विश्लेषण hu:Newton-módszer it:Analisi numerica ka:რიცხვითი ანალიზი ko:수치 해석 nl:Numerieke wiskunde pl:Analiza numeryczna pt:Análise numérica ro:Analiză numerică ru:Вычислительная математика sr:Нумеричка анализа su:Analisis numeris sv:Beräkningsvetenskap uk:Обчислювальна математика zh:数值分析

個人用ツール