2004年度・数理解析・計算機数学2・第3回 1
● 前回の講義のまとめ
• 数値を浮動小数点数として格納する場合や, 浮動小数点数の演算には, 一般に誤差がありうる. その 誤差は浮動小数点数の「体系」によって定まり,一般には以下の評価式が成り立つ.
– 実際の数値x∈Rを浮動小数点数として格納した値xは
|x−x| ≤δ|x|
が成り立つ.
– 浮動小数点数の四則演算(の一つ)を ·であらわすとき, 浮動小数点数x,y の演算結果 xy と真の値x·y の間には
|(x·y)−(xy)| ≤δ|x·y|
が成り立つ.
いずれの場合も,「誤差」は真の値との相対誤差として評価される. (この「誤差評価式」が成り立 つためには,「減算」に関しては「1桁の保護桁」が必要となる.
• 上記の最大相対誤差δは, IEEE 784浮動小数点数の体系では,その「丸めモード」が「四捨五入」の 時には次の値を持つ.
– 「単精度浮動小数点数」のとき,δ= 2−24, – 「倍精度浮動小数点数」のとき,δ= 2−53.
• 数列 an = (1 + 1/n)n に対して, e = limn→∞an の値を求めるために, 十分大きな n に対して
(1 + 1/n)n を浮動小数点計算を用いて計算しようと考ると,最終的に以下の結果を得た.
(1 + 1/n)n−e∼e
1
2n−1+nδ
+O(n−2) +O(δ2).
したがって,期待できる計算精度は,n∼(1/√
2δ)のとき,
|(1 + 1/n)n−e| ≤e
δ/2≤3 δ/2 程度となる.
● 講義資料
【ニュートン法を用いて x2−2 = 0 の解を求めたときの誤差のグラフ】
1e-12 1e-10 1e-08 1e-06 0.0001 0.01 1
0 0.5 1 1.5 2 2.5 3 3.5 4
"newton_sqrt2.txt"
ex03.tex,v 1.10 2004-10-17 17:33:37+09 naito Exp naito
2 2004年度・数理解析・計算機数学2・第3回
【関数へのポインタ】 C言語では,変数を指し示すポインタを用いるのと同様に, 関数さえもポインタで 指し示すことができる.
/* $Id: ex03-1.c,v 1.2 2004-10-18 11:57:49+09 naito Exp $ */
#include <stdio.h>
double newton_sqrt_2(double) ;
int main(int argc, char **argv) {
int i ;
double x0, x1, d ;
double (*approx)(double) ;
approx = newton_sqrt_2 ; x0 = 2.0 ;
for(i=0;i<10;i++) { x1 = approx(x0) ; x0 = x1 ;
printf("%.16f\n",x1) ; }
return 0 ; }
double newton_sqrt_2(double x) {
return x/2.0 + 1.0/x ; }
このプログラムは√
2を求めるために,「逐次近似」として「ニュートン法」を用いて10回の繰り 返しを行うものであるが, 「逐次近似」を行う関数を“approx”というdouble 型の戻り値を持ち, double型の引数をただひとつだけもつ関数へのポインタを利用している. (main関数内の double (*approx)(double)でそのポインタを定義している.)代入文“approx = newton_sqrt_2”によっ て,そのポインタに, 関数“newton_sqrt_2”を代入している.
この例では,逐次近似の関数を用意し,関数へのポインタにその関数を代入するだけで,異った「逐次 近似」に変更することができる.
● 実習内容
以下では, 近似値の計算において, 第 n 回目の計算で得られた近似値を xn, 真の値を x∞, その誤差を εn=|xn−x∞|とおく.
1. 「区間分割法」を用いて √
2の値を絶対誤差10−6で求めなさい.
2. 「区間分割法」を用いて x3−2 = 0の解の値を絶対誤差10−6で求めなさい.
ex03.tex,v 1.10 2004-10-17 17:33:37+09 naito Exp naito
2004年度・数理解析・計算機数学2・第3回 3 3. 「ニュートン法」を用いて√
2の値を相対誤差10−7で求めなさい. そのとき得られた値と√ 2の真 の値との絶対誤差はどの程度となるかを評価しなさい.
4. 「ニュートン法」を用いて√
2の値を求めるとき,εn をグラフであらわしなさい. (上記のグラフを 参照)
5. k= 2,3, . . .に対して,「ニュートン法」をf(x) = (x−1)k に対して適用し, f(x) = 0 の解の近似 値を求めるとき,εn をグラフであらわしなさい. また,上の問題とこの問題で得られたグラフをみて, どのような知見が得られるかを議論しなさい.
6. 逐次近似xn+1 =f(xn)を f(x) = (2x)1/3, f(x) = (2/x)1/2, f(x) =x4/2 に対して適用し, 収束す る場合にはεn をグラフであらわしなさい.
7. 「ニュートン法」を用いて, 浮動小数点数xの逆数1/x(の近似値)を除算なしで求める方法を考 察しなさい.
8. 複素関数 f(z) =z2+ 1,f(z) =z3+ 1に対して「ニュートン法」を適用し,f(z) = 0の解を求めな さい.
9. f(x) = 0の解がm重根(m≥2)であるような関数に「ニュートン法」を適用したとき,εn は
εn+1≤ m m−1εn
をみたすことを証明しなさい.
10. 「ニュートン法」でf を計算するところを「微分商」に置き換えたものを割線法と呼ぶ. すなわち, xn+1=xn−f(xn) xn−xn−1
f(xn)−f(xn−1)
によって f(x) = 0の解を求める.
f がニュートン法での近似計算が収束するときと同じ条件をみたすときには,割線法による近似計算 も収束することを証明し, その誤差は, あるL >0が存在して,
εn+1≤Lεnεn−1, εn+1≤εpn, p= 1 +√ 5 2 をみたすことを証明しなさい.
11. 電子メールで「今日の講義の感想や意見」を送ってください.
ex03.tex,v 1.10 2004-10-17 17:33:37+09 naito Exp naito