Găsirea unei funcții obiectiv prestabilit minim

Găsirea unei funcții obiectiv prestabilit minim

Găsirea unei funcții obiectiv prestabilit minim

Datorită faptului că metoda de ordinul zero de coborâre, este destul de precisă. Datorită faptului că funcția Rosenbrock are de relief viroaga pentru a atinge punctul minim nu a reușit. punct de oprire în acest caz a fost destul de departe de punctul minim. În cazul punctului de minim funcția elipsă a fost realizată în 21 de iterație, în etapa h = 0,2. In ciuda acestui punct minim funcție obiectiv predeterminat a fost atins exact 91 per repetare, cu pasul h = 0,2 și o precizie de 0,0001.

bibliografie

Fișierul principal al proiectului.

4. ITERATION_AMOUNT = 1000;

5. EPSILON = 0,001; % Precizie

7. POINT_AMOUNT = 50; % Numărul de puncte

punct de pornire 9%

11. x_point_Ellipse (1) = 2;

12. x_point_Ellipse (2) = -2;

14. x_point_Rosenbrock (1) = 4;

15. x_point_Rosenbrock (2) = 3;

17. a1_T_point_CF (1) = 2;

18. a1_T_point_CF (2) = 4;

20.% a și b - valorile pentru raze f II. Elipsă.

24% setările inițiale funcția W (s).

28. ELLIPSE = 'ELLIPSE';

29. ROSENBROCK = 'ROSENBROCK';

32. Partea 1% Euler.

33. y_teor = FirstPart_EulerMethod (a1, T, POINT_AMOUNT);

35% Partea a 2 coordinatewise de optimizare.

36.% funcția [value_of_funct, x] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a, b, y_exp, number_y_exp, POINT_AMOUNT)

37. [y_Ellipse, x_Ellipse] = SecondPart_OptimizationCoordinate (ELLIPSE, h, EPSILON, ITERATION_AMOUNT, x_point_Ellipse, a, b, -1, -1, POINT_AMOUNT);

38. [y_Rosenbrock, x_Rosenbrock] = SecondPart_OptimizationCoordinate (ROSENBROCK, h, EPSILON, ITERATION_AMOUNT, x_point_Rosenbrock, a, b, -1, -1, POINT_AMOUNT);

40% 3. Partea RNG. CF

41. [CF, a1_T_1, a1_T_2, a1_T_3] = ThirdPart (CF_text, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_teor, POINT_AMOUNT);

Funcția metodei Euler.

1. Funcția y_Euler_50point = FirstPart_EulerMethod (a1, T, POINT_AMOUNT)

3. y_Euler la nivel mondial;

5. ITERATION_AMOUNT = 300; % Numărul de puncte pentru primul program.

6. x_t = 5; % Din x referință constantă (t)

11. coeff_z1 = 120 * a1 / T. ^ 2 + 6;

12. coeff_z2 = 6 * a1-120 + 48 * a1 / T;

13. coeff_x_t = 120 * a1 / T. ^ 2;

14.% free_term - termen liber.

15. free_term = coeff_x_t * x_t;

17. pentru i = 1: ITERATION_AMOUNT

18. z1 (i + 1) = z1 (i) + h * z2 (i);

19. z2 (i + 1) = z2 (i) + h * (x_t-z1 (i) -0.4 * T * z2 (i)) / T. ^ 2;

20. y_Euler (i) = coeff_z1 * z1 (i) + coeff_z2 * z2 (i) - free_term;

24.% i = 1: ITERATION_AMOUNT;

26.% titlu (“Y grafic teoretic puncte 300' .);

28.% saveas (GCF, 'ieșire', 'bmp');

29% din rezerva de 300 de puncte numai 50 (POINT_AMOUNT)

31. step_cycle = ITERATION_AMOUNT / POINT_AMOUNT;

32. pentru i = 1: step_cycle: ITERATION_AMOUNT

33. y_Euler_50point (j) = y_Euler (i);

38.% i = 1: POINT_AMOUNT;

titlu 40.% ( 'Y graficul teoretic 50 puncte (fiecare 6).');

Funcția de optimizare coordinatewise

1. Partea 2% coordinatewise de optimizare.

2. Funcția [value_of_funct, x] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, x_start_point, a, b, y_exp, number_y_exp, POINT_AMOUNT)

