#/*********************************************************** # fibonacc.rb -- Fibonacci (フィボナッチ) 探索 #***********************************************************/ def fibonacci( a, b, tolerance, f ) if (a > b); t = a; a = b; b = t; end ia = (b - a) / tolerance ic = 1; id = 2; ib = 3 while (ib < ia); ic = id; id = ib; ib = ic + id; end ia = 0; tolerance = (b - a) / ib.to_f fc = f.call(a + ic * tolerance); fd = f.call(a + id * tolerance) while (true) if (fc > fd) ia = ic; ic = id; id = ib - (ic - ia) if (ic == id); return a + id * tolerance; end fc = fd; fd = f.call(a + id * tolerance) else ib = id; id = ic; ic = ia + (ib - id) if (ic == id); return a + ic * tolerance; end fd = fc; fc = f.call(a + ic * tolerance) end end end $count = 0 $xmin = 0.314 func = Proc.new do |x| value = (x - $xmin) * (x - $xmin) $count += 1 printf("%4d: f(%g) = %g\n", $count, x, value) value end printf("x = %g\n", fibonacci(0, 1, 1e-6, func)) exit 0