Advertisement
makispaiktis

Texnikes_Ergasia2_Thema4_ZitoumenoA

Dec 5th, 2020 (edited)
962
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.61 KB | None | 0 0
  1. clear all
  2. clc
  3.  
  4.  
  5. syms x y
  6. f = x^3 * exp(-x^2-y^4)
  7. klisi = gradient(f, [x,y])
  8. essianos = jacobian(klisi)
  9. dk = - inv(essianos) * klisi
  10. DK = matlabFunction(dk);
  11.  
  12. xArxiko = -1;       yArxiko = -1;
  13. elaxistoMeGammaStathero(xArxiko, yArxiko, 0.2, 0);
  14. elaxistoMeGammaStathero(xArxiko, yArxiko, 0.3, 1);
  15. elaxistoMeGammaStathero(xArxiko, yArxiko, 0.35, 2);
  16.  
  17. function elaxistoMeGammaStathero(x0, y0, gamma, flag)
  18.    
  19.     % 1. Ορίζω το ε της συνθήκης τερματισμού ως το 1/100 για παράδειγμα
  20.     % της τιμής που δίνω στο γκ = σταθερό εδώ
  21.     epsilon = gamma/100;
  22.     syms x y
  23.     f = x^3 * exp(-x^2-y^4);
  24.     klisi = gradient(f, [x,y]);
  25.     KLISI = matlabFunction(klisi);
  26.     essianos = jacobian(klisi)
  27.     ESSIANOS = matlabFunction(essianos);        % Δίνει έναν 2x2 πίνακα
  28.    
  29.     % 2. Ορίζω τις λίστες που θα τοποθετήσω τα xi, yi. Τις ονομάζω xList,
  30.     % yList, θα βάζω επίσης και τις τιμές της f και του μέτρου της κλίσης
  31.     % της σε άλλες 2 λίστες
  32.     k = 1;
  33.     xList = [];             yList = [];
  34.     xList(1) = x0;          yList(1) = y0;
  35.     fList = [];             normKlisisList = [];
  36.     fList(1) = subs(f, {x,y}, {xList(length(xList)), yList(length(yList))});
  37.     normKlisisList(1) = norm(subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))}));
  38.  
  39.    
  40.     while normKlisisList(length(normKlisisList)) > epsilon
  41.         k = k + 1
  42.         % *********************************************************************************
  43.         % ************************ Levenberg - Marquardt **********************************
  44.         % *********************************************************************************
  45.        
  46.         % Πρέπει να βρω αν ο εσσιανός στο xk είναι θετικά ορισμένος, θα
  47.         % γίνει μέσω ιδιοτιμών
  48.         ESS = ESSIANOS(xList(k-1), yList(k-1))
  49.         EIG = eig(ESS);
  50.         MIN = min(EIG);
  51.         dk = [0;0];                 % A 2x1 vector
  52.        
  53.         if MIN > 0
  54.             % Τότε, η ελάχιστη ιδιοτιμή του εσσιανού στο σημείο xk είναι
  55.             % θετική και άρα ο εσσιανός είναι θετικά ορισμένος
  56.             disp('Thetika orismenos');
  57.             inv_essianos = inv(ESS)
  58.             dk = - inv_essianos * KLISI(xList(k-1), yList(k-1));        % A 2x1 vector
  59.         else
  60.             % Αν η ελάχιστη ιδιοτιμή του είναι -4 π.χ. πρέπει να προσθε΄σω
  61.             % 4 + (κάτι) και όλο αυτό επί τον μοναδιαίο, π.χ. 4,4Ι
  62.             disp('Oxi thetika orismenos');
  63.             mk = - MIN * 1.1
  64.             A = ESS + mk * eye(2);
  65.             inv_A = inv(A)
  66.             % Τώρα, ο Α είναι σίγουρα θετικά ορισμένος και αντιστρέφεται
  67.             dk = - inv_A * KLISI(xList(k-1), yList(k-1));
  68.         end
  69.        
  70.         xList(k) = xList(k-1) + gamma * dk(1);
  71.         yList(k) = yList(k-1) + gamma * dk(2);
  72.         fList(k) = subs(f, {x,y}, {xList(length(xList)), yList(length(yList))});
  73.         normKlisisList(k) = norm(subs(klisi, {x,y}, {xList(length(xList)), yList(length(yList))}));
  74.     end
  75.    
  76.    
  77.     xList
  78.     yList
  79.     fList
  80.     normKlisisList
  81.     k
  82.     % Τα τελευταία xk, yk κάθε λίστας τα ονομάζω εν συντομία xx και yy
  83.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  84.     display('~~~~~~~~ About the last found xk (xx) and yk (yy) ~~~~~~~~')
  85.     display('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
  86.     xx = xList(length(xList))
  87.     yy = yList(length(yList))
  88.     F_xx_yy = fList(length(fList))
  89.     NORM_KLISIS = normKlisisList(length(normKlisisList))
  90.     if flag == 0
  91.         plot(fList, 'ro');
  92.         title('Red for gamma = 0.2, blue for gamma = 0.3, green = 0.35');
  93.         xlabel('Steps k');
  94.         ylabel('Values of f');
  95.         hold on
  96.     elseif flag == 1
  97.         plot(fList, 'bx');
  98.         title('Red for gamma = 0.2, blue for gamma = 0.3, green = 0.35');
  99.         xlabel('Steps k');
  100.         ylabel('Values of f');
  101.         hold on
  102.     else
  103.         plot(fList, 'g^');
  104.         title('Red for gamma = 0.2, blue for gamma = 0.3, green = 0.35');
  105.         xlabel('Steps k');
  106.         ylabel('Values of f');
  107.         hold on
  108.     end
  109.     display('**********************************************************')
  110. end
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement