makispaiktis

Texnikes_Ergasia2_Thema2_ZitoumenoB

Nov 30th, 2020 (edited)
282
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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.     gammaList(1) = 0;
  25.    
  26.     while normKlisisList(length(normKlisisList)) > epsilon
  27.         k = k + 1;
  28.         dk = -subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))});     % η κλίση πριν
  29.         % Το dk είναι 2*1 διάνυσμα, το 1ο στοιχείο του αφορά τον υπολογισμό
  30.         % του x και το 2ο τον υπολογισμό του y
  31.         % Πρέπει το γ που θα επιλέξω να κάνει minimize την f(xk + γkdk)
  32.         xPrin = xList(k-1);
  33.         yPrin = yList(k-1);
  34.        
  35.         % ********************************************************************************************
  36.         % ************************** Εσωτερική Βελτιστοποίηση ****************************************
  37.         % ********************************************************************************************
  38.         gamma = internalOptimization(f, xPrin, yPrin, dk);
  39.        
  40.        
  41.         xList(k) = xPrin + gamma * dk(1);
  42.         yList(k) = yPrin + gamma * dk(2);
  43.         fList(k) = subs(f, {x,y}, {xList(length(xList)), yList(length(yList))});
  44.         normKlisisList(k) = norm(subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))}));
  45.         gammaList(k) = gamma;
  46.     end
  47.    
  48.     xList
  49.     yList
  50.     fList
  51.     normKlisisList
  52.     k
  53.     gammaList
  54.     % Τα τελευταία xk, yk κάθε λίστας τα ονομάζω εν συντομία xx και yy
  55.     disp('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  56.     display('~~~~~~~~ About the last found xk (xx) and yk (yy) ~~~~~~~~')
  57.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  58.     xx = xList(length(xList))
  59.     yy = yList(length(yList))
  60.     F_xx_yy = fList(length(fList))
  61.     NORM_KLISIS = normKlisisList(length(normKlisisList))
  62.     display('**********************************************************')
  63. end
  64.  
  65.  
  66.  
  67.  
  68.  
  69.  
  70.  
  71.  
  72. function gamma = internalOptimization(f, xPrin, yPrin, dk)
  73.     syms x y G
  74.     X = xPrin + G * dk(1);
  75.     Y = yPrin + G * dk(2);
  76.     % Πλέον, τα νέα X,Y έχουν σαν μόνη άγνωστη μεταβλητή το G = γk
  77.     % Η F που έχει προκύψει είναι μόνο συνάρτηση του G
  78.     F = subs(f, {x,y}, {X, Y});
  79.     DF = diff(F, 'G');
  80.     % Το γ γενικά παίρνει τιμές από 0 ως 1, άρα:
  81.     akro1 = 0.1;
  82.     akro2 = 1;
  83.     l = 0.005;
  84.     counter = 0;
  85.     while akro2 - akro1 > l
  86.         counter = counter + 1;
  87.         kentro = (akro1 + akro2) / 2;
  88.         paragwgos = subs(DF, kentro);
  89.         if paragwgos > 0
  90.             akro2 = kentro;
  91.         else
  92.             akro1 = kentro;
  93.         end
  94.      end
  95.      % Οι μεταβλητές akra1, akra2 μετά το τέλος της διαδικασίας έχουν
  96.      % κάποιες διαμορφωμένες τιμές. Θα κάνω τον μέσο όρο τους για το τελικό
  97.      % γ που θα επιλέξω να επιστρέψω
  98.      gamma = (akro2 + akro1) / 2;
  99. end
  100.  
RAW Paste Data