# 黄金分割法による極値の探索 awk ' BEGIN { print find_min(0, 1) exit 0 } # 区間 a <= x <= b で meas(x) の極小値を探す function find_min(a, b, c, d, fc, fd, i, r) { r = (sqrt(5.0) - 1.0) * 0.5 # golden ratio c = r * a + (1.0 - r) * b; d = (1.0 - r) * a + r * b; fc = meas(c) fd = meas(d) for (i = 0; ((d - c) / (c + d) > eps) && i < 100; i++) { if ((b - a) / (a + b) <= 5e-3) break # 誤差 0.5 % 以内に追い込んで終り # if (fc > fd) { # 極大値を探す場合 if (fc < fd) { # 極小値を探す場合 b = d d = c fd = fc c = r * a + (1.0 - r) * b; fc = meas(c) } else { a = c c = d; fc = fd d = (1.0 - r) * a + r * b; fd = meas(d) } } if (i == 100) print "Warning: find_min() retry over." >/dev/stderr if (fc < fd) return (c + r*a + (1.0 - r)*b) * 0.5 return (d + (1.0 - r)*a + r*b) * 0.5 } # 変数 x に対する測定値 function meas(x) { return (x - 0.8)^2 } '