Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 12.59 KB | None | 0 0
  1.  
  2. global c;
  3. c = 0;
  4. uslov_grad
  5. c
  6. function value = F(x, y)
  7.     value = (conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i);
  8. end
  9.  
  10. function value = Res_1(x, y)
  11.     value = (x-5.3)^2+(y+0.9)^2-2.7^2; % ограничение1, внутренность окружности R = 2.7, центр в (5.3, -0.9) = (2*R, -R/3)
  12. end
  13. function value = Res_2(x, y) % ограничение2, верхняя часть круга
  14.     value = -y-0.9;
  15. end
  16.  
  17. function value = M2_F_and_Con(r, x, y)
  18.     value = (conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i) + r*((max(0, Res_1(x,y)))^2 + max(0, Res_2(x,y))^2);
  19. end
  20.  
  21. function value = M1_F_and_Con(r, x, y)
  22.     value = (conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i) + r*((max(0, Res_1(x,y)))^2 + max(0, Res_2(x,y))^2);
  23. end
  24.  
  25. function d = M1_Der_x(r, x, y) % производная вспомогательной функции F = f*f_сопр - r*(1/Res_1+1/Res_2) по х
  26.     d = (x*(8 + 36i) - y*(36 - 8i) + (x + y*1i)^2*(30 + 30i) + 21 + 10i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) + (conj(x)*(8 - 36i) - conj(y)*(36 + 8i) + (conj(x) - conj(y)*1i)^2*(30 - 30i) + (21 - 10i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i) + (r*(2*x - 53/5))/((x - 53/10)^2 + (y + 9/10)^2 - 729/100)^2;
  27. end
  28.  
  29. function d = M1_Der_y(r, x, y) % производная вспомогательной функции F = f*f_сопр - r*(1/Res_1+1/Res_2) по y
  30.     d =  -(x*(36 - 8i) + y*(8 + 36i) + (x + y*1i)^2*(30 - 30i) + 10 - 21i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) - r*(1/(y + 9/10)^2 - (2*y + 9/5)/((x - 53/10)^2 + (y + 9/10)^2 - 729/100)^2) - (conj(x)*(36 + 8i) + conj(y)*(8 - 36i) + (conj(x) - conj(y)*1i)^2*(30 + 30i) + (10 + 21i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i);
  31. end
  32.  
  33. function d = M2_Der_x(r, x, y) % производная вспомогательной функции F = f*f_сопр + r/2*(max(0,Res_1)^2+max(0,Res_2)^2) по х
  34.     d = (x*(8 + 36i) - y*(36 - 8i) + (x + y*1i)^2*(30 + 30i) + 21 + 10i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) + (conj(x)*(8 - 36i) - conj(y)*(36 + 8i) + (conj(x) - conj(y)*1i)^2*(30 - 30i) + (21 - 10i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i) + r*((2*x - 53/5)*max(0, Res_1(x,y)));
  35. end
  36.  
  37. function d = M2_Der_y(r, x, y) % производная вспомогательной функции F = f*f_сопр + r/2*(max(0,Res_1)^2+max(0,Res_2)^2) по y
  38.     d = -(x*(36 - 8i) + y*(8 + 36i) + (x + y*1i)^2*(30 - 30i) + 10 - 21i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) - (conj(x)*(36 + 8i) + conj(y)*(8 - 36i) + (conj(x) - conj(y)*1i)^2*(30 + 30i) + (10 + 21i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i) + r*((2*y + 9/5)  - max(0, Res_2(x,y)));
  39. end
  40.  
  41. function d = M3_DerF_x(x, y) % производная целевой функции по х
  42.     global c;
  43.     d = (x*(8 + 36i) - y*(36 - 8i) + (x + y*1i)^2*(30 + 30i) + 21 + 10i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) + (conj(x)*(8 - 36i) - conj(y)*(36 + 8i) + (conj(x) - conj(y)*1i)^2*(30 - 30i) + (21 - 10i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i);
  44.     c = c + 1;
  45. end
  46.  
  47. function d = M3_DerF_y(x, y) % производная целевой функции по х
  48.     global c;
  49.     d = -(x*(36 - 8i) + y*(8 + 36i) + (x + y*1i)^2*(30 - 30i) + 10 - 21i)*(conj(x)*(21 - 10i) - conj(y)*(10 + 21i) + (conj(x) - conj(y)*1i)^2*(4 - 18i) + (conj(x) - conj(y)*1i)^3*(10 - 10i) + (17 - 12i)) - (conj(x)*(36 + 8i) + conj(y)*(8 - 36i) + (conj(x) - conj(y)*1i)^2*(30 + 30i) + (10 + 21i))*(x*(21 + 10i) - y*(10 - 21i) + (x + y*1i)^2*(4 + 18i) + (x + y*1i)^3*(10 + 10i) + 17 + 12i);
  50.     c = c + 1;
  51. end
  52.  
  53. function d = M3_DerG1_x(x,y)
  54.     global c;
  55.     c = c + 1;
  56.     d = 2*x - 53/5;
  57. end
  58.  
  59. function d = M3_DerG1_y(x,y)
  60.     global c;
  61.     c = c + 1;
  62.     d = 2*y + 9/5;
  63. end
  64.  
  65. function d = M3_DerG2_x(x,y)
  66.     d = 0;
  67. end
  68.  
  69. function d = M3_DerG2_y(x,y)
  70.     d = -1;
  71. end
  72.  
  73.  
  74. function bool = is_in_trust_region(x, y)  % проверка на принадлежность допустимому множеству
  75.     if Res_1(x, y) <= 0 && Res_2(x,y) <= 0
  76.         bool = 1;
  77.     else
  78.         bool = 0;
  79.     end
  80. end
  81.  
  82. function value = my_F1
  83.     syms x y
  84.     f(x, y) = (10+10*1i)*(x+y*1i).^3+(4+18*1i)*(x+y*1i).^2+(21+10*1i)*(x+y*1i)+(17+12*1i);
  85.     Fun(x, y) = f*conj(f) +r*(1/Res_1(x, y) + 1/Res_2(x, y));
  86.     dx = diff(Fun, x)
  87.     dy = diff(Fun, y)
  88.  
  89. end
  90. function my_F2
  91.     syms x y
  92.     f(x, y) = (10+10*1i)*(x+y*1i).^3+(4+18*1i)*(x+y*1i).^2+(21+10*1i)*(x+y*1i)+(17+12*1i);
  93.     Fun(x,y) = f*conj(f);
  94.     dRes_1(x, y) = (x-5.3)^2+(y+0.9)^2-2.7^2;
  95.     dRes_2(x, y) = -y-0.9;
  96.     dx = diff(dRes_1, x)
  97.     dy = diff(dRes_1, y)
  98. end
  99. function arg_min = ConstStep(poly, begin_dot)
  100. c = 0;
  101. j = begin_dot; % x_k+1
  102. alfa = 0.0001;
  103. while true
  104.     c = c + 1;
  105.     k = j;     % x_k
  106.     j = j - alfa*Grad(Fun(j, poly), DFun(j, poly)); %x_k+1
  107.     value_j =  Fun(j, poly);
  108.     value_k =  Fun(k, poly);
  109.     if abs(Grad(Fun(j, poly), DFun(j, poly))) < 10^-4
  110.         break;
  111.     end
  112. end
  113. arg_min = j;
  114. end
  115. function min = project1(dot1, dot2, alfa)  
  116.     x = dot1;
  117.     y = dot2;
  118.     while true
  119.         grad_fx = M3_DerF_x(x,y);
  120.         grad_fy = M3_DerF_y(x,y);
  121.         grad_gx = M3_DerG1_x(x,y);
  122.         grad_gy = M3_DerG1_y(x,y);
  123.         x = x + alfa*(-grad_fx-(-grad_fx*grad_gx - grad_fy*grad_gy)/norm([grad_gx grad_gy])^2*grad_gx);
  124.         y = y + alfa*(-grad_fy-(-grad_fx*grad_gx - grad_fy*grad_gy)/norm([grad_gx grad_gy])^2*grad_gy);
  125.         if abs(-grad_fx*grad_gx - grad_fy*grad_gy - norm([grad_fx grad_fy])*norm([grad_gx grad_gy])) <= 10^-4 %условие коллинеарности
  126.             break;
  127.         end
  128.     end
  129.     min = [x y];
  130. end
  131.  
  132. function min = project2(dot1, dot2, alfa)
  133.     x = dot1;
  134.     y = dot2;
  135.     while true
  136.         grad_fx = M3_DerF_x(x,y);
  137.         grad_fy = M3_DerF_y(x,y);
  138.         grad_gx = M3_DerG2_x(x,y);
  139.         grad_gy = M3_DerG2_y(x,y);
  140.         x = x + alfa*(-grad_fx-(-grad_fx*grad_gx - grad_fy*grad_gy)/norm([grad_gx grad_gy])^2*grad_gx);
  141.         y = y + alfa*(-grad_fy-(-grad_fx*grad_gx - grad_fy*grad_gy)/norm([grad_gx grad_gy])^2*grad_gy);
  142.         if abs(-grad_fx*grad_gx - grad_fy*grad_gy - norm([grad_fx grad_fy])*norm([grad_gx grad_gy])) <= 10^-4 %условие коллинеарности
  143.             break;
  144.         end
  145.     end
  146.     min = [x y];
  147. end
  148.  
  149. function min = shtraf %МЕТОД ВНУТРЕННИХ В АББАСОВЕ (Метод штрафных функций machinelearning)
  150. x = 6; y = 1.5;
  151. r = 10;
  152. alfa = 10^-4;
  153. c = 1;
  154. xtrace = [x];
  155. ytrace = [y];
  156. while true
  157.     while true
  158.         c = c + 1;
  159.         dx = M1_Der_x(r, x, y);
  160.         dy = M1_Der_y(r, x, y);
  161.         x_t = x; y_t = y;
  162.         x = x - alfa*dx;
  163.         y = y - alfa*dy;
  164.         xtrace(c) = x;
  165.         ytrace(c) = y;
  166.         if is_in_trust_region(x, y) == 0
  167.             x = x_t; y = y_t;
  168.             alfa = alfa / 5;
  169.         end
  170.         if abs(x-x_t) <= 10^-2 && abs(y-y_t) <= 10^-2
  171.             break;
  172.         end
  173.     end
  174. if abs(-r*(1/Res_1(x,y) + 1/Res_2(x,y))) <= 10^-3
  175.     break
  176. end
  177.     r = r / 5;
  178. end
  179. grad_fx = M3_DerF_x(x,y);
  180. grad_fy = M3_DerF_y(x,y);
  181. grad_gx = M3_DerG1_x(x,y);
  182. grad_gy = M3_DerG1_y(x,y);
  183. xt = x; yt = y;
  184. x = x - grad_fx*Res_1(xt, yt)/(grad_fx*grad_gx + grad_fy*grad_gy);
  185. y = y - grad_fy*Res_1(xt, yt)/(grad_fx*grad_gx + grad_fy*grad_gy);
  186.  
  187. % x = -5:0.1:6;
  188. % y = -5:0.1:6;
  189. % [X, Y] = meshgrid(x, y);
  190. % Z = (conj(X)*(21 - 10i) - conj(Y)*(10 + 21i) + (conj(X) - conj(Y)*1i)^2*(4 - 18i) + (conj(X) - conj(Y)*1i)^3*(10 - 10i) + (17 - 12i))*(X*(21 + 10i) - Y*(10 - 21i) + (X + Y*1i)^2*(4 + 18i) + (X + Y*1i)^3*(10 + 10i) + 17 + 12i);
  191. % [C, h] = contour(X, Y, real(Z));
  192. % clabel(C, h);  % Отображение меток на линиях уровня
  193. % hold on;
  194. % plot(xtrace, ytrace, '-x');
  195. % %Вывод начальной точки на график
  196. % text(xtrace(1) + 0.2, ytrace(1) + 0.5, 'M0');
  197. % %Вывод решения на график
  198. % text(x + 2, y, ...
  199. % strvcat(['x = ' (num2str(x))], ...
  200. %         ['y = ' (num2str(y))], ...
  201. %         ['c = '  (num2str(c))]));
  202.  
  203. min = [x y];
  204. fval = F(x, y)
  205. end
  206.  
  207. function min = vnesh_shtraf
  208. x = 0; y = 0;
  209. r = 10^-1;
  210. alfa = 10^-4;
  211. xtrace(1) = [x]; ytrace(1) = [y];
  212. c = 1;
  213. while true
  214.     while true
  215.         c = c + 1;
  216.         dx = alfa*M2_DerFun_x(r, x, y);
  217.         dy = alfa*M2_DerFun_y(r, x, y);
  218.         norm = sqrt(dx^2+dy^2);
  219.         step_x = dx / norm;
  220.         step_y = dy / norm;
  221. %         if abs(dy) > 10
  222. %             dy = dy / norm;
  223. %         end        
  224. %         if abs(dx) > 10
  225. %             dx = dx / norm;
  226. %         end
  227.         x_t = x; y_t = y;
  228.         x = x - step_x;
  229.         y = y - step_y;
  230.         xtrace(c) = x;
  231.         ytrace(c) = y;
  232. %         if is_in_trust_region(x, y) == 0
  233. %             x = x_t; y = y_t;
  234. %             alfa = alfa / 2;
  235. %         end
  236.         if sqrt(dx^2+dy^2) <= 10^-3
  237.             break;
  238.         else
  239.             alfa = alfa / 2;
  240.         end
  241.     end
  242. if r/2*(max(0,Res_1(x,y))^2+max(0,Res_2(x,y))^2) <= 10^-4
  243.     break
  244. end
  245. r = r * 10;
  246. end
  247. bool = is_in_trust_region(x, y)
  248. % x = -5:0.1:6;
  249. % y = -5:0.1:6;
  250. % [X, Y] = meshgrid(x, y);
  251. % Z = (conj(X)*(21 - 10i) - conj(Y)*(10 + 21i) + (conj(X) - conj(Y)*1i)^2*(4 - 18i) + (conj(X) - conj(Y)*1i)^3*(10 - 10i) + (17 - 12i))*(X*(21 + 10i) - Y*(10 - 21i) + (X + Y*1i)^2*(4 + 18i) + (X + Y*1i)^3*(10 + 10i) + 17 + 12i);
  252. % [C, h] = contour(X, Y, real(Z));
  253. % clabel(C, h);  % Отображение меток на линиях уровня
  254. % hold on;
  255. % plot(xtrace, ytrace, '-x');
  256. % %Вывод начальной точки на график
  257. % text(xtrace(1), ytrace(1), 'M0');
  258. % %Вывод решения на график
  259. % text(x + 2, y, ...
  260. % strvcat(['x = ' (num2str(x))], ...
  261. %         ['y = ' (num2str(y))], ...
  262. %         ['c = '  (num2str(c))]));
  263. min = [x y];
  264. fval = F(x, y)
  265. gradx = M2_DerFun_x(r, x, y)
  266. grady = M2_DerFun_y(r, x, y)
  267. end
  268.  
  269. function min = uslov_grad
  270.     x = 6; y = 1.5;
  271.     alfa = 10^-4;
  272.     xtrace = [x]; ytrace = [y];
  273.     c = 1;
  274.     while true
  275.         c = c + 1;
  276.         dx = M3_DerF_x(x, y);
  277.         dy = M3_DerF_y(x, y);
  278.         x_t = x; y_t = y; xt = x; yt = y;
  279.         x = x - alfa*dx;
  280.         xtrace(c) = x;
  281.         y = y - alfa*dy;
  282.         ytrace(c) = y;
  283.         if is_in_trust_region(x, y) == 0
  284.             x = x_t; y = y_t;
  285.             xt = xt + 1; yt = yt + 1;
  286.             alfa = alfa / 2;
  287.         end
  288.         if abs(x-xt) <= 10^-2 && abs(y-yt) <= 10^-2
  289.             break;
  290.         end
  291.     end
  292.     if abs(Res_1(x,y)) <= 10^-1 && abs(Res_2(x,y)) <= 10^-1
  293.         min = [2.6 -0.9];
  294.     elseif abs(Res_1(x,y)) <= 10^-1
  295.         min = project1(x, y, alfa);
  296.     else
  297.         min = project2(x, y, alfa);
  298.     end
  299. %     x = -5:0.1:6;
  300. %     y = -5:0.1:6;
  301. %     [X, Y] = meshgrid(x, y);
  302. %     Z = (conj(X)*(21 - 10i) - conj(Y)*(10 + 21i) + (conj(X) - conj(Y)*1i)^2*(4 - 18i) + (conj(X) - conj(Y)*1i)^3*(10 - 10i) + (17 - 12i))*(X*(21 + 10i) - Y*(10 - 21i) + (X + Y*1i)^2*(4 + 18i) + (X + Y*1i)^3*(10 + 10i) + 17 + 12i);
  303. %     [C, h] = contour(X, Y, real(Z));
  304. %     clabel(C, h);  % Отображение меток на линиях уровня
  305. %     hold on;
  306. %     plot(xtrace, ytrace, '-x');
  307. %     %Вывод начальной точки на график
  308. %     text(xtrace(1) + 0.2, ytrace(1) + 0.5, 'M0');
  309. %     %Вывод решения на график
  310. %     text(x + 2, y, ...
  311. %     strvcat(['x = ' (num2str(x))], ...
  312. %             ['y = ' (num2str(y))], ...
  313. %             ['c = '  (num2str(c))]));
  314.     fval = F(min(1), min(2))
  315.     bool = is_in_trust_region(x, y);
  316. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement