Задание 3
Вычисление определённого интеграла методом прямоугольников:
Приближенное значение определенного интеграла вычисляется как сумма площадей N прямоугольников, построенных на интервале интегрирования [a,b]. Интервал [a,b] разбивается на N равных частей длиной h = (b-a)/N, на каждой из которых строится прямоугольник с высотой, равной значению функции f(xi) в центре участка с координатой xi = a+(i-0.5)h, где i=1,2,...,N
Формула прямоугольников для приближенного вычисления значения интеграла будет иметь вид
Вычисление определённого интеграла методом трапеций:
В методе трапеций интервал [a,b] разбивается на N равных частей длиной h=(b-a)/N, на каждой из которых строится трапеция. Приближенное значение интеграла определяется суммой площадей трапеций, построенных на интервале [a,b] , где xi =a+i* h :
Общая схема алгоритма
Разделы расчётно-графической работы:
- анимированная заставка;
- информация об авторе;
- вычисление функций с выводом результатов в виде таблицы;
- построение графиков функций;
- решение уравнения;
- вычисление определенного интеграла;
- выход из программы.
Для удобства взаимодействия с программой было разработано меню, управляемое клавишами стрелок на клавиатуре.
На рисунке 1 представлена схема алгоритма главной функции, в которой вызываются подфункции.
Рисунок 1 – Общая схема алгоритма
Детальные схемы алгоритмов
На рисунке 2 представлена схема алгоритма вычисления значений двух функций с выводом результатов в виде таблицы. Программа вычисляет значения функций на интервале [1; 1] в 12 равномерно распределённых точках, затем выводит результаты в виде таблицы, выделяя жёлтым цветом наибольшие значения функций и фиолетовым цветом наименьшие.
Рисунок 2 – Схема алгоритма построения таблицы значений функций
На рисунке 3 представлена схема алгоритма построения графиков функций F1 и F2. Сначала строятся оси координат Ox и Oy, затем выводятся надписи самих функций F1 и F2 и, наконец, выполняется построение графиков.
Рисунок 3 – Схема алгоритма построения графиков функций
Н
Рисунок 4 – Схема алгоритма решения уравнения
Продолжение рисунка 4 – Схема алгоритма решения уравнения
На рисунке 5 представлены схемы алгоритмов вычисления определенного интеграла методом прямоугольников и трапеций.
Рисунок 5 – Схема алгоритма вычисления определённого интеграла
Продолжение рисунка 5 – Схема алгоритма вычисления определённого интеграла
Текст программы
#include <math.h>
#include <iomanip>
#include <stdlib.h>
#include <windows.h>
#include <iostream>
#include <conio.h>
#include <locale.h>
using namespace std;
void drawNLO(HDC hdc, int x, int y, COLORREF color = RGB(99, 102, 106))
{
HBRUSH bodyBrush = CreateSolidBrush(color);
SelectObject(hdc, bodyBrush);
Ellipse(hdc, x - 40, y - 10, x + 40, y + 10);
DeleteObject(bodyBrush);
HBRUSH domeBrush = CreateSolidBrush(RGB(54, 69, 79));
SelectObject(hdc, domeBrush);
Ellipse(hdc, x - 20, y - 25, x + 20, y - 5);
DeleteObject(domeBrush);
}
void clearNLO(HDC hdc, int x, int y)
{
RECT r = { x - 60, y - 40, x + 60, y + 100 };
FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));
}
void Effect(HDC hdc, int x, int y)
{
for (int i = 0; i < 2; i++)
{
HBRUSH flash = CreateSolidBrush(RGB(95, 210, 180));
SelectObject(hdc, flash);
Ellipse(hdc, x - 60, y + 20, x + 60, y + 50);
DeleteObject(flash);
Sleep(100);
RECT r = { x - 65, y + 15, x + 65, y + 55 };
FillRect(hdc, &r, (HBRUSH)GetStockObject(BLACK_BRUSH));
Sleep(100);
}
}
void fly(HDC hdc, int startX, int startY, int targetX, int targetY)
{
const int step = 60;
for (int i = 0; i <= step; ++i)
{
float t = (float)i / step;
int x = (int)(startX + t * (targetX - startX));
int y = (int)(startY + t * (targetY - startY));
drawNLO(hdc, x, y);
Sleep(15);
clearNLO(hdc, x, y);
}
drawNLO(hdc, targetX, targetY);
Effect(hdc, targetX, targetY);
Sleep(300);
clearNLO(hdc, targetX, targetY);
}
void zastavka()
{
srand((unsigned)time(0));
HWND hwnd = GetConsoleWindow();
HDC hdc = GetDC(hwnd);
const int w = 1200;
const int h = 600;
const int m = 60;
RECT rect = { 0, 0, w, h };
FillRect(hdc, &rect, (HBRUSH)GetStockObject(BLACK_BRUSH));
POINT targets[4];
for (int i = 0; i < 4; i++)
{
targets[i].x = rand() % (w - 2 * m) + m;
targets[i].y = rand() % (h - 2 * m) + m;
}
for (int i = 0; i < 4; i++)
{
int startX = rand() % (w - 2 * m) + m;
int startY = -50;
fly(hdc, startX, startY, targets[i].x, targets[i].y);
Sleep(500);
}
_getch();
}
int maiшn()
{
zastavka();
return 0;
}
void avtor()
{
cout << "\n\n\n\n\n\n\n\t\t\t\t\t\t\x1b[36mРАСЧЁТНО-ГРАФИЧЕСКАЯ РАБОТА\n";
cout << "\t\t\t\t\t\t ПО ПРОГРАММИРОВАНИЮ\x1b[37m\n\n\n\n\n";
cout << "\t\t\t\t\t\t\x1b[96m БИБИКОВА АННА\n";
cout << "\t\t\t\t\t\t ФИТИКС, ИВТ-245\n";
cout << "\t\t\t\t\t\t 1 КУРС\n";
cout << "\t\t\t\t\t\t ОМСК, 2025\x1b[94m\n\n\n\n\n\n\n\n\n\n\n ";
}
void tabl()
{
int a = 1.0;
int b = 3.0;
int n = 15.0;
int i;
float X[15]{}, F1[15]{}, F2[15]{}, x, s;
s = fabs(b - a) / (n - 1);
x = a;
for (i = 0; i < n; i++)
{
F1[i] = sqrt(exp(x) - 1);
F2[i] = x * pow(log(x), 2);
X[i] = x;
x = x + s;
}
cout << fixed << setprecision(6);
float f1min = 5, f1max = 0, f2min = 5, f2max = 0;
for (i = 0; i < n; i++)
{
if (F1[i] > f1max)
f1max = F1[i];
if (F1[i] < f1min)
f1min = F1[i];
if (F2[i] > f2max)
f2max = F2[i];
if (F2[i] < f2min)
f2min = F2[i];
}
cout << "\n\t\t\t\t\t ------------------------------------------\n";
cout << "\t\t\t\t\t| i | x | f1 | f2 |\n";
cout << "\t\t\t\t\t ------------------------------------------\n";
for (i = 0; i < n; ++i) {
if (F1[i] == f1max)
cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | \x1b[33m" << F1[i] << " \x1b[37m| " << F2[i] << " |\n";
else if (F2[i] == f2max)
cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | \x1b[33m" << F2[i] << "\x1b[37m |\n";
else if (F1[i] == f1min)
cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | \x1b[35m" << F1[i] << " \x1b[37m| " << F2[i] << " |\n";
else if (F2[i] == f2min)
cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | \x1b[35m" << F2[i] << "\x1b[37m |\n";
else
cout << "\t\t\t\t\t| " << i + 1 << (i + 1 < 10 ? " | " : " | ") << X[i] << " | " << F1[i] << " | " << F2[i] << " |\n";
}
cout << "\n";
cout << "\n\n\n\n НАИБОЛЬШИЕ ЗНАЧЕНИЯ ФУНКЦИЙ ВЫДЕЛЕНЫ: \x1b[33m ЖЁЛТЫМ ЦВЕТОМ\x1b[37m.\n\n";
cout << " МИНИМАЛЬНЫЕ ЗНАЧЕНИЯ ФУНКЦИЙ ВЫДЕЛЕНЫ: \x1b[35m ФИОЛЕТОВЫМ ЦВЕТОМ\x1b[37m.\n\n\n\n\n ";
cout << "\n\n\n\n\n\n\n ";
_getch();
}
void grafic()
{
system("cls");
int flag;
HDC screen = GetDC(GetConsoleWindow());
HPEN pen = CreatePen(PS_DASH, 1, RGB(255, 255, 255));
SelectObject(screen, pen);
int start_x = 500;
int start_y = 270;
MoveToEx(screen, start_x - 400, start_y, NULL);
LineTo(screen, start_x + 400, start_y);
MoveToEx(screen, start_x, start_y - 250, NULL);
LineTo(screen, start_x, start_y + 250);
MoveToEx(screen, start_x + 380, start_y + 7, NULL);
LineTo(screen, start_x + 400, start_y);
LineTo(screen, start_x + 380, start_y - 7);
MoveToEx(screen, start_x + 7, start_y - 230, NULL);
LineTo(screen, start_x, start_y - 250);
LineTo(screen, start_x - 7, start_y - 230);
for (int i = -375; i <= 360; i += 25)
{
MoveToEx(screen, start_x + i, start_y - 5, NULL);
LineTo(screen, start_x + i, start_y + 5);
}
for (int i = -210; i <= 240; i += 25)
{
MoveToEx(screen, start_x - 5, start_y + i, NULL);
LineTo(screen, start_x + 5, start_y + i);
}
SetBkMode(screen, TRANSPARENT);
SetTextColor(screen, RGB(255, 255, 255));
TextOut(screen, start_x + 15, start_y - 240, L"Y", 1);
TextOut(screen, start_x + 380, start_y + 15, L"X", 1);
TextOut(screen, start_x - 12, start_y + 2, L"0", 1);
TextOut(screen, start_x + 10, start_y + 6, L"1", 1);
TextOut(screen, start_x - 17, start_y - 27, L"1", 1);
SetTextColor(screen, RGB(255, 153, 51));
TextOut(screen, start_x + 140, start_y - 260, L"y = x * pow(log(x), 2)", 25);
SetTextColor(screen, RGB(0, 153, 153));
TextOut(screen, start_x + 140, start_y - 240, L"y = sqrt(exp(x) - 1)", 25);
HPEN first_pen = CreatePen(PS_DASH, 1, RGB(255, 153, 51));
HPEN second_pen = CreatePen(PS_DASH, 1, RGB(0, 153, 153));
int i = 1;
for (double x = -20.0; x <= 20.0; x += 0.001)
{
SelectObject(screen, first_pen);
MoveToEx(screen, 30 * x + start_x, -30 * x * pow(log(x), 2) + start_y, NULL);
LineTo(screen, 30 * (x + 0.1) + start_x, -30 * x * pow(log(x), 2) + start_y);
SelectObject(screen, second_pen);
MoveToEx(screen, 30 * x + start_x, -30 * sqrt(exp(x) - 1) + start_y, NULL);
LineTo(screen, 30 * (x + 0.1) + start_x, -30 * sqrt(exp(x) - 1) + start_y);
i++;
if (i % 50 == 0) Sleep(0.5);
}
cout << "\n ";
_getch();
}
float function_uravn(float x)
{
return 2*x * log10(x) - 3;
}
float met_bis(float a, float b, float e)
{
float c;
while ((b - a) >= e)
{
c = (a + b) / 2;
if (function_uravn(c) == 0)
break;
else if (function_uravn(c) * function_uravn(a) < 0)
b = c;
else
a = c;
}
return c;
}
float met_hor(float a, float b, float e)
{
float c;
while ((b - a) >= e)
{
c = (a * function_uravn(b) - b * function_uravn(a)) / (function_uravn(b) - function_uravn(a));
if (function_uravn(c) == 0)
break;
else if (function_uravn(c) * function_uravn(a) < 0)
b = c;
else
a = c;
}
return c;
}
void uravnenie()
{
float a, b, e = 0.001;
cout << "\n y = 2x*log10(x-3)\x1b[36m\n\n";
cout << " ВВЕДИТЕ A: \x1b[36m";
cin >> a;
cout << "\n\x1b[96m ВВЕДИТЕ B: \x1b[96m";
cin >> b;
cout << "\n\x1b[94m ИНТЕРВАЛ: \x1b[37m[" << a << ", " << b << "]\x1b[37m\n\n";
cout << "\x1b[96m ТОЧНОСТЬ: \x1b[96m" << e << endl;
float x = met_bis(a, b, e);
cout << "\n\x1b[94m МЕТОД БИСЕКЦИИ: \x1b[94m" << x;
x = met_hor(a, b, e);
cout << "\n\n\x1b[96m МЕТОД ХОРД: \x1b[96m" << x;
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n ";
}
float function_integral(float x)
{
return (log10(1 + x) / (1 + x * x));
}
float met_pr(int N, float a, float b)
{
float h = (b - a) / N;
float integral = 0;
for (int i = 0; i < N; i++)
{
float x_i = a + i * h;
integral += function_integral(x_i) * h;
}
return integral;
}
float met_tr(int N, float a, float b)
{
float h = (b - a) / N;
float integral = 0;
integral += (function_integral(a) + function_integral(a + h)) / 2;
for (int i = 0; i < N; i++)
{
float x_i = a + i * h;
integral += function_integral(x_i) * h;
}
return integral;
}
void integral()
{
float a, b;
int N;
cout << "\n РЕШЕНИЕ ИНТЕГРАЛА \x1b[36mb|a(lg(1 + x) / (1 + x^2))dx)\x1b[37m\n\n";
cout << " ВВЕДИТЕ КОЛИЧЕСТВО ИТЕРАЦИЙ N: \x1b[36m";
cin >> N;
cout << "\n\x1b[37m ВВЕДИТЕ ГРАНИЦУ ИНТЕРВАЛА А: \x1b[36m";
cin >> a;
cout << "\n\x1b[37m ВВЕДИТЕ ГРАНИЦУ ИНТЕРВАЛА B: \x1b[36m";
cin >> b;
float resultat = met_pr(N, a, b);
cout << "\n\x1b[37m МЕТОД ПРЯМОУГОЛЬНИКОВ: \x1b[36m" << resultat << endl;
resultat = met_tr(N, a, b);
cout << "\n\x1b[37m МЕТОД ТРАПЕЦИЙ: \x1b[36m" << resultat;
cout << "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\x1b[37m ";
}
void close()
{
exit(0);
}
int main()
{
setlocale(LC_ALL, "ru");
int option = 0;
while (true)
{
system("color 0B");
system("cls");
cout << "\n\n\n\t\t\t\t\t\t \x1b[37m>\x1b[36m МЕНЮ \x1b[37m<\x1b[36m\x1b[0m\n\n";
cout << (option == 1 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ЗАСТАВКА\x1b[37m\n";
cout << (option == 2 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ОБ АВТОРЕ\x1b[37m\n";
cout << (option == 3 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ТАБЛИЦА\x1b[37m\n";
cout << (option == 4 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ГРАФИК\x1b[37m\n";
cout << (option == 5 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " УРАВНЕНИЕ\x1b[37m\n";
cout << (option == 6 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ИНТЕГРАЛ\x1b[37m\n";
cout << (option == 7 ? "\t\t\t\t\t\t\x1b[36m " : "\t\t\t\t\t\t > ") << " ВЫХОД\x1b[37m";
char input = _getch();
switch (input)
{
case 72:
option = (option > 1) ? option - 1 : 7;
break;
case 80:
option = (option < 7) ? option + 1 : 1;
break;
case '\r':
system("cls");
switch (option)
{
case 1:
zastavka();
break;
case 2:
avtor();
break;
case 3:
tabl();
break;
case 4:
grafic();
break;
case 5:
uravnenie();
break;
case 6:
integral();
break;
case 7:
close();
break;
}
system("pause");
break;
}
}
return 0;
}
