Advertisement
makispaiktis

Texnikes_Ergasia3_Thema2

Dec 14th, 2020 (edited)
846
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.06 KB | None | 0 0
  1. clear all
  2. clc
  3.  
  4. x10 = 8;        x1min = -20;        x1max = 10;
  5. x20 = 3;        x2min = -12;        x2max = 15;
  6. gamma = 0.1;
  7. sk = 15;
  8. maxKathodos(x10, x20, gamma, sk, x1min, x1max, x2min, x2max);
  9.  
  10. function maxKathodos(x10, x20, gamma, sk, x1min, x1max, x2min, x2max)
  11.    
  12.     % 1. Ορίζω το ε της συνθήκης τερματισμού ίσο με 0.01
  13.     epsilon = 0.01;
  14.     syms x1 x2
  15.     f = (x1^2 + x2^2) / 2;
  16.     F = matlabFunction(f);
  17.     klisi = gradient(f, [x1,x2]);
  18.     KLISI = matlabFunction(klisi);
  19.    
  20.     % 2. Ορίζω τις λίστες που θα τοποθετήσω τα x1i, x2i. Τις ονομάζω x1List,
  21.     % x2List, θα βάζω επίσης και τις τιμές της f και του μέτρου της κλίσης
  22.     % της σε άλλες 2 λίστες
  23.     k = 1;
  24.     x1List = [];             x2List = [];
  25.     x1List(1) = x10;          x2List(1) = x20;
  26.     fList = [];             normKlisisList = [];
  27.     fList(1) = subs(f, {x1,x2}, {x1List(length(x1List)), x2List(length(x2List))});
  28.     normKlisisList(1) = norm(subs(klisi, {x1,x2}, {x1List(length(x1List)), x2List(length(x2List))}));
  29.  
  30.    
  31.     while normKlisisList(length(normKlisisList)) > epsilon
  32.         k = k + 1;
  33.         % Ο τύπος είναι: xk+1 = xk + gamma * (xkBAR - xk), άρα πρέπει να βρω
  34.         % το xkBAR. Όμως, για να υπολογίσω κάτι τέτοιο, θέλω να βρω την
  35.         % προβολή του διανύσματος xk - sk * KLISI_f(xk) στον χώρο που μας
  36.         % ενδιαφέρει και που ορίζεται στις παραμέτρους της function αυτής
  37.         grad = KLISI(x1List(k-1), x2List(k-1))
  38.         v1 = x1List(k-1) - sk * grad(1);
  39.         v2 = x2List(k-1) - sk * grad(2);
  40.         v = [v1;v2]
  41.         xkBAR = provoli(v, x1min, x1max, x2min, x2max)      % Επιστρέφει 2x1 vector
  42.         % xk+1 = xk + gamma * (xkBAR - xk)
  43.         x1List(k) = x1List(k-1) + gamma * (xkBAR(1) - x1List(k-1));
  44.         x2List(k) = x2List(k-1) + gamma * (xkBAR(2) - x2List(k-1));
  45.         fList(k) = F(x1List(length(x1List)), x2List(length(x2List)));
  46.         normKlisisList(k) = norm(subs(klisi, {x1,x2}, {x1List(length(x1List)), x2List(length(x2List))}));
  47.     end
  48.    
  49.    
  50.     x1List
  51.     x2List
  52.     fList
  53.     normKlisisList
  54.     k
  55.     % Τα τελευταία xk, yk κάθε λίστας τα ονομάζω εν συντομία xx και yy
  56.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  57.     display('~~~~~~~~ About the last found x1k (x1x1) and x2k (x2x2) ~~~~~~~~')
  58.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  59.     x1x1 = x1List(length(x1List))
  60.     x2x2 = x2List(length(x2List))
  61.     F_xx_yy = fList(length(fList))
  62.     NORM_KLISIS = normKlisisList(length(normKlisisList))
  63.     % Plots
  64.     figure(1);
  65.     plot(fList, 'x');
  66.     title("Values of f for every step k")
  67.     xlabel('Step k');
  68.     ylabel("f(x1k, x2k)");
  69.     figure(2);
  70.     plot(x1List, 'ro');
  71.     title("Spots x1 (red), x2 (blue)");
  72.     xlabel("Steps k");
  73.     ylabel("x1(k), x2(k)");
  74.     hold on
  75.     plot(x2List, 'bo')
  76.     title("Spots x1 (red), x2 (blue)");
  77.     xlabel("Steps k");
  78.     ylabel("x1(k), x2(k)");
  79.     display('**********************************************************')
  80. end
  81.  
  82.  
  83.  
  84. function xkBAR = provoli(v, x1min, x1max, x2min, x2max)
  85.     % Η αρχικοποίηση των 2 παρακάτω συνιστωσών του xkBAR θα γίνει σαν να είναι οι συνιστώσες του
  86.     % διανύσματος v εντός του εύρους τιμών [min, max]. Διαφορετικά,
  87.     % ακολουθούν if-cases, που διορθώνουν αυτήν την τιμή
  88.     synistwsa1 = v(1);
  89.     synistwsa2 = v(2);
  90.     if v(1) < x1min
  91.         synistwsa1 = x1min;
  92.     elseif v(1) > x1max
  93.         synistwsa1 = x1max;
  94.     end
  95.     if v(2) < x2min
  96.         synistwsa2 = x2min;
  97.     elseif v(2) > x2max
  98.         synistwsa2 = x2max;
  99.     end
  100.     xkBAR = [synistwsa1;synistwsa2];
  101. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement