【本メモ】数値計算の常識

数値計算の常識
https://amzn.asia/d/gyGy5RB


生成AIが発展して,容易にシミュレーションができるようになったからこそ,
今一度,この常識を振り返る.

数値計算に手を触れたことがある人はぜひ読んだ方がいい。ただ、数値計算をしたことがない人は勉強のためにいきなりこの本に触れると何のことかわからないと思うので、実際に他の本で演習してみるのが良いと思われる。その後に、この本を一読、参考にするのをお勧めする。演習するのがいい。

計算がうまくいかなくなった時には立ち返ろう.特にpythonなどでは,キャスト指定しないと,変数型が自動で決まるから要注意だ.

この本の情報は、1985年のものだから古い。
しかし、基本中の基本であるから、この本を抑えておいた上で、最新の情報を見るとすんなり入ると思う。あとは、ライブラリの使い方を知る上でも重要。


第1章:数の表現と誤差
コンピュータ内では2進数が使われる.
これによる誤差を扱う.
0.1の和による誤差の蓄積が良い例.
それらの誤差は和差の演算で増幅する.

第2章:桁落ちに気をつけよう(その1)
表現できる桁数のギリギリまで絶対値がごく小さくなった
値同士の和差演算が入ると,その分だけ精度が落ちる.
「丸め誤差」という.

例えば,有効数字5桁の計算において,
1-1/sqrt{1 + x}
( \sqrt{1+x}-1 ) / \sqrt{1+x}
といった,絶対値がごく近い2数を足したり,引いたりする演算が入って,
その結果がごく小さい値になると,有効数字が減ってしまう.
これが「桁落ち」である.

先の式なら,有理化して,
x/(1+x+\sqrt{1+x})
にすると,ごく小さい値になることは回避できて,
計算結果も有効数字5桁のまま保たれる.

・三角関数では,倍角・半角の公式
・2次方程式の解の公式(符号によって結果が微小にならない方を使い分ける)
(ただし,重根に近い解ではこの桁落ちは回避不可能.m重根は有効数字が1/m倍に落ちる)

第3章:桁落ちに気をつけよう(その2)
・f(x) = 0を解く際の桁落ち
・数値積分での桁落ち
・統計データの分散計算における桁落ち
改善策の提案は,倍精度,補助変数,2分木法が提案されているが,
おそらく最近のライブラリなら,これが自然と適用されているものが多いはず.
(使う際にはチェックしておこう.)

第4章:たった1回だけの計算なんて・・・
数値計算には誤差がつきもの,できれば,別の方法でも試すとか,
2回以上の計算(刻み幅の異なる計算)を行なって,比べてみること.
(多くの場合には,先行研究,先行計算との比較をする.)

手法によって,どのくらいの誤差が含まれるかわかるので,これを利用する.

例えば,数値積分の計算では,
2回以上異なる刻み幅で計算した後に,その差分から,
・計算の正確な誤差が見積もれる.
・計算手法が正しく実装されているかのチェックができる.
・複数の刻み幅を使った計算結果を用いたフィッティングができる.(エイトケン,Aitkenの方法)
(2回以上の計算を行うことの重要性である.)

丸め誤差については,単精度,倍精度,4倍精度などで計算してみる.
—>その結果の桁落ちはほぼ同じになっているだろうか?
ほぼ同じなら,現在の計算方法での丸め誤差の桁数の見当がついたことになる.

第5章:逆行列よさようなら
逆行列は使わない
LU分解を使う
Gauss-Jordan, Gauss-Seidel, SOR法など必要に応じて使うこともある

第6章:単位と次元
無次元化してから計算すること.

第7章:数値積分法—台形公式を使いこなすには
変数変換など駆使するといい
より良い方法が最近はありそうなので、その都度調べるのが良さそう。

第8章:数値微分法—打ち切り誤差と丸め誤差の闘い
このタイトル通りに
打ち切り誤差は刻み幅を小さくするほど、小さくなるが
小さくすると、丸め誤差の影響が出る。

刻み幅は有効数字の1/3桁に選ぶといい
結果の有効数字は、有効数字の2/3桁になる
(これはオイラー法の中心差分の場合か?)

第9章: Newton(Newton-Raphson)法
f(x) = 0 を解くのに使う
著者は計算の収束条件、|x^{\nu+1}-x^{\nu}|<\epsilonは納得しない、適当な要求精度を\epsilonで与えるとは、どう決めるというのだと主張する。
一方で、丸め誤差などの計算誤差の大体の大きさ\deltaという、ごく小さい量を使って、
|f(x^{\nu})|<\delta
を条件とすることを推奨する。

Newton法は微分の逆行列を使う。
ここで、LU分解を使うのが便利。

第10章:複素数の計算
極座標表示についてがメイン。
根号はなるべく外す。
根号計算する際には根号の中身はなるべく小さく。

・加減算(addition and subtraction)
・乗算(multiplication)
・徐算(division)、工夫があるといい
・共役数(conjugate)

第11章: 代数方程式
Newton法をマスターしよう。
複素数で解く。
ホーナー則、Horner則を使う。
誤差の許容範囲に注意。

代数方程式p(z)=0の計算において、収束条件|p(z^{\nu})|<\deltaはzに依存する。
\delta=nu max_{i}|a_{i}z^{n-i}|
nは代数方程式の次数、u=\beta^{-(s-1)}, \betaは進数、sは仮数部桁数

組立除法を使う
解は絶対値が小さいものから順に求め、組立除法で次数を減らすと良い。

いいなと思ったら応援しよう!