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