8. clar (varlist);

14. Deplasare%. pentru a sări peste condițiile de testare out prev. min value_of_funct din ultimele trei sau nu.

15. change_coord = 1;

16% pentru a ieși din bucla dacă numărul. Mai multe iterații ITERATION_AMOUNT.

17. number_iteration = 1;

23. x (1,1) = x_start_point (1); % Prima coordonată, prima valoare.

24. x (2,1) = x_start_point (2); În al doilea rând% coordonate, prima valoare.

25. x (1,2) = x (modificare, i-1) + h; % Prima coordonată, a doua valoare.

26. x (2,2) = x (constant, i-1); % A doua coordonate, a doua valoare.

28. value_of_funct (1) = Ellipse_Rosenbrock_or_CF (function_name, x (1,1), x (2,1), a, b, y_exp, number_y_exp, POINT_AMOUNT);

29. new_value_of_function = Ellipse_Rosenbrock_or_CF (function_name, x (1,2), x (2,2), a, b, y_exp, number_y_exp, POINT_AMOUNT);

31. dacă new_value_of_function> value_of_funct (1)

33. x (1,2) = x (modificare, i-1) + h;

34. value_of_funct (2) = Ellipse_Rosenbrock_or_CF (function_name, x (schimbare, i), x (constant, i), a, b, y_exp, number_y_exp, POINT_AMOUNT);

37. value_of_funct (2) = new_value_of_function;

40% ciclu până când modulul diferenței funcționează mai epsilon precizie și numărul de iterații este mai mică decât ITERATION_AMOUNT (10000).

