0.618法

image.png

  1. import java.util.*;
  2. public class Main {
  3. public static void main(String[] args) {
  4. // 左右边界,可自定义
  5. // eps 精度大小
  6. double a = -3, b = 5, eps = 0.2;
  7. double t = 0.618;
  8. double x2 = a + t * (b - a), x1 = a + b - x2;
  9. double fx1 = cal(x1), fx2 = cal(x2);
  10. while (b - a > eps) {
  11. if (fx1 >= fx2) {
  12. a = x1;
  13. x1 = x2;
  14. fx1 = fx2;
  15. x2 = a + b - x1;
  16. fx2 = cal(x2);
  17. } else {
  18. b = x2;
  19. x2 = x1;
  20. fx2 = fx1;
  21. x1 = a + b - x2;
  22. fx1 = cal(x1);
  23. }
  24. }
  25. System.out.println((a + b) / 2);
  26. }
  27. // 函数计算方法
  28. static double cal(double x) {
  29. return x * x + x * 2;
  30. }
  31. }

三大原则:

  • 去坏留好
  • 对称
  • 等比收缩

优缺点:
优点:不要求函数可微,且每次迭代只需要计算一个函数值,计算量小,程序简单
缺点:收敛速度慢