割線法の実装

先週同様、数値計算な講義中にOCamlでの実装を書いた。

# let secant f x1 x2 stop =
  let delta xn1 xn2 = (f xn2) *. (xn2 -. xn1) /. ((f xn2) -. (f xn1)) in
  let stopcond = stop f delta in
  let rec iter xn1 xn2 = if (stopcond xn1 xn2) then xn2 else (iter xn2 (delta xn1 xn2)) in
  iter x1 x2;;
val secant :
  (float -> float) ->
  float ->
  float ->
  ((float -> float) -> (float -> float -> float) -> float -> float -> bool) ->
  float = <fun>
# secant (fun x -> x *. x -. 1.0) 0.0 2.0 (fun f delta x1 x2 -> (abs_float (delta x1 x2)) < 0.00001);;
- : float = 0.99999855887482747

やあ、なんだかこういうのは自然に書けていいかも。

test