Advertisement
makispaiktis

Texnikes_Ergasia1_Thema2_Zitoumeno1

Nov 17th, 2020 (edited)
761
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
MatLab 4.21 KB | None | 0 0
  1. clear all
  2. clc
  3.  
  4. % Ο πίνακας μου θα περιέχει διάφορα l ξεκινώντας από 0.001 ως 0.05 με βήμα
  5. % 0.001 = 1/1000
  6. for index = 1:1:50
  7.     l(index) = index / 1000;
  8. end
  9.  
  10. calculationsList = [];
  11. for index = 1:length(l)
  12.     calculationsList(index) = numOfCalculations(l(index));
  13. end
  14.  
  15. plot([1:1:50], calculationsList, 'o');
  16. title("f1 = (x-2)^2-sin(x+3), l = {1,..,50}/1000");
  17. xlabel("l / 1000");
  18. ylabel("Number of calculations needed");
  19.  
  20.  
  21. function calculations = numOfCalculations(l)
  22.     l
  23.     syms x
  24.     f1 = (x-2)^2-sin(x+3);
  25.     akro1 = 2;      akro2 = 5;      gamma = 0.618;
  26.     x1 = akro1;     x2 = akro2;    
  27.     % Τα παρακάτω είναι flag που μου λένε κάθε φορά ποιο εκ των x1, x2
  28.     % έγινε άκρο προηγουμένως
  29.     egineAkroToX1 = -1000;     egineAkroToX2 = -1000;
  30.     akra1 = [];     akra2 = [];
  31.     counter = 0;
  32.     calculations = 0;
  33.    
  34.     while akro2 - akro1 > l
  35.        
  36.         counter = counter + 1;      % Μετράει τα steps k
  37.         % Στην 1η και μόνο επανάληψη απαιτείται ο υπολογισμός 2 τιμών της
  38.         % δεδομένης συνάρτησης, γιατί μετά το ένα εκ των 2 xk γίνεται άκρο
  39.         % του νέου διαστήματος και επομένως κάνουμε έναν νέο υπολογισμό
  40.         % **************** COUNTER = 1 ****************
  41.         if counter == 1
  42.             x1 = akro1 + (1-gamma) * (akro2 - akro1);
  43.             x2 = akro1 + gamma * (akro2 - akro1);
  44.             value1 = subs(f1, x1);
  45.             value2 = subs(f1, x2);
  46.             calculations = calculations + 2;
  47.             if value1 < value2
  48.                 ThaGineiAkroToX2 = 1;
  49.                 ThaGineiAkroToX1 = 0;
  50.                 % ak+1 = ak και bk+1 = x2k, αλλάζει το δεξιό μόνο άκρο
  51.                 % Επίσης για την επόμενη επανάληψη, ξέρω ότι
  52.                 % x2,k+1 = x1,k (το νέο x2 ισούται με το πριν x1 και βάζουμε x1,
  53.                 % γιατί το x2 "έχει χρησιμοποιηθεί ως νέο άκρο)
  54.                 % Η τιμή του νέου x1 θα καθοριστεί μετά
  55.             else
  56.                 % Νέο διάστημα ----> [x1k, bk]
  57.                 ThaGineiAkroToX1 = 1;
  58.                 ThaGineiAkroToX2 = 0;
  59.             end
  60.        
  61.         % **************** COUNTER > 1 ****************
  62.         elseif counter > 1
  63.             % Ουσιαστικά εδώ που το step k > 1, θα έχω έναν νέο υπολογισμό
  64.             % της συνάρτησης μου
  65.             if ThaGineiAkroToX2 == 1
  66.                 % Το x1 απαιτεί νέο υπολογιμό
  67.                 akro2 = x2;
  68.                 x2 = x1;
  69.                 x1 = akro1 + (1-gamma)*(akro2-akro1);
  70.                 calculations = calculations + 1;
  71.                 value1 = subs(f1, x1);
  72.                 value2 = subs(f1, x2);
  73.                 if value1 < value2
  74.                     ThaGineiAkroToX2 = 1;
  75.                     ThaGineiAkroToX1 = 0;
  76.                 else
  77.                     ThaGineiAkroToX1 = 1;
  78.                     ThaGineiAkroToX2 = 0;
  79.                 end
  80.                
  81.             elseif ThaGineiAkroToX1 == 1
  82.                 akro1 = x1;
  83.                 x1 = x2;
  84.                 x2 = akro1 + gamma*(akro2-akro1);
  85.                 calculations = calculations + 1;
  86.                 value1 = subs(f1, x1);
  87.                 value2 = subs(f1, x2);
  88.                 if value1 < value2
  89.                     ThaGineiAkroToX2 = 1;
  90.                     ThaGineiAkroToX1 = 0;
  91.                 else
  92.                     ThaGineiAkroToX1 = 1;
  93.                     ThaGineiAkroToX2 = 0;
  94.                 end
  95.             end
  96.            
  97.         end
  98.         akra1(counter) = akro1;
  99.         akra2(counter) = akro2;
  100.         % akro1
  101.         % akro2
  102.         % x1
  103.         % x2
  104.        
  105.        
  106.     end      % End of while-loop
  107.     akra1
  108.     akra2
  109.     calculations
  110.     display('*************************************************');
  111.     display(' ');
  112. end
  113.  
  114.  
  115.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement