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

Лабороторная работа №1

.docx
Скачиваний:
3
Добавлен:
05.06.2023
Размер:
695.37 Кб
Скачать

ФГБОУ ВО

«Уфимский государственный авиационный технический университет»

Кафедра ТК

ОТЧЕТ

по лабораторной работе № 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:

Блок-схемы:

Вывод:

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