Математические методы / Лабораторные / Лабораторная №4 Вариант №19
.doc
МІНІСТЕРСТВО ОСВІТИ І НАУКИ
НАЦІОНАЛЬНИЙ АВІАЦІЙНИ УНІВЕРСИТЕТ
ІНСТИТУТ КОМП'ЮТЕРНИХ ІНФОРМАЦІЙНИХ ТЕХНОЛОГІЙ
Лабораторна робота №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
Висновок: під час виконання лабораторної роботи із заданого масиву значень функцій і їх змінних було побудовано графіки; проаналізовано функції; розглянуто метод покопонентного спуску; розроблено алгоритм визначення чисельного значення екстремуму функції; розроблено програму згідно із методом пошуку мінімального значення у нашому випадку; відлагоджено роботу програми і виконано контрольні розрахунки, підтверджуючі правильність роботи програми; оформлено звіт, згідно із завдавнням.