Часть 4. Целевая функцияСоздадим математическую модель процесса с коэффициентами a1=8 и T=1 и подберем их таким образом, чтобы при данных значениях целевая функция была минимальна. Выберем шаг h = 0.2. Точность EPSILON = 0.0001. Количество итераций ITERATION_AMOUNT = 1000. Результаты пошагового приближения показаны в таблице 3 “Зависимость CF от значений a1 и T”, график CF представлен на рис.7 CF1min = 8,901453 CF2min = 44,05068 CF3min = 132,7882
Таблица 3 «Зависимость CF от значений параметров a1 и T»
N = 91
(рис.7)
Листинг программы: 1. %Часть 2. Оптимизация покоординатно. 2. function SecondPart_OptimizationCoordinate(function_name, h, EPSILON, ITERATION_AMOUNT, a, b) 3. 4. global x; 5. global y; 6. 7. %Перем. для пропуска проверки условия на то, предыд. y min из последних трех или нет. 8. change_coord = 1; 9. %Для выхода из цикла, если кол-во. итераций больше ITERATION_AMOUNT. 10. number_iteration = 1; 11. 12. change = 1; 13. constant = 2; 14. i = 2; 15. 16. x(1,1) = 2; %первая координата, первое значение. 17. x(2,1) = 2; %вторая координата, первое значение. 18. x(1,2) = x(change,i-1) + h; %первая координата, второе значение. 19. x(2,2) = x(constant,i-1); %вторая координата, второе значение. 20. 21. y(1) = EllipseFunct_or_FunctRosenbrock(function_name, x(1,1), x(2,1), a, b); 22. new_value_of_function = EllipseFunct_or_FunctRosenbrock(function_name, x(1,2), x(2,2), a, b); 23. 24. if new_value_of_function > y(1) 25. h = h* (-1); 26. x(1,2) = x(change,i-1) + h; 27. y(2) = EllipseFunct_or_FunctRosenbrock(function_name, x(change,i), x(constant,i), a ,b); 28. 29. else 30. y(2) = new_value_of_function; 31. end 32. 33. %Цикл пока модуль разности функций больше точности эпсилон и количество итераций меньше ITERATION_AMOUNT(10000). 34. while (abs(y(i)-y(i-1)) > EPSILON && (number_iteration < ITERATION_AMOUNT)) 35. 36. number_iteration = number_iteration + 1; 37. i = i + 1; 38. change_coord = change_coord + 1; 39. 40. %прибавляем шаг к первой координате. 41. x(change,i) = x(change,i-1) + h; 42. %вторую координату переписываем. 43. x(constant,i) = x(constant,i-1); 44. %находим значение функции от новых значений. 45. new_value_of_function = EllipseFunct_or_FunctRosenbrock(function_name, x(1,i), x(2,i), a, b); 46. 47. %если функция от текущих значений больше функции от предыдущих, то h = h* (-1), ... иначе y(i) = new_value_of_function. 48. if new_value_of_function > y(i-1) 49. 50. %обнуляем последнее значение 51. x(change,i) = NaN; 52. i = i - 1; %чтобы вернуться к предыдущему минимальному значению функции 53. h = h* (-1); 54. 55. %Если после смены координаты, по которой шагаем сделали не меньше 3 точек, то делаем проверку min y из последних 3-х. значений. 56. if (change_coord >= 3) 57. 58. %если функция от значений на предыдущем шаге меньше текущих и меньше чем на шаге i-2, то меняем координату перемещения. 59. if y(i-1) >= y(i) 60. 61. %После перемены координаты по которой шагаем - обнуляем change_coord. 62. change_coord = 0; 63. if (constant == 1) 64. constant = 2; 65. change = 1; 66. 67. else 68. constant = 1; 69. change = 2; 70. end 71. 72. end 73. end 74. 75. else 76. y(i) = new_value_of_function; 77. end 78. end %конец цикла while 79. 80. %=====================Графическая часть========================== 81. %построение графика 82. x_contour = -5:0.1:5; 83. y_contour = -5:0.1:5; 84. [X, Y] = meshgrid(x_contour, y_contour); 85. 86. if strcmp(function_name, 'ELLIPSE') == 1 87. title_plot = ('Функция Эллипса'); 88. Z = (X/a).^2 + (Y/b).^2; 89. min_x = 0; 90. min_y = 0; 91. contour_amount = 50; 92. 93. elseif strcmp(function_name, 'ROSENBROCK') == 1 94. title_plot = ('Функция Розенброка'); 95. Z = 100 * (Y - X.^2).^2 + (1 - X).^2; 96. min_x = 1; 97. min_y = 1; 98. contour_amount = 200; 99. end 100. 101. %figure 102. %mesh(X,Y,Z); 103. figure 104. contour(X, Y, Z, contour_amount); 105. % отображение меток уровня 106. hold on; 107. plot(x(1, :), x(2, :), '<-'); 108. %вывод точки минимума. 109. plot(min_x, min_y, 'r*'); 110. title(title_plot); 111. text(min_x-0.2, min_y-0.4,'MIN') 112. % выводначальной точки на график 113. text(x(1,1), x(2,1), 'A0', ... 114. 'BackgroundColor',[.7 .7 .7]); 115. % вывод решения на график 116. text(-4.9, -3.9, ... 117. char(['x1 = ' num2str(x(1,i))], ... 118. ['x2 = ' num2str(x(2,i))], ... 119. ['y = ' num2str(y(i))], ... 120. ['итераций - ' num2str(number_iteration)]), ... 121. 'BackgroundColor',[.7 .7 .7]); 122. end
Код функции y = EllipseFunct_or_FunctRosenbrock: 1. %Функция для вычисления значения ф-ии. F(x1, x2) по Розенброку или по ф-ии. Эллипса. 2. function y = EllipseFunct_or_FunctRosenbrock(function_name, x_0_i, x_1_i, a, b) 3. 4. if strcmp(function_name, 'ROSENBROCK') == 1 5. y = 100 * (x_1_i - x_0_i.^2).^2 + (1 - x_0_i).^2; 6. return 7. 8. elseif strcmp(function_name, 'ELLIPSE') == 1 9. y = x_0_i.^2/a.^2 + x_1_i.^2/b.^2; 10. return 11. else 12. y = -1; 13. return 14. end 15. end
Популярное: Как построить свою речь (словесное оформление):
При подготовке публичного выступления перед оратором возникает вопрос, как лучше словесно оформить свою... Организация как механизм и форма жизни коллектива: Организация не сможет достичь поставленных целей без соответствующей внутренней... ![]() ©2015-2020 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (759)
|
Почему 1285321 студент выбрали МегаОбучалку... Система поиска информации Мобильная версия сайта Удобная навигация Нет шокирующей рекламы |