Лабороторная работа №1
.docxФГБОУ ВО
«Уфимский государственный авиационный технический университет»
Кафедра ТК
ОТЧЕТ
по лабораторной работе № 1
по дисциплине «Методы оптимизации»
Тема:” Методы одномерной оптимизации”
Вариант № 6
Выполнил: студент гр. ИВТ-227Б
Проверил: доцент каф. ТК
Хасанова Н. В.
Уфа 2023
Целевая функция:
Область неопределенности: [-1;0]
График:
Расчетные таблицы:
Метод перебора:
№ |
ε |
|
|
N |
Eгар |
|
10-1 |
-0,4 |
0,83032 |
9 |
0,111111 |
|
10-2 |
-0.35 |
0.827188 |
99 |
0.010101 |
|
10-3 |
-0.352 |
0.827184 |
999 |
0.001001 |
|
10-4 |
-0.3517 |
0.827184 |
9999 |
0.00010001 |
|
10-5 |
-0.351734 |
0.827184 |
99998
|
0.0001 |
Метод дихотомии:
№ |
ε |
|
|
N |
Eгар |
|
10-1 |
-0.312875 |
0.829232 |
6 |
0.063375 |
|
10-2 |
-0.351592 |
0.827184 |
12 |
0.00791094 |
|
10-3 |
-0.352542 |
0.827185 |
18 |
0.000986543 |
|
10-4 |
-0.351746 |
0.827184 |
26 |
0.000062 |
|
10-5 |
-0.351738 |
0.827184 |
32 |
0.0000008 |
Метод золотого сечения:
№ |
ε |
|
|
N |
Nрас |
Eгар |
|
10-1 |
-0.309017 |
0.82966 |
5 |
5 |
0.072949 |
|
10-2 |
-0.354102 |
0.827192 |
10 |
10 |
0.00657781
|
|
10-3 |
-0.351589 |
0.827184 |
14 |
14 |
0.000959689 |
|
10-4 |
-0.351729 |
0.827184 |
19 |
19 |
0.000087 |
|
10-5 |
-0.351732 |
0.827184 |
24 |
24 |
0.000008 |
Метод поразрядного поиска:
№ |
ε |
|
|
N |
Eгар |
|
10-1 |
-0,375 |
0.827914 |
12 |
0.0625 |
|
10-2 |
-0.351562 |
0.827184 |
21 |
0.00390625 |
|
10-3 |
-0.351562 |
0.827184 |
26 |
0.000976562 |
|
10-4 |
-0.351746 |
0.827184 |
38 |
0.000061 |
|
10-5 |
-0.351734 |
0.827184 |
46 |
0.000004 |
Метод пассивно оптимальный:
№ |
ε |
|
|
N |
Eгар |
|
10-1 |
-0,4 |
0,83032 |
9 |
0,1 |
|
10-2 |
-0.35 |
0.827188 |
98 |
0.01 |
|
10-3 |
-0.352 |
0.827184 |
998 |
0.001 |
|
10-4 |
-0.3517 |
0.827184 |
9998 |
0.0001 |
|
10-5 |
-0.35173 |
0.827184 |
99998 |
0.00001 |
Метод деления отрезка пополам:
№ |
ε |
|
|
N |
Eгар |
|
10-1 |
-0.375 |
0.827914 |
7 |
0.0625 |
|
10-2 |
-0.351562 |
0.827184 |
13 |
0.0078125 |
|
10-3 |
-0.351562 |
0.827184 |
19 |
0.000976562 |
|
10-4 |
-0.351746 |
0.827184 |
27 |
0.00006 |
|
10-5 |
-0.35173 |
0.827184 |
33 |
0.000008 |
Код программы:
#include <iostream>
#include <math.h>
using namespace std;
double func(double x)
{
return pow(x, 2) + exp(x);
}
void perebor(double a, double b, double e) {
int N, k;
double EG;
N = (b - a) / e - 1;
double* x = new double[N + 1];
double* y = new double[N + 1];
for (int i = 1; i <= N; i++) {
x[i] = a + i * (b - a) / (N + 1);
y[i] = func(x[i]);
}
for (int i = 2; i <= N; i++)
{
if (y[i] < y[1])
{
y[1] = y[i];
k = i;
}
}
EG =(b - a) / N;
cout <<" x = "<< x[k] << "\n y= " << y[k] << "\nEG= " << EG << "\n N= " << N << endl;
system("pause");
}
void passivnyoptimalmetod(double a, double b,double d)
{
int N, i, k;
double * x, * y, X = 0, Y = 0, Eгар = 0;
cout << " N = "; cin >> N; ;
x = new double[N];
y = new double[N];
if (N % 2 == 0)
{
k = N / 2;
for (i = 1; i <= k; i++)
{
x[2 * i] = a + i * (b - a) / (k + 1);
x[2 * i - 1] = x[2 * i] - d;
}
for (i = 1; i <= N; i++)
y[i] = func(x[i]);
double yl = y[1];
int l = 1;
for (i = 1; i <= N; i++)
if (y[i] < yl)
{
yl = y[i];
l = i;
}
X = x[l];
Y = y[l];
Eгар = (x[l + 1] - x[l - 1]) / 2;
}
else
{
for (i = 1; i <= N; i++)
x[i] = a + i * (b - a) / (N + 1);
for (i = 1; i <= N; i++)
y[i] = func(x[i]);
double yl = y[1];
int l = 1;
for (i = 1; i <= N; i++)
if (y[i] < yl)
{
yl = y[i];
l = i;
}
X = x[l];
Y = y[l];
Eгар = (b - a) / (N + 1);
}
cout << " х = " << X << "\n y = " << Y << "\n Егарант = " << Eгар << "\n";
system("pause");
return;
}
void dichotomia(double a, double b, double e) {
int N=0, k;
double x, y, x0, EG, y1, y2, ec=e/100;
do {
x0 = (a + b) / 2;
y1 = func(x0 - ec);
y2 = func(x0 + ec);
N = N + 2;
if (y1 < y2) {
b = x0 + ec;
}
else {
a = x0 - ec;
}
} while (b - a > 2 * e);
x = (a + b) / 2;
y = func(x);
EG = (b - a) / 2;
cout <<" x = "<< x << "\n y= " << y << "\n N= " << N << "\nEG= " << EG << endl;
system("pause");
}
void zolotogocechenia(double a, double b, double E)
{
int k = 0;
double t = (1 + sqrt(5)) / 2, x1, x2, y1, y2, Eгар, x, y, Np;
Np = ceil((log((b - a) / (2 * E)) / log(t)) + 1);
x1 = b - (b - a) / t;
y1 = func(x1);
x2 = a + (b - a) / t;
y2 = func(x2);
k = 2;
do
{
if (y1 < y2) { b = x2; x2 = x1; y2 = y1; x1 = a + b - x2; y1 = func(x1); }
else { a = x1; x1 = x2; y1 = y2; x2 = a + b - x1; y2 = func(x2); }
k++;
} while ((b - a) > 2 * E * t);
{ if (y1 < y2) b = x2;
else a = x1;
}
x = (a + b) / 2;
y = func(x);
Eгар = (b - a) / 2;
cout << " x = " << x << "\n y = " << y << "\n N = " << k << "\n Nрасч = " << Np <<
"\n Егарант = " << Eгар << "\n";
system("pause");
}
void porazryadnypoisk(double a, double b,double E)
{
int k;
double h, x0, y0, x1, y1, Eгар, X, Y;
h = (b - a) / 4;
x0 = a;
y0 = func(x0);
k = 1;
cy:
x1 = x0 + h;
y1 = func(x1);
k++;
if (y0 > y1)
{
x0 = x1;
y0 = y1;
}
else goto sl;
if ((x0 > a) && (x0 < b))
goto cy;
sl:
if (abs(h) <= E)
{
X = x0;
Y = y0;
Eгар = h;
}
else
{
x0 = x1;
y0 = y1;
h = -h / 4;
goto cy;
}
cout << " х = " << X << "\n y = " << Y << "\n Егарант = " << Eгар << "\n k = " <<
k << "\n";
system("pause");
}
void delenie(double a, double b, double E) {
double EG;
double x[5];
double y[5];
x[2] = (a + b) / 2;
y[2] = func(x[2]);
int N = 1;
while (b - a > 2 * E) {
x[1] = (a + x[2]) / 2;
y[1] = func(x[1]);
x[3] = (x[2] + b) / 2;
y[3] = func(x[3]);
N += 2;
x[0] = a;
x[4] = b;
int l = 1;
for (int i = 1; i <= 3; i++)
if (y[i] < y[l]) l = i;
a = x[l - 1];
b = x[l + 1];
x[2] = x[l];
y[2] = y[l];
}
EG = (b - a) / 2;
cout << " х = " << x[2] << "\n y = " << y[2] << "\n Егарант = " << EG << "\n N = " <<
N << "\n";
system("pause");
}
int main() {
setlocale(LC_ALL, "Russian");
int j;
double a=-1, b=0,e;
cout << "e=";
cin >> e;
while (1) {
system("cls");
cout << "1. Метод перебора" << endl;
cout << "2. Метод дихотомии" << endl;
cout << "3. Метод золотого сечения" << endl;
cout << "4. Метод пассивно оптимальный" << endl;
cout << "5. Метод поразрядного поиска" << endl;
cout << "6. Метод деления отрезка попалам" << endl;
cout << "7. Изменить значение e" << endl;
cout << "8. Выход" << endl;
cout << "Ваш выбор - ";
cin >> j;
switch (j) {
case 1: perebor(a, b, e); break;
case 2: dichotomia(a, b, e); break;
case 3:zolotogocechenia(a, b, e); break;
case 4:passivnyoptimalmetod(a, b, e);break;
case 5:porazryadnypoisk(a, b, e); break;
case 7:cout << "e=";cin >> e; break;
case 6:delenie(a, b, e); break;
case 8: system("pause");
default: cout << " Ошибка: нет такого пункта меню.\n"; break;
}
}
system("pause");
}
График зависимости N от E:
Блок-схемы:
Вывод:
В ходе лабораторной работы были сравнены методы перебора, дихотомии, золотого сечения, поразрядного поиска, пассивный оптимальный, деления отрезка попалам. Для заданное целевой функции на заданном отрезке локализации лучшие результаты дал метод золотого сечения