二分法は方程式 f(x)=0 の解を求める計算法です。f(x0) < 0 、f(x1) > 0 なる値x0,x1がわかっていることが必要になります。
program bisectin(input,output); const xneg0 = 0.0; xpos0 = 2.0; eps = 1.0e-11; var xneg, xpos, xmid : real; i : integer; begin i := 0; xneg := xneg0; xpos := xpos0; while abs(xneg - xpos) > eps do begin i := i + 1; xmid := (xpos + xneg)/2.0; if (xmid * xmid * xmid - 2) > 0 then xpos := xmid else xneg := xmid end; writeln('x = ', xneg); writeln('i = ', i) end.
このプログラムの停止性は、xnegとxposの差の絶対値が必ず小さくなっていることからわかる。
実行結果
sino% ./bisection x = 1.2599210498884E+0000 i = 38
ニュートン法は、方程式f(x)=0を解く計算法である。
方程式f(x)=0を解くこととします。このとき関数fの導関数をf'とします。適切な初期値 x = x0 を選択して、次の関係式
f(xn) xn+1 = xn - ----- f'(xn)
によりx0,x1,x2,x3,x4,...を次々に求めていきます。そうするとこの数列が方程式の解に近づいていきます。
2の立方根を求めるためには
f(x) = x3 - 2
f'(x) = 3x2
とすればよく、
xn+1 = (2/3)(xn + (1/xn2))
によりxn を求めていけばよい。
program newton(input,output); const eps = 1.0e-11; var x, x1 : real; i : integer; begin x := 1.0; i := 0; repeat i := i + 1; x1 := x; x := (2.0/3.0) * (x1 + 1.0/sqr(x1)) until abs(x - x1) < eps; writeln('x = ', x); writeln('i = ', i) end.
sino% pc newton.p sino% ./newton x = 1.2599210498949E+0000 i = 6
このプログラムの停止性は数学的な議論しないとわからない。
ここでrepeat文の説明をする。
repeat <文> ; ... ; <文> until <論理式>
意味は、次の通り。
1.<文>を左から順番に実行する。
2.<論理式>を計算する。計算結果がtrueならば終了。そうでなければ、1に戻る。