Advertisement
Guest User

Untitled

a guest
Jan 23rd, 2020
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.35 KB | None | 0 0
  1. function [x_out, fval, it_out, ll_out] = MPW_ZPK(D, c, A, b, eps, M)
  2. MAX_IT = 100;
  3. delta = 0.2;
  4. beta = 0.999;
  5. it = 0;
  6. n = length(c);
  7. m = length(b);
  8.  
  9. ex = ones(n,1);
  10. ey = ones(m,1);
  11.  
  12. x_0 = ones(n,1);
  13. y_0 = ones(m,1);
  14. w0 = ones(m,1);
  15. z0 = ones(n,1);
  16.  
  17. x_k = x_0;
  18. y_k = y_0;
  19. w_k = w0;
  20. z_k = z0;
  21.  
  22. while(it < MAX_IT)
  23. it = it + 1;
  24.  
  25. if abs(max(x_k))>M || abs(max(y_k)) > M
  26. x_out = -1;
  27. fval_out = -1;
  28. it_out = it;
  29. break
  30. end
  31.  
  32. rho = b - A * x_k + w_k;
  33. sigma = c - A' * y_k - z_k + D * x_k;
  34. gamma = z_k' * x_k + y_k' * w_k;
  35.  
  36. if sum(abs(rho))<eps || sum(abs(sigma)) < eps || abs(gamma) < eps
  37. x_out = x_k;
  38. ll_out = [y_k; z_k];
  39. fval_out = 1/2* x_k' * D * x_k + c'*x_k;
  40. it_out = it;
  41. break
  42. end
  43.  
  44. r_k = delta * gamma / (n + m);
  45.  
  46. X_inv = inv(diag(x_k));
  47. Y_inv = inv(diag(y_k));
  48.  
  49. X = diag(x_k);
  50. Z = diag(z_k);
  51. Y = diag(y_k);
  52. W = diag(w_k);
  53.  
  54. matrix = [-(X_inv*Z + D) A'; A Y_inv * W];
  55. vector = [c - A' * y_k - r_k * X_inv * ex + D * x_k; ...
  56. b - A * x_k + r_k * Y_inv * ey];
  57. result = matrix \ vector;
  58.  
  59. delta_x = result(1 : n);
  60. delta_y = result(n+1 : n+m);
  61. delta_z = X_inv*(r_k*ex - X*Z*ex - Z*delta_x);
  62. delta_w = Y_inv*(r_k*ey - Y*W*ey - W*delta_y);
  63.  
  64. indices = delta_w < 0;
  65. values = -beta * w_k ./ delta_w;
  66. alpha1 = min([1; values(indices)]);
  67.  
  68. indices = delta_y < 0;
  69. values = -beta * y_k ./ delta_y;
  70. alpha2 = min([1; values(indices)]);
  71.  
  72. indices = delta_x < 0;
  73. values = -beta * x_k ./ delta_x;
  74. alpha3 = min([1; values(indices)]);
  75.  
  76. indices = delta_z < 0;
  77. values = -beta * z_k ./ delta_z;
  78. alpha4 = min([1; values(indices)]);
  79.  
  80. alpha = min([1 alpha1 alpha2 alpha3 alpha4]);
  81.  
  82. x_k = x_k + alpha * delta_x;
  83. z_k = z_k + alpha * delta_z;
  84. y_k = y_k + alpha * delta_y;
  85. w_k = w_k + alpha * delta_w;
  86.  
  87. delta = 0.2*delta;
  88. end
  89.  
  90. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement