Advertisement
makispaiktis

Texnikes_Ergasia2_Thema2_ZitoumenoC

Nov 30th, 2020 (edited)
1,128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 3.67 KB | None | 0 0
  1. clear all
  2. clc
  3.  
  4. elaxistoMeGammaMetavlhto(-1, -1);
  5.  
  6.  
  7. function elaxistoMeGammaMetavlhto(x0, y0)
  8.    
  9.     % 1. Ορίζω το ε της συνθήκης τερματισμού ίσο με 2/1000
  10.     epsilon = 0.002;
  11.     syms x y
  12.     f = x^3 * exp(-x^2-y^4);
  13.     klisi = gradient(f, [x,y]);
  14.    
  15.     % 2. Ορίζω τις λίστες που θα τοποθετήσω τα xi, yi. Τις ονομάζω xList,
  16.     % yList, θα βάζω επίσης και τις τιμές της f (fList) και του μέτρου της
  17.     % κλίσης της (normKlisisList) σε άλλες 2 λίστες
  18.     k = 1;
  19.     xList = [];             yList = [];
  20.     xList(1) = x0;          yList(1) = y0;
  21.     fList = [];             normKlisisList = [];        gammaList = [];
  22.     fList(1) = subs(f, {x,y}, {xList(length(xList)), yList(length(yList))});
  23.     normKlisisList(1) = norm(subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))}));
  24.    
  25.     % Armijo Constants
  26.     a = 1/1000;             b = 0.3;            s = 1;
  27.     gammaList(1) = s;
  28.    
  29.     while normKlisisList(length(normKlisisList)) > epsilon
  30.         k = k + 1;
  31.         dk = -subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))});     % η κλίση πριν
  32.         % Το dk είναι 2*1 διάνυσμα, το 1ο στοιχείο του αφορά τον υπολογισμό
  33.         % του x και το 2ο τον υπολογισμό του y
  34.         % Πρέπει το γ που θα επιλέξω να κάνει minimize την f(xk + γkdk)
  35.         xPrin = xList(k-1);
  36.         yPrin = yList(k-1);
  37.        
  38.         % ********************************************************************************************
  39.         % ******************************* Κανόνας Armijo *********************************************
  40.         % ********************************************************************************************
  41.         % Δοκιμάζω τιμές ακέραιες 0,1,2,... στο mk και φτιάχνω το βήμα γk
  42.         % και κατ' επέκταση και το xk+1
  43.         for mk = 0:100
  44.             k
  45.             mk
  46.             gk = s * b^mk;
  47.             xNew = xPrin + gk * dk(1);
  48.             yNew = yPrin + gk * dk(2);
  49.             F = matlabFunction(f);
  50.             DF = matlabFunction(klisi);
  51.             % Ήρθε η ώρα να τσεκάρουμε την ανίσωση
  52.             aristeroMelos = F(xPrin, yPrin) - F(xNew, yNew);
  53.             grad = DF(xPrin, yPrin);
  54.             dexioMelos = a * b^mk * s * grad' * grad;
  55.             if aristeroMelos > dexioMelos
  56.                 gammaList(k) = gk;
  57.                 xList(k) = xNew;
  58.                 yList(k) = yNew;
  59.                 fList(k) = F(xNew, yNew);
  60.                 normKlisisList(k) = norm(subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))}));
  61.                 display('Success for this step k with mk in value of:')
  62.                 mk
  63.                 break;
  64.             end
  65.         end
  66.            
  67.            
  68.     end
  69.    
  70.     xList
  71.     yList
  72.     fList
  73.     normKlisisList
  74.     k
  75.     gammaList
  76.     % Τα τελευταία xk, yk κάθε λίστας τα ονομάζω εν συντομία xx και yy
  77.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  78.     display('~~~~~~~~ About the last found xk (xx) and yk (yy) ~~~~~~~~')
  79.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  80.     xx = xList(length(xList))
  81.     yy = yList(length(yList))
  82.     F_xx_yy = fList(length(fList))
  83.     NORM_KLISIS = normKlisisList(length(normKlisisList))
  84.     display('**********************************************************')
  85. end
  86.    
  87.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement