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

Код программы

#include <stdafx.h>

#include <iostream>

#include <stdlib.h>

#include <locale.h>

#include <complex>

#include <math.h>

#include <string.h>

#include <fstream>

#include <conio.h>

#include <iomanip>

#include <Windows.h>

using namespace std;

const int G = 10000;

double f(double x) {

return 10*cos(x)+exp(x);

}

void perebor() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int i, j, N;

double a, b, xe, ye, min, E, * x, * y, Egar, Nras = 0;

cout << "Вы выбрали метод перебора." << endl;

cout << "Введите длину отрезка: а и b; число экспериментов N : " << endl;

cout << " a = "; cin >> a;

cout << " b = "; cin >> b;

cout << " N = "; cin >> N;

cout << endl;

x = new double[N];

y = new double[N];

Egar = (b - a) / (N + 1);

for (i = 1; i <= N; i++) {

x[i] = a + i * (b - a) / (N + 1);

y[i] = f(x[i]);

Nras += 1;

}

min = y[1];

j = 1;

for (i = 2; i <= N; i++)

if (y[i] < min) {

min = y[i];

j = i;

}

xe = x[j];

ye = y[j];

cout << "Полученные значения: " << endl;

cout << "x = " << xe << endl;

cout << "y = " << ye << endl;

cout << "Гарантированная точность = " << fixed << Egar << endl;

cout << "N расчетное = " << Nras << endl;

_getch();

}

void passopt()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int N, i, k, Nras = 0;

double d, * x, * y, X = 0, Y = 0, Egar = 0, a, b;

cout << "a = "; cin >> a;

cout << "b = "; cin >> b;

cout << "N = "; cin >> N; cout << " d = "; cin >> d;

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;

Nras += 2;

}

for (i = 1; i <= N; i++)

y[i] = f(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];

Egar = (x[l + 1] - x[l - 1]) / 2;

}

else

{

for (i = 1; i <= N; i++) {

x[i] = a + i * (b - a) / (N + 1);

Nras += 1;

}

for (i = 1; i <= N; i++)

y[i] = f(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];

Egar = (b - a) / (N + 1);

}

cout << "Полученные значения: " << endl;

cout << "x = " << X << endl;

cout << "y = " << Y << endl;

cout << "Гарантированная точность = " << Egar << endl;

cout << "N расчетное = " << Nras << endl;

system("pause");

return;

}

void porpoisk() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int i, j;

double a, b, N = 0, x0, y0, x1, y1, E, h;

cout << "Вы выбрали метод поразрядного поиска." << endl;

cout << "Введите данные: " << endl;

cout << "a = "; cin >> a;

cout << " b = "; cin >> b;

cout << " E = "; cin >> E;

cout << endl;

h = (b - a) / 4;

x0 = a;

y0 = f(x0);

N += 1;

cy:

x1 = x0 + h;

y1 = f(x1);

N++;

if (y0 > y1)

{

x0 = x1;

y0 = y1;

}

else goto sl;

if ((x0 > a) && (x0 < b))

goto cy;

sl:

if (abs(h) <= E) {

cout << endl << "x = " << x0 << endl;

cout << "y = " << y0 << endl;

cout << "Гарантированная точность = " << fixed << abs(h) << endl;

cout << "Количество экспериментов = " << N << endl;

_getch();

}

else {

x0 = x1;

y0 = y1;

h = -h / 4;

goto cy;

}

}

void delotrpop() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int i, j;

double a, b, N = 0, xe, ye, min, * x, * y, E, Egar;

cout << "Вы выбрали метод деления отрезка пополам." << endl;

cout << "Введите длину отрезка: а и b; точность E: " << endl;

cout << "a = "; cin >> a;

cout << " b = "; cin >> b;

cout << " E = "; cin >> E;

cout << endl;

x = new double[5];

y = new double[5];

x[2] = (a + b) / 2;

y[2] = f(x[2]);

N = 1;

while ((b - a) > 2 * E)

{

x[1] = (a + x[2]) / 2;

y[1] = f(x[1]);

x[0] = a;

x[4] = b;

x[3] = (b + x[2]) / 2;

y[3] = f(x[3]);

N += 2;

min = y[1];

j = 1;

for (i = 1; i <= 3; i++)

if (y[i] < min) {

min = y[i];

j = i;

}

a = x[j - 1];

b = x[j + 1];

x[2] = x[j];

y[2] = y[j];

}

xe = x[2];

ye = y[2];

Egar = (b - a) / 2;

cout << "Полученные значения: " << endl;

cout << "x = " << xe << endl;

cout << "y = " << ye << endl;

cout << "Количество экспериментов = " << N << endl;

cout << "Гарантированная точность = " << fixed << Egar << endl;

_getch();

}

void dihotomiya() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int i, j;

double a, b, N = 0, xe, ye, min, x2, x1, E, Egar, d;

cout << "Вы выбрали метод дихотомии." << endl;

cout << "Введите длину отрезка: а и b; точность E : , приближение d: " << endl;

cout << "a = "; cin >> a;

cout << " b = "; cin >> b;

cout << " E = "; cin >> E;

cout << " d = "; cin >> d;

cout << endl;

while ((b - a) > 2 * E) {

x1 = (a + b) / 2 - d;

x2 = (a + b) / 2 + d;

N += 2;

if (f(x1) < f(x2))

b = x2;

else

a = x1;

}

xe = (a + b) / 2;

ye = f(xe);

Egar = (b - a) / 2;

cout << "Полученные значения: " << endl;

cout << "x = " << xe << endl;

cout << "y = " << ye << endl;

cout << "Количество экспериментов = " << N << endl;

cout << "Гарантированная точность = " << fixed << Egar << endl;

system("pause");

}

void zolsech() {

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int N = 0;

double a, b, t, E, Egar, y1, y2, x, y, x1, x2, Np;

cout << "Вы выбрали метод золотого сечения." << endl;

cout << "Введите длину отрезка: а и b; точность E : " << endl;

cout << "a = "; cin >> a;

cout << " b = "; cin >> b;

cout << " E = "; cin >> E;

cout << endl;

t = (1 + sqrt(5)) / 2;

Np = ceil((log((b - a) / (2 * E)) / log(t)) + 1);

x1 = b - (b - a) / t;

y1 = f(x1);

x2 = a + (b - a) / t;

y2 = f(x2);

N = 2;

while ((b - a) > 2 * E * t)

{

if (y1 < y2) {

b = x2;

x2 = x1;

y2 = y1;

x1 = a + b - x2;

y1 = f(x1);

}

else {

a = x1;

x1 = x2;

y1 = y2;

x2 = a + b - x1;

y2 = f(x2);

}

N++;

}

if (y1 < y2)

b = x2;

else

a = x1;

Egar = (b - a) / 2;

x = (a + b) / 2;

y = f(x);

cout << endl;

cout << "Полученные значения: " << endl;

cout << "x = " << x << endl;

cout << "y = " << y << endl;

cout << "Количество экспериментов = " << N << endl;

cout << "N расчетное = " << Np << endl;

cout << "Гарантированная точность = " << fixed << Egar << endl;

_getch();

}

int main()

{

SetConsoleCP(1251);

SetConsoleOutputCP(1251);

int j;

while (1)

{

system("cls");

cout << "\nФункция: y = 10*cos(x)+exp(x)\n\n";

cout << "Выберите метод оптимизации функции:\n";

cout << "1 Метод перебора\n";

cout << "2 Пассивно-оптимальный метод\n";

cout << "3 Метод поразрядного поиска\n";

cout << "4 Метод деления отрезка пополам\n";

cout << "5 Метод дихотомии\n";

cout << "6 Метод Золотого сечения\n";

cout << "7 Выход из программы\n\n";

cout << "Ваш выбор (1-7): ";

cin >> j;

switch (j)

{

case 1: perebor(); break;

case 2: passopt(); break;

case 3: porpoisk(); break;

case 4: delotrpop(); break;

case 5: dihotomiya(); break;

case 6: zolsech(); break;

case 7: cout << "Завершение программы\n";

system("pause");

return(1);

default: cout << j << "Нет такого пункта в меню\n";

system("pause");

}

}

}