Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовик отчет по мат. моделям.docx
Скачиваний:
0
Добавлен:
20.02.2020
Размер:
2.33 Mб
Скачать

Список использованных источников

  1. http://ru.wikipedia.org/wiki/Функция_Розенброка

  2. http://nsft.narod.ru/Programming/colmetopt.html

  3. http://www.mathworks.com

  4. http://www.exponenta.ru/soft/matlab/potemkin/book/matlab/chapter0/0_0.asp

  5. http://matlab.exponenta.ru

  6. Н.Ю. Золотых. Использование пакета Matlab в научной и учебной работе - Нижний Новгород, 2006 – 165с.

Приложение

Листинг программы

Главный файл проекта.

  1. clear all;

  2. clc;

  3. ITERATION_AMOUNT = 1000;

  4. EPSILON = 0.001; %Точность

  5. h = 0.2; %Шаг

  6. POINT_AMOUNT = 50; %количество точек

  7. %начальная точка

  8. %Эллипс

  9. x_point_Ellipse(1) = 2;

  10. x_point_Ellipse(2) = -2;

  11. %Розенброк

  12. x_point_Rosenbrock(1) = 4;

  13. x_point_Rosenbrock(2) = 3;

  14. %CF

  15. a1_T_point_CF(1) = 2;

  16. a1_T_point_CF(2) = 4;

  17. %a и b - значения радиусов для ф-ии. Эллипса.

  18. a = 3;

  19. b = 2;

  20. %исходные значения параметров функции W(s).

  21. a1 = 10;

  22. T = 2;

  23. ELLIPSE = 'ELLIPSE';

  24. ROSENBROCK = 'ROSENBROCK';

  25. CF_text = 'CF';

  26. %Часть 1. Эйлер.

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

  28. %Часть 2. Оптимизация покоординатно.

  29. %function [value_of_funct, x] = SecondPart_OptimizationCoordinate(function_name, h, EPSILON, ITERATION_AMOUNT, a, b, y_exp, number_y_exp, POINT_AMOUNT)

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

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

  32. %Часть 3. ГСЧ. CF

  33. [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)

  2. global y_Euler;

  3. ITERATION_AMOUNT = 300; %количество точек для первого графика.

  4. x_t = 5; %константа из задания x(t)

  5. h = 0.5;

  6. z1 = 0;

  7. z2 = 0;

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

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

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

  11. %free_term - свободный член.

  12. free_term = coeff_x_t*x_t;

  13. for i = 1:ITERATION_AMOUNT

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

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

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

  17. end;

  18. % figure

  19. % i = 1:ITERATION_AMOUNT;

  20. % plot(i,y_Euler);

  21. % title('Y теоретическое. график на 300 точек');

  22. %saveas(gcf, 'output', 'bmp');

  23. %оставляем из всех 300 точек только 50 (POINT_AMOUNT)

  24. j = 1;

  25. step_cycle = ITERATION_AMOUNT/POINT_AMOUNT;

  26. for i = 1:step_cycle:ITERATION_AMOUNT

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

  28. j = j + 1;

  29. end;

  30. % figure

  31. % i = 1:POINT_AMOUNT;

  32. % plot(i,y_Euler_50point);

  33. % title('Y теоретическое. график на 50 точек (через каждые 6)');

  34. end

