Advertisement
Guest User

Untitled

a guest
Jan 9th, 2017
164
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.60 KB | None | 0 0
  1. function y = minimumDiv(q, x)
  2.  
  3. %authors: Madeleine Fischer & Valerii Maltsev
  4. %emails:madeleine.fischer@uni.kn & valerii.maltsev@uni.kn
  5. n=length(x);
  6.     answer = ones(n,1);
  7.     for k = 1:n
  8.         if q(k) < 0
  9.             answer(k) = min(answer(k), -x(k)/q(k));
  10.         end
  11.         y=min(answer);
  12.     end
  13.  
  14.  
  15. function [x, lambda, mu] = mylinprog(c, A, b, tol, maxiter, x0, lambda0, mu0)
  16. %attempt to solve the linear programming problem utilizing the predictor
  17. %corrector algorith (Mehrotra):
  18.  
  19. %authors: Madeleine Fischer & Valerii Maltsev
  20. %emails:madeleine.fischer@uni.kn & valerii.maltsev@uni.kn
  21.  
  22. %Input: c........vector of dimension nx1
  23. %       A........matrix of dimension mxn
  24. %       b........vector of dimension mx1
  25. %       tol......tolerance for the stopping criteria
  26. %       maxiter..maximum number of allowed iterations
  27. %       x0.......initial guess for the solution x (dimension nx1)
  28. %       lambda0..initial guess for the Lagrange multiplier lambda
  29. %       (dimension mx1)
  30. %       mu0......initial guess for the Lagrange multiplier mu (dimension
  31. %       nx1)
  32. %Output:x........numerical solution for x
  33. %       lambda...numerical solution for the Lagrange multiplier lambda
  34. %       mu.......numerical solution for the Lagrange multiplier mu
  35. [m,n]=size(A);
  36.  %checking for correct dimensions
  37.  
  38. if(length(c)~=n || length(b)~=m)
  39.     display('die Dimensionen der eingegebenen Vektoren c und b passen nicht zur Matrix A')
  40. else
  41.    
  42.  
  43. k = 0;
  44.  
  45.  
  46. x = x0;
  47. mu = mu0;
  48. lambda = lambda0;
  49. e=ones(n,1);
  50.  
  51.  
  52.  %while stopping conditions not fulfilled, continue the algorithm
  53.  
  54.  
  55. while( (x * mu' / n) > tol & k<=maxiter  )
  56.  
  57.    
  58.     Matrix = [zeros(n,n)  A' eye(n) ; A zeros(m,m) zeros(m,n) ; diag(mu)  zeros(n,m)  diag(x)];
  59.  
  60. r_b_k = (A * x - b);
  61. r_c_k = (A' * lambda + mu - c);    
  62.  
  63.     Vector = [-r_c_k ; -r_b_k ; -diag(x) * diag(mu) * e]';
  64.    
  65.  
  66.     % Calculation of delta_x^aff, delta_lambda^aff, delta_mu^aff
  67.     Deltas_aff = (Matrix/Vector);
  68.    
  69.     delta_x_aff = Deltas_aff(1:n);
  70.     delta_lambda_aff = Deltas_aff(n+1:n+m);
  71.     delta_mu_aff = Deltas_aff(m+n+1:2*n+m);
  72.  
  73. % Calculation of a_prim_aff, a_dual_aff
  74. a_prim_aff = minimumDiv(delta_x_aff, x);
  75. a_dual_aff = minimumDiv(delta_mu_aff, mu);
  76.  
  77. % Calculation of nu_aff, nu_k, sigma  
  78. nu_aff = (x + a_prim_aff*delta_x_aff)' * (mu + a_dual_aff*delta_mu_aff)/n;    
  79. nu_k = (x' * mu) / n;
  80. sigma = (nu_aff/nu_k)^3;
  81.  
  82. Vector2 = [-r_c_k ; -r_b_k ; -diag(x) * diag(mu) * e - diag(delta_x_aff) * diag(delta_mu_aff) * e + sigma * nu_k * e]';
  83.  
  84. % Calculation of delta
  85. Deltas = Matrix/Vector2;
  86. delta_x = Deltas(1:n);
  87. delta_lambda = Deltas(n+1:n+m);
  88. delta_mu = Deltas(m+n+1:2*n+m);
  89.    
  90. % Calculation of a_prim_k, a_dual_k
  91. a_prim_k = minimumDiv(delta_x, x);
  92. a_dual_k = minimumDiv(delta_mu, mu);
  93.  
  94. %Calculation of next iteration
  95. x = x + a_prim_k * delta_x;
  96. lambda = lambda + a_dual_k * delta_lambda;
  97. mu = mu + a_dual_k * delta_mu;
  98.  
  99. k = k+1;
  100.  
  101. end
  102.  
  103. end
  104.  if(k > maxiter)
  105.      display('maximale Anzahl an Durchlaeufen erreicht')
  106. end
  107.  
  108.  
  109. %authors: Madeleine Fischer & Valerii Maltsev
  110. %emails:madeleine.fischer@uni.kn & valerii.maltsev@uni.kn
  111. clear all; close all; clc;
  112.  
  113.  
  114. n=30;
  115. m=20;
  116. tol=10^(-12);
  117. maxiter=15000;
  118.  
  119. RMAX=1000;
  120. %real solutions
  121. x_star = [randi(RMAX, m, 1)' zeros(1, n - m)]'
  122. mu_star = [zeros(1, m) randi(RMAX, n-m, 1)']'
  123. lambda_star = randi(RMAX, m, 1)
  124.  
  125. %starting point
  126. x0 = randi(RMAX, n, 1);
  127. mu0 = randi(RMAX, n, 1);
  128. lambda0 = randi(RMAX, m, 1);
  129.  
  130.  
  131.  
  132. A=rand(m,n);
  133.  
  134. c = A' * lambda_star + mu_star;
  135. b = A * x_star;
  136.  
  137. %numerical solutions using Mehrotra Algorithm
  138. [x, lambda, mu] = mylinprog(c, A, b, tol, maxiter, x0, lambda0, mu0)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement