Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Математические методы / Лабораторные / Лабораторная №4 Вариант №19

.doc
Скачиваний:
35
Добавлен:
25.05.2017
Размер:
129.54 Кб
Скачать

МІНІСТЕРСТВО ОСВІТИ І НАУКИ

НАЦІОНАЛЬНИЙ АВІАЦІЙНИ УНІВЕРСИТЕТ

ІНСТИТУТ КОМП'ЮТЕРНИХ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ

Лабораторна робота №4

З дисципліни:”Математичні методи дослідження операцій”

Виконав студент групи ТП – 213:

Павлючук Олександр

Перевірив: Моржов В.І. ______

Київ 2017

Разработать программу и выполнить расчет координат минимального значения нелинейной двумерной целевой функции на базе ЦВМ методом Золотого сечения с покоординатным смещением.

В процессе выполнения домашнего задания необходимо:

1. Построить графическое отображение двумерной поверхности целевой функции, заданной массивом чисел – 1 балл.

2. Проанализировать характер целевой функции и дать описание ее основных характеристик – 1 балл.

3. Дать описание численного метода, который используется для расчета экстремального значения целевой функции – 1 балл.

4. Разработать алгоритм вычислительного процесса для определения численного значения экстремума двумерной целевой функции – 2 балла.

5. Разработать программу на любом алгоритмическом языке программирования – 4 балла.

6. Отладить на ЦВМ и выполнить контрольные расчеты, подтверждающие правильность работы программы – 2 балла.

7. Оформить отчет по выполнению лабораторной работы №4– 1 балл.

8. Защитить лабораторную работу №4 – 2 балла.

Вариант №19

Таблица нелинейной целевой функции F(x,y).

X

Y

0

1

2

3

4

5

6

7

8

9

10

11

12

13

14

0

55

50

45

40

35

30

25

20

15

20

25

35

40

45

50

-2

50

45

40

35

30

25

20

15

10

15

20

30

35

40

45

-4

45

40

35

30

25

20

15

10

5

10

15

25

30

35

40

-6

35

30

25

20

15

10

5

3

1

3

5

10

15

20

30

-8

40

35

30

25

20

15

10

5

2

2,5

5

10

15

20

25

-10

45

40

35

30

25

20

15

10

5

10

15

20

25

30

35

-12

50

45

40

35

30

25

20

15

10

15

20

25

30

35

40

-14

60

50

45

40

35

30

25

20

15

20

25

30

35

40

50

Графічне відображення.

Для того, щоб знайти найменше значення функції на поверхні, необхідно використати метод градієнтного спуску (у моєму випадку можна використовувати метод з постійним кроком) для кожного із 8 графіків, і маєчи точки екстремуму, вибрати з них найменшу. Або використати метод покомпонентного спуску.

Теоретичні відомості методу покомпонентного спуску.

Для нахождения минимального локального элемента используем метод золотого сечения. Метод золотого сечения — метод поиска экстремума действительной функции одной переменной на заданном отрезке. В основе метода лежит принцип деления отрезка в пропорциях золотого сечения. Является одним из простейших вычислительных методов решения задач оптимизации. Впервые представлен Джеком Кифером в 1953 году.

.5.Текст програми.

public class EnterPoint { private final static double PHI = (1 + sqrt(5)) / 2; private static boolean isLine = true; private static int x = 0; private static int y = 0; private static double eX; private static double eY; public static void main(String[] args) throws FileNotFoundException { double[][] arr = readFromFile("data.txt"); double[] answer = findMinimalElement(arr); System.out.printf("Найдено минимальное значение.\n" + "f(x,y)=%.2f Xi=%.1f Yj=%.1f", answer[0], answer[1], answer[2]); eX = arr[0][2] - arr[0][1]; eY = arr[1][0] - arr[2][0]; } private static double[] findMinimalElement(double[][] arr) { double[] indexesAndElement; double elementX = 0; double elementY = 0; double tempMin = arr[1][1]; for (int i = 1; i < arr.length; i++) { for (int j = 1; j < arr[i].length; j++) { if (tempMin > arr[i][j]) { tempMin = arr[i][j]; elementX = arr[0][j]; elementY = arr[i][0]; } } } indexesAndElement = new double[]{tempMin, elementX, elementY}; return indexesAndElement; } private static double[][] readFromFile(String fileName) throws FileNotFoundException { BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(fileName))); ArrayList<String> lines = new ArrayList<>(); reader.lines().forEach(lines::add); double[][] numbers = new double[lines.size()][lines.get(0).split("\\s+").length]; for (int i = 0; i < lines.size(); i++) { String[] strNumbers = lines.get(i).split("\\s+"); for (int j = 0; j < strNumbers.length; j++) { numbers[i][j] = Double.parseDouble(strNumbers[j]); } } return numbers; } private static int findMin(double a, double b, double e) { double x1, x2; while (true) { x1 = b - (b - a) / PHI; x2 = a + (b - a) / PHI; if (floor(x1) >= floor(x2)) { a = x1; } else b = x2; if (abs(b - a) < e) break; return (int) ((a + b) / 2); } return (int) ((a + b) / 2); } private static double[] findActualRow(double[][] arr) { if (isLine) { double[] row = new double[arr.length]; for (int i = 0; i < arr.length; i++) { row[i] = arr[i][x]; } isLine = false; return row; } else { double[] row = new double[arr[0].length]; for (int i = 0; i < arr[0].length; i++) { row[i] = arr[y][i]; } isLine = true; return row; } } }

Результати виконання програми.

Відповідь: F(x,y)=1, Xi=8, Yj=-6

Висновок: під час виконання лабораторної роботи із заданого масиву значень функцій і їх змінних було побудовано графіки; проаналізовано функції; розглянуто метод покопонентного спуску; розроблено алгоритм визначення чисельного значення екстремуму функції; розроблено програму згідно із методом пошуку мінімального значення у нашому випадку; відлагоджено роботу програми і виконано контрольні розрахунки, підтверджуючі правильність роботи програми; оформлено звіт, згідно із завдавнням.