Функция покоординатной оптимизации

  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)

  3. varlist = {'global X', 'global Y', 'global Z', 'T_plot', 'a1_plot'};

  4. %global_varlist = {'global T_plot','global a1_plot', 'global X', 'global Y', 'global Z'};

  5. %clear(varlist{:});

  6. %clear CF;

  7. clear (varlist{:});

  8. %global X;

  9. %global Y;

  10. %global Z;

  11. %Перем. для пропуска проверки условия на то, предыд. value_of_funct min из последних трех или нет.

  12. change_coord = 1;

  13. %Для выхода из цикла, если кол-во. итераций больше ITERATION_AMOUNT.

  14. number_iteration = 1;

  15. change = 1;

  16. constant = 2;

  17. i = 2;

  18. x(1,1) = x_start_point(1); %первая координата, первое значение.

  19. x(2,1) = x_start_point(2); %вторая координата, первое значение.

  20. x(1,2) = x(change,i-1) + h; %первая координата, второе значение.

  21. x(2,2) = x(constant,i-1); %вторая координата, второе значение.

  22. 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);

  23. 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);

  24. if new_value_of_function > value_of_funct(1)

  25. h = h* (-1);

  26. x(1,2) = x(change,i-1) + h;

  27. 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);

  28. else

  29. value_of_funct(2) = new_value_of_function;

  30. end

  31. %Цикл пока модуль разности функций больше точности эпсилон и количество итераций меньше ITERATION_AMOUNT(10000).

  32. while (abs(value_of_funct(i)-value_of_funct(i-1)) > EPSILON && (number_iteration < ITERATION_AMOUNT))

  33. number_iteration = number_iteration + 1;

  34. i = i + 1;

  35. change_coord = change_coord + 1;

  36. %прибавляем шаг к первой координате.

  37. x(change,i) = x(change,i-1) + h;

  38. %вторую координату переписываем.

  39. x(constant,i) = x(constant,i-1);

  40. %находим значение функции от новых значений.

  41. 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);

  42. %если функция от текущих значений больше функции от предыдущих, то h = h* (-1), ... иначе value_of_funct(i) = new_value_of_function.

  43. if new_value_of_function > value_of_funct(i-1)

  44. %обнуляем последнее значение

  45. x(change,i) = NaN;

  46. i = i - 1; %чтобы вернуться к предыдущему минимальному значению функции

  47. h = h* (-1);

  48. %Если после смены координаты, по которой шагаем сделали не меньше 3 точек, то делаем проверку min value_of_funct из последних 3-х. значений.

  49. if (change_coord >= 3)

  50. %если функция от значений на предыдущем шаге меньше текущих и меньше чем на шаге i-2, то меняем координату перемещения.

  51. if value_of_funct(i-1) >= value_of_funct(i)

  52. %После перемены координаты по которой шагаем - обнуляем change_coord.

  53. change_coord = 0;

  54. if (constant == 1)

  55. constant = 2;

  56. change = 1;

  57. else

  58. constant = 1;

  59. change = 2;

  60. end

  61. end

  62. end

  63. else

  64. value_of_funct(i) = new_value_of_function;

  65. end

  66. end %конец цикла while

  67. last_number = i;

  68. %построение графика

  69. draw_way_and_lines_level(function_name, x, last_number, value_of_funct, number_iteration, a, b, y_exp, number_y_exp, POINT_AMOUNT);

  70. end

Функция для вычисления значения ф-ии. F(x1, x2) по Розенброку, по ф-ии. Эллипса или целевой функции (CF).

  1. function value_of_funct = Ellipse_Rosenbrock_or_CF(function_name, x_1_i, x_2_i, a, b, y_exp, number_y_exp, POINT_AMOUNT)

  2. if strcmp(function_name, 'ROSENBROCK') == 1

  3. %if function_name == 'ROSENBROCK'

  4. value_of_funct = 100 * (x_2_i - x_1_i.^2).^2 + (1 - x_1_i).^2;

  5. return

  6. elseif strcmp(function_name, 'ELLIPSE') == 1

  7. %elseif function_name == 'ELLIPSE'

  8. value_of_funct = x_1_i.^2/a.^2 + x_2_i.^2/b.^2;

  9. return

  10. elseif strcmp(function_name, 'CF') == 1

  11. %elseif function_name == 'ELLIPSE'

  12. y_model = FirstPart_EulerMethod(x_1_i, x_2_i, POINT_AMOUNT);

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

  14. return

  15. else

  16. value_of_funct = -1;

  17. return

  18. end

  19. end

  1. %Часть 3. CF

  2. function [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 берем из 1 части.

  4. y_max = max(abs(y_teor));

  5. %delta_y = y max * Мю

  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. %Генератор случайных чисел. Треугольный шум.

  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 экспериментальных.

  22. % figure;

  23. % plot(y_exp(1, :), s_exp1);

  24. % title('Yexp1 - черный');

  25. % figure;

  26. % plot(y_exp(2, :), s_exp2);

  27. % title('Yexp2 - зеленый');

  28. % figure;

  29. % plot(i, y_exp(3, :), s_exp3, i, y_teor, s_teor);

  30. % title('Yexp3 - голубой. Yteor - красный');

  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. %Закидываем массивы CF1, CF2, CF3 в двумерный массив CF(3,:).

  38. size_CF(1) = size(CF1, 2);

  39. size_CF(2) = size(CF2, 2);

  40. size_CF(3) = size(CF3, 2);

  41. for i = 1:size_CF(1)

  42. CF(1, i) = CF1(i);

  43. end

  44. for i = 1:size_CF(2)

  45. CF(2, i) = CF2(i);

  46. end

  47. for i = 1:size_CF(3)

  48. CF(3, i) = CF3(i);

  49. end

  50. end

  1. %Часть 3.

  2. %Генератор случайных чисел. на дельта y_noise.

  3. %Random number generator. Треугольный шум.

  4. function [y_noise, x_noise] = RNG_Triangle(delta_y, POINT_AMOUNT)

  5. j = 1;

  6. while j <= POINT_AMOUNT

  7. %a - по горизонтальной прямой - аргумент. генерируем числа от -delta_y до delta_y.

  8. a = -delta_y + (delta_y-(-delta_y)).*rand();

  9. %b - по вертикальной прямой - функция. генерируем числа от 0 до 1/delta_y.

  10. b = 0 + (1/delta_y-0).*rand();

  11. %fprintf('Value_of_Function(a, delta_y) = %d\n', Value_of_Function(a, delta_y));

  12. %Если b меньше, то сгенерированная точка внутри треугольника.

  13. if RNG_Value_of_Function(a, delta_y) > b

  14. y_noise(j) = b;

  15. x_noise(j) = a;

  16. j = j + 1;

  17. end;

  18. end;

  19. %figure;

  20. %рисуем гистограмму.

  21. %hist(x_noise);

  22. end

  1. %Часть 3.

  2. %Вычисление значения функции для ГСЧ в зависимости от того аргуемент "+" или "-".

  3. function y_triangle = RNG_Value_of_Function(argument, delta_y)

  4. x1 = 0;

  5. y1 = 1/delta_y;

  6. y2 = 0;

  7. %значение по горизонтали (аргумента) больше или меньше нуля

  8. if argument > 0

  9. x2 = delta_y;

  10. else

  11. x2 = -delta_y;

  12. end;

  13. y_triangle = (argument - x1)*(y2 - y1)/(x2 - x1) + y1;

  14. %fprintf('y_triangle = %d\n', y_triangle);

  15. end

  1. %построение линий уровня и графика поиска min.

  2. function 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. if strcmp(function_name, 'ELLIPSE') == 1

  4. title_plot = ('Функция Эллипса');

  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. %точка MIN

  10. min_x = 0;

  11. min_y = 0;

  12. contour_amount = 50;

  13. %координаты вывода таблички с данными

  14. text_x = -4.8;

  15. text_y = -3.9;

  16. elseif strcmp(function_name, 'ROSENBROCK') == 1

  17. title_plot = ('Функция Розенброка');

  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. %точка MIN

  23. min_x = 1;

  24. min_y = 1;

  25. contour_amount = 200;

  26. %координаты вывода таблички с данными

  27. text_x = -4.8;

  28. text_y = -3.9;

  29. elseif strcmp(function_name, 'CF') == 1

  30. %title_plot = ('CF (Целевая функция)');

  31. title_plot = strcat('CF', num2str(number_y_exp), ' (Целевая функция)');

  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. %создаем матрицу значений неизвестных параметров для построения линий уровня.

  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 = %d\n', iter_amount_a1);

  45. %fprintf('iter_amount_T = %d\n', iter_amount_T);

  46. %Здесь создаем матрицу значений CF для построения линий уровня.

  47. for i = 1:iter_amount_T

  48. for j = 1:iter_amount_a1

  49. y_model = FirstPart_EulerMethod(a1_plot(i,j), T_plot(i,j), POINT_AMOUNT);

  50. Z(i, j) = sum((y_exp(number_y_exp, :)-y_model).^2)/POINT_AMOUNT;

  51. end

  52. end

  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. end

  61. %figure

  62. %mesh(X,Y,Z);

  63. figure

  64. contour(X, Y, Z, contour_amount);

  65. % отображение меток уровня

  66. hold on;

  67. plot(x(1, :), x(2, :), 'k<-');

  68. %вывод точки минимума.

  69. plot(min_x, min_y, 'r*');

  70. title(title_plot);

  71. text(min_x-0.2, min_y+0.4,'MIN', 'BackgroundColor',[.7 .7 .7])

  72. % выводначальной точки на график

  73. text(x(1,1), x(2,1), 'A0', ...

  74. 'BackgroundColor',[.7 .7 .7]);

  75. % вывод решения на график

  76. text(text_x, text_y, ...

  77. char(['x1 = ' num2str(x(1,last_number))], ...

  78. ['x2 = ' num2str(x(2,last_number))], ...

  79. ['f() = ' num2str(value_of_funct(last_number))], ...

  80. ['итераций - ' num2str(number_iteration)]), ...

  81. 'BackgroundColor',[.7 .7 .7]);

  82. end