41. în timp ce (abs (value_of_funct (i) -value_of_funct (i-1))> EPSILON (number_iteration

43. number_iteration = number_iteration + 1;

45. change_coord = change_coord + 1;

47% se adaugă la prima etapă de coordonate.

48. x (schimbare, i) = x (modificare, i-1) + h;

49% coordonate a doua rescriere.

50. x (constante, i) = x (constant, i-1);

51% găsi valoarea funcției a noilor valori.

52. new_value_of_function = Ellipse_Rosenbrock_or_CF (function_name, x (1, i), x (2, i), a, b, y_exp, number_y_exp, POINT_AMOUNT);

54% în cazul în care funcția valorile curente mai mult decât o funcție a, atunci h = h * (-1) anterior. în caz contrar value_of_funct (i) = new_value_of_function.

55. dacă new_value_of_function> value_of_funct (i-1)

57% zero afară de ultima valoare

58. x (schimbare, i) = NaN;

59. i = i - 1; % Pentru a reveni la funcția de valoare minimă anterioară

% 62. În cazul în care poziția de deplasare ritm făcut nu mai puțin de 3 puncte, apoi prin efectuarea min value_of_funct a ultimilor 3. valori.

63. if (change_coord> = 3)

65% în cazul în care funcția valorilor din etapa anterioară este mai puțin curent și mai puțin în etapa i-2, apoi modificați mișcarea de coordonate.

66. dacă value_of_funct (i-1)> = value_of_funct (i)

68. După% Schimbare coordonate ritm propriu - change_coord zeroize.

69. change_coord = 0;

70. dacă (== constantă 1)

16. value_of_funct = suma ((y_exp (number_y_exp, :) - y_model) ^ 2) / POINT_AMOUNT ;.

20. value_of_funct = -1;


  1. Partea 3.% CF
  2. Funcția [CF, a1_T_1, a1_T_2, a1_T_3] = ThirdPart (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_teor, POINT_AMOUNT)
  3. % Y_max iau de la 1 parte.
  4. y_max = max (abs (y_teor));
  5. .elta_y = y max * Mu
  6. delta_y (1) = y_max * 0,005;
  7. delta_y (2) = y_max * 0,01;
  8. delta_y (3) = y_max * 0,02;
  9. % Generatorul de numere aleatorii. zgomot triunghiulara.
  10. [Y_noise (1), X_noise (1)] = RNG_Triangle (delta_y (1), POINT_AMOUNT);
  11. [Y_noise (2), X_noise (2)] = RNG_Triangle (delta_y (2), POINT_AMOUNT);
  12. [Y_noise (3), X_noise (3)] = RNG_Triangle (delta_y (3), POINT_AMOUNT);
  13. y_exp (1.) = y_teor + x_noise (1);
  14. y_exp (2) = y_teor + x_noise (2).
  15. y_exp (3) = y_teor + x_noise (3).
  16. i = 1: POINT_AMOUNT;
  17. s_exp1 = 'k';
  18. s_exp2 = 'g';
  19. s_exp3 = 'b';
  20. s_teor = 'r';
  21. % Y reprezentate experimental.
  22. % Figura;
  23. % Plot (y_exp (1), s_exp1.);
  24. Titlu% ( 'Yexp1 - Negru');
  25. % Figura;
  26. % Plot (y_exp (2), s_exp2.);
  27. Titlu% ( 'Yexp2 - verde');
  28. % Figura;
  29. % Plot (i, y_exp (3), s_exp3, i, y_teor, s_teor.);
  30. Titlu% ( 'Yexp3 - albastru Yteor - rosu.');
  31. number_y_exp_1 = 1;
  32. number_y_exp_2 = 2;
  33. number_y_exp_3 = 3;
  34. [CF1, a1_T_1] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_1, POINT_AMOUNT);
  35. [CF2, a1_T_2] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_2, POINT_AMOUNT);
  36. [CF3, a1_T_3] = SecondPart_OptimizationCoordinate (function_name, h, EPSILON, ITERATION_AMOUNT, a1_T_point_CF, a, b, y_exp, number_y_exp_3, POINT_AMOUNT);
  37. Aruncări matrice% CF1, CF2, CF3 într-o matrice bidimensională a CF (3 :).
  38. size_CF (1) = dimensiunea (CF1, 2);
  39. size_CF (2) = dimensiunea (CF2, 2);
  40. size_CF (3) = dimensiunea (CF3, 2);
  41. pentru i = 1: size_CF (1)
  42. CF (1, i) = CF1 (i);
  43. capăt
  44. pentru i = 1: size_CF (2)
  45. CF (2, i) = CF2 (i);
  46. capăt
  47. pentru i = 1: size_CF (3)
  48. CF (3, i) = CF3 (i);
  49. capăt
  50. capăt
  1. Partea a 3%.
  2. % Generatorul de numere aleatorii. pe Delta y_noise.
  3. % Generatorul de numere aleatorii. zgomot triunghiulara.
  4. Funcția [y_noise, x_noise] = RNG_Triangle (delta_y, POINT_AMOUNT)
  5. j = 1;
  6. în timp ce j <= POINT_AMOUNT
  7. % A - o linie dreaptă orizontală - argumentul. Noi genera un număr de -delta_y la delta_y.
  8. . A = -delta_y + (delta_y - (- delta_y)) * rand ();
  9. % B - pe linia verticală - funcția. Noi genera un număr cuprins între 0 și 1 / delta_y.
  10. . B = 0 + (1 / delta_y-0) * rand ();
  11. % Fprintf ( 'Value_of_Function (a, delta_y) = \ n.', Value_of_Function (a, delta_y));
  12. % În cazul în care b este mai mică, atunci a generat un punct în interiorul unui triunghi.
  13. dacă RNG_Value_of_Function (a, delta_y)> b
  14. y_noise (j) = b;
  15. x_noise (j) = a;
  16. j = j + 1;
  17. se încheie;
  18. se încheie;
  19. % Figura;
  20. % Desenați o histogramă.
  21. % Hist (x_noise);
  22. capăt
  1. Partea a 3%.
  2. % Calculul funcției RNG pentru oricare argument „+“ sau „-“.
  3. Funcția y_triangle = RNG_Value_of_Function (argument, delta_y)
  4. x1 = 0;
  5. y1 = 1 / delta_y;
  6. y2 = 0;
  7. % Valoarea orizontală (argument) este mai mare sau mai mică decât zero
  8. dacă argumentul> 0
  9. x2 = delta_y;
  10. altfel
  11. x2 = -delta_y;
  12. se încheie;
  13. y_triangle = (argument - x1) * (y2 - y1) / (x2 - x1) + y1;
  14. % Fprintf ( 'y_triangle = \ n.', Y_triangle);
  15. capăt

  1. %, Curbele de nivel și programul de căutare min.
  2. Funcția draw_way_and_lines_level (function_name, x, LAST_NUMBER, value_of_funct, number_iteration, a, b, y_exp, number_y_exp, POINT_AMOUNT)
  3. dacă strcmp (function_name, 'ELLIPSE') == 1
  4. title_plot = ( 'Funcția Elipsa');
  5. x_contour = -5: 0,1: 5;
  6. y_contour = -5: 0,1: 5;
  7. [X, Y] = meshgrid (x_contour, y_contour);
  8. . Z = (X / a) ^ 2 + (Y / b) ^ 2 .;
  9. % Punct MIN
  10. min_x = 0;
  11. min_y = 0;
  12. contour_amount = 50;
  13. % Coordonate placă de ieșire de date
  14. text_x = -4.8;
  15. text_y = -3.9;
  16. elseif strcmp (function_name, 'ROSENBROCK') == 1
  17. title_plot = ( 'Funcția Rosenbroke');
  18. x_contour = -5: 0,1: 5;
  19. y_contour = -5: 0,1: 5;
  20. [X, Y] = meshgrid (x_contour, y_contour);
  21. Z = 100 * (Y - X ^ 2) ^ 2 + (1 - X) ^ 2.;.
  22. % Punct MIN
  23. min_x = 1;
  24. min_y = 1;
  25. contour_amount = 200;
  26. % Coordonate placă de ieșire de date
  27. text_x = -4.8;
  28. text_y = -3.9;
  29. elseif strcmp (function_name CF ') == 1
  30. % Title_plot = ( 'CF (funcția obiectiv)');
  31. title_plot = strcat ( 'CF', num2str (number_y_exp), '(funcția obiectiv)');
  32. a1_start = -2;
  33. a1_step = 0,2;
  34. a1_end = 13;
  35. a1_contour = a1_start: a1_step: a1_end;
  36. T_start = 1,8;
  37. T_step = a1_step;
  38. T_end = 7,8;
  39. T_contour = T_start: T_step: T_end;
  40. % Crearea unei matrice de valori ale parametrilor necunoscuți pentru construcția liniilor de nivel.
  41. [A1_plot, T_plot] = meshgrid (a1_contour, T_contour);
  42. iter_amount_a1 = (a1_end - a1_start) / a1_step + 1;
  43. iter_amount_T = (T_end - T_start) / T_step + 1;
  44. % Fprintf ( 'iter_amount_a1 = \ n.', Iter_amount_a1);
  45. % Fprintf ( 'iter_amount_T = \ n.', Iter_amount_T);
  46. % Aici se creează o matrice de valori CF pentru a construi liniile de nivel.
  47. pentru i = 1: iter_amount_T
  48. pentru j = 1: iter_amount_a1
  49. y_model = FirstPart_EulerMethod (a1_plot (i, j), T_plot (i, j), POINT_AMOUNT);
  50. Z (i, j) = suma ((y_exp (number_y_exp) -y_model) ^ 2 ..) / POINT_AMOUNT;
  51. capăt
  52. capăt
  53. X = a1_plot;
  54. Y = T_plot;
  55. min_x = 10;
  56. min_y = 2;
  57. contour_amount = 500;
  58. text_x = -1.7;
  59. text_y = 2,5;
  60. capăt
  61. % cifra
  62. % Mesh (X, Y, Z);
  63. figura
  64. contur (X, Y, Z, contour_amount);
  65. % mărci de afișare la nivel
  66. stai;
  67. plot (x (1), x (2), „k<-');
  68. % Punct minim de ieșire.
  69. plot (min_x, min_y, 'r *');
  70. titlu (title_plot);
  71. text (min_x-0,2, min_y + 0,4, 'MIN', 'BackgroundColor' [. 7 .7 .7])
  72. Punct de Vyvodnachalnoy% pe grafic
  73. text (x (1,1), x (2,1), 'A0'.
  74. 'BackgroundColor') [7 .7 .7.];
  75. % Decizia de retragere privind calendarul
  76. text (text_x, text_y.
  77. char ([ 'x1 =' num2str (x (1, LAST_NUMBER))].
  78. [Num2str 'X2 =' (x (2, LAST_NUMBER))].
  79. [ 'F () =' num2str (value_of_funct (LAST_NUMBER))].
  80. [ 'IteraŃiile -' num2str (number_iteration)]).
  81. 'BackgroundColor') [7 .7 .7.];
  82. capăt