Знаходження мінімуму заданої цільової функції
З огляду на те, що метод покоордінатного спуску нульового порядку, він досить неточний. Через те, що функція Розенброка має яружний рельєф, дійти до точки мінімуму не вдалося. Точка зупинки в цьому випадку була досить далеко від точки мінімуму. У випадку з функцією еліпса точка мінімуму була досягнута за 21 ітерацію, при кроці h = 0.2. Незважаючи на це точка мінімуму заданої цільової функції була досягнута абсолютно точно за 91 ітерацію, при кроці h = 0.2, і точністю 0,0001.
Список використаних джерел
Головний файл проекту.
4. ITERATION_AMOUNT = 1000;
5. EPSILON = 0.001; % Точність
7. POINT_AMOUNT = 50; % Кількість точок
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 і b - значення радіусів для ф-ії. Еліпса.
24.% вихідні значення параметрів функції W (s).
28. ELLIPSE = 'ELLIPSE';
29. ROSENBROCK = 'ROSENBROCK';
32.% Частина 1. Ейлер.
33. y_teor = FirstPart_EulerMethod (a1, T, POINT_AMOUNT);
35.% Частина 2. Оптимізація покоординатно.
36.% function [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. ГСЧ. 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);
Функція Метод Ейлера.
1. function y_Euler_50point = FirstPart_EulerMethod (a1, T, POINT_AMOUNT)
3. global y_Euler;
5. ITERATION_AMOUNT = 300; % Кількість точок для першого графіка.
6. x_t = 5; % Константа із завдання x (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 - вільний член.
15. free_term = coeff_x_t * x_t;
17. for 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.% title ( 'Y теоретичне. Графік на 300 точок');
28.% saveas (gcf, 'output', 'bmp');
29.% залишаємо з усіх 300 точок тільки 50 (POINT_AMOUNT)
31. step_cycle = ITERATION_AMOUNT / POINT_AMOUNT;
32. for i = 1: step_cycle: ITERATION_AMOUNT
33. y_Euler_50point (j) = y_Euler (i);
38.% i = 1: POINT_AMOUNT;
40.% title ( 'Y теоретичне. Графік на 50 точок (через кожні 6)');
Функція покоординатно оптимізації
1.% Частина 2. Оптимізація покоординатно.
2. function [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. clear (varlist);
14.% Перем. для пропуску перевірки умови на те, Попер. value_of_funct min з останніх трьох чи ні.
15. change_coord = 1;
16.% Для виходу з циклу, якщо кількість. ітерацій більше ITERATION_AMOUNT.
17. number_iteration = 1;
23. x (1,1) = x_start_point (1); % Перша координата, перше значення.
24. x (2,1) = x_start_point (2); % Друга координата, перше значення.
25. x (1,2) = x (change, i-1) + h; % Перша координата, друге значення.
26. x (2,2) = x (constant, i-1); % Друга координата, друге значення.
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. if new_value_of_function> value_of_funct (1)
33. x (1,2) = x (change, i-1) + h;
34. value_of_funct (2) = Ellipse_Rosenbrock_or_CF (function_name, x (change, i), x (constant, i), a, b, y_exp, number_y_exp, POINT_AMOUNT);
37. value_of_funct (2) = new_value_of_function;
40.% Цикл поки модуль різниці функцій більше точності епсилон і кількість ітерацій менше ITERATION_AMOUNT (10000).
41. while (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.% додаємо крок до першої координаті. 48. x (change, i) = x (change, i-1) + h; 49.% другу координату переписуємо. 50. x (constant, i) = x (constant, i-1); 51.% знаходимо значення функції від нових значень. 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.% якщо функція від поточних значень більше функції від попередніх, то h = h * (-1). інакше value_of_funct (i) = new_value_of_function. 55. if new_value_of_function> value_of_funct (i-1) 57.% Обнуляємо останнє значення 58. x (change, i) = NaN; 59. i = i - 1; % Щоб повернутися до попереднього мінімального значення функції 62.% Якщо після зміни координати, по якій крокуємо зробили не менше 3 точок, то робимо перевірку min value_of_funct з останніх 3-х. значень. 63. if (change_coord> = 3) 65.% якщо функція від значень на попередньому кроці менше поточних і менше ніж на крок i-2, то міняємо координату переміщення. 66. if value_of_funct (i-1)> = value_of_funct (i) 68.% Після зміни координати по якій крокуємо - Обнуляємо change_coord. 69. change_coord = 0; 70. if (constant == 1) 16. value_of_funct = sum ((y_exp (number_y_exp, :) - y_model). ^ 2) / POINT_AMOUNT; 20. value_of_funct = -1;
Схожі статті