
Код программы
#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");
}
}
}