Guest User

Untitled

a guest
Jul 10th, 2018
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 2.81 KB | None | 0 0
  1. function [ min_x, min_y ] = minimize( f, a, b, optset )
  2. %поиск минимума методом квадратичной аппроксимации
  3. % с переходом на золотое сечение при недостаточной скорости сходимости
  4. %
  5. % os = optimset('TolX', 0.001)
  6.  
  7. if nargin < 4
  8.     optset = optimset('TolX', 0.001);
  9. end;
  10.  
  11. ratio = (sqrt(5.0) - 1.0) / 2.0;
  12.  
  13. eps = optset.TolX;
  14.  
  15. x1 = a;
  16. x3 = b;
  17.  
  18. x2 = (a+b)/2;
  19.  
  20.     function x0 = find_parabola_x0(x1, x2, x3, f1, f2, f3)
  21.         s12 = x1-x2; s23 = x2-x3; s31 = x3-x1;
  22.         r12 = x1^2-x2^2; r23 = x2^2-x3^2; r31 = x3^2-x1^2;
  23.        
  24.         b_ = f1*r23 + f2*r31 + f3*r12;
  25.         a_ = f1*s23 + f2*s31 + f3*s12;
  26.        
  27.         x0 = b_/(2*a_);
  28.     end
  29.    
  30. f1 = f(x1);
  31. f2 = f(x2);
  32. f3 = f(x3);
  33.  
  34. iter_no = 0;
  35.  
  36. while true
  37.     iter_no = iter_no + 1;
  38.     fprintf('[%d] x1 = %f, x2 = %f, x3 = %f\n', iter_no, x1, x2, x3);
  39.     fprintf('[%d] f1 = %f, f2 = %f, f3 = %f\n', iter_no, f1, f2, f3);
  40.     x0 = find_parabola_x0(x1,x2,x3, f1,f2,f3);
  41.     f0 = f(x0);
  42.     fprintf('x0 = %f\n', x0);
  43.    
  44.     old_x1 = x1; old_x3 = x3;
  45.     old_f1 = f1; old_f3 = f3;
  46.    
  47.     if x0 >= x2 && x0 <= x3 % x1 x2 x0 x3
  48.         if f0 > f2
  49.             speed = (x0-x1)/(x3-x1);
  50.             x3 = x0; f3 = f0;
  51.             fprintf('case b - right');
  52.         else
  53.             speed = (x3-x2)/(x3-x1);
  54.             x1 = x2; f1 = f2;
  55.             x2 = x0; f2 = f0;
  56.             fprintf('case a - right');
  57.         end;
  58.     elseif x0 >= x1 && x0 <= x2 % x1 x0 x2 x3
  59.         if f0 > f2
  60.             speed = (x3-x0)/(x3-x1);
  61.             x1 = x0; f1 = f0;
  62.             fprintf('case d - left');
  63.         else
  64.             speed = (x2-x1)/(x3-x1);
  65.             x3 = x2; f3 = f2;
  66.             x2 = x0; f2 = f0;
  67.             fprintf('case c - left');
  68.         end
  69.     else
  70.         fprintf('вершина за границами отрезка!221111\n');
  71.     end;
  72.    
  73.     fprintf('; speed %f\n', speed);
  74.    
  75.     if speed > ratio
  76.         % параболы недостаточно быстро уменьшают отрезок
  77.         fprintf('one golden section step\n');
  78.         % применяем метод золотого сечения на отрезке x1..x3
  79.         x1 = old_x1; x3 = old_x3;
  80.         f1 = old_f1; f3 = old_f3;
  81.        
  82.         gs_x1 = x3 - (x3-x1)*ratio;
  83.         gs_x2 = x1 + (x3-x1)*ratio;
  84.         fgs_x1 = f(gx_x1);
  85.         fgs_x2 = f(gs_x2);
  86.         if fgs_x1 <= fgs_x2
  87.             x3 = gs_x2;
  88.             f3 = fgs_x2;
  89.             x2 = gs_x1;
  90.             f2 = fgs_x1;
  91.         else
  92.             x1 = gs_x1;
  93.             f1 = fgs_x1;
  94.             x2 = gs_x2;
  95.             f2 = fgs_x2;
  96.         end;
  97.     end;
  98.    
  99.     if (x3-x1) < eps
  100.         break;
  101.     end;
  102. end;
  103.  
  104. min_x = x2;
  105. min_y = f2;
  106.  
  107.  
  108.  
  109. end
Add Comment
Please, Sign In to add comment