За задание можно получить до 5 баллов, соблюдая следующие условия:
- Написано на C++ ( + 1 балл)
- Тестрование проводилось с использованием Unit-test ( + 1 балл)
- Задание зачтено ( +3 балла)
В отчете должно быть указано следующие:
- Титульный лист, где указаны ФИО преподавателя, номер задания, номер варианта
- Формулировка задания (картинка и уравнения)
- Ссылка на github-репозиторий с работающим кодом
- Реализуйте
Монте-КарлоилиФормулу Симпосона(в зависимости от варианта та или иная реализация будет удобнее) для расчета площади фигуры. - Вычислите расчетное значение площади криволинейной фигуры, используя интеграллы. Расчеты приведите. (Если вы не умеете еще рассчитывать, воспользуйтесь калькулятором, вбив уравнения)
- Проведите эксперимент с расчетом площади фигуры при разном числе N. Дайте таблицу испытаний/разбиений.
- На основе полученных данных ответьте на вопрос при каком N дальше не имеет смысла увеличивать число испытаний/разбиений?
- Насколько точно вы смогли в ходе испытаний приблизиться к действительному значению?
Примечание: Для реализации Unit-test необходимо использовать assertAlmostEqual (assertAlmostEqual(a, b, places=7)) для Python (Проверяет, что a и b равны с точностью до places десятичных знаков) для 3 раных значений n. Для C++ для проверки приближённого равенства естьAreEqual с параметром точности (tolerance). Пример: Assert::AreEqual(a, b, epsilon, L"Значения совпали с точностью.");
1 Пример расчета интегралла криволинейной фигуры
Необходимо определить площадь фигуры, которая ограничена параболой
и прямыми линиями

Изобразим линии на графике в декартовой системе координат.
На отрезке [1; 4] график параболы y = -x2 + 6x - 5 расположен выше прямой y = -(1 / 3)x - (1 / 2). В связи с этим, для получения ответа используем формулу, полученную ранее, а также способ вычисления определенного интеграла по формуле Ньютона-Лейбница:
Вычисляем определенный интеграл:
Подставляем пределы интегрирования:
Упрощаем:
Ответ:
2 Метод Монте-Карло для вычисления площади фигуры
Метод Монте-Карло — это статистический метод, использующий случайные числа для решения математических задач. Для вычисления площади фигуры можно применить этот метод следующим образом:
- Определение области для поиска: Укажите прямоугольную область, в которой будет заключена ваша фигура. Например, если фигура — это круг, то область может быть квадратом, в который вписан этот круг.
- Генерация случайных точек: Генерируйте случайные точки внутри указанной области.
- Проверка попадания в фигуру: Для каждой случайной точки проверяйте, попадает ли она в фигуру. Для круга, например, можно проверить, выполняется ли условие x2 + y2 ≤ r2, где r — радиус круга, а x и y — координаты точки.
- Расчет площади:
- Общее количество случайных точек, попавших в фигуру, делится на общее количество сгенерированных точек.
- Площадь фигуры будет пропорциональна площади всей области, умноженной на этот коэффициент:
A = ( frac{Количество точек внутри фигуры}{Общее количество точек} ) × Площадь области - Увеличение точности: Чем больше точек будет сгенерировано, тем точнее будет результат.
Пример Вычисление площади круга

import random
def monte_carlo_circle_area(radius, num_points=10000):
inside_points = 0
for _ in range(num_points):
x = random.uniform(-radius, radius)
y = random.uniform(-radius, radius)
if x**2 + y**2 <= radius**2:
inside_points += 1
# Площадь квадрата, в который вписан круг = (2*radius)^2
square_area = (2 * radius) ** 2
circle_area = (inside_points / num_points) * square_area
return circle_area
# Пример использования
radius = 5
estimated_area = monte_carlo_circle_area(radius)
print(f"Оцененная площадь круга с радиусом {radius}: {estimated_area}") #include <iostream>
#include <vector>
#include <cstdlib>
#include <ctime>
double monte_carlo_circle_area(double radius, int num_points = 10000) {
int inside_points = 0;
for (int i = 0; i < num_points; ++i) {
double x = ((double)rand() / RAND_MAX) * 2 * radius - radius;
double y = ((double)rand() / RAND_MAX) * 2 * radius - radius;
if (x * x + y * y <= radius * radius) {
inside_points++;
}
}
// Площадь квадрата, в который вписан круг = (2*radius)^2
double square_area = (2 * radius) * (2 * radius);
double circle_area = (inside_points / (double)num_points) * square_area;
return circle_area;
}
int main() {
srand(time(0)); // Инициализация генератора случайных чисел
double radius = 5;
double estimated_area = monte_carlo_circle_area(radius);
std::cout << "Оцененная площадь круга с радиусом " << radius << ": " << estimated_area << std::endl;
return 0;
}3 Формула Симпсона
Формула Симпсона — это численный метод интегрирования, который основан на приближении функции квадратичной параболой. Он позволяет более точно вычислять определённые интегралы по сравнению с методом прямоугольников или трапеций.
- Разбиение отрезка интегрирования:
- Выбирается отрезок [a, b], на котором вычисляется интеграл.
- Делим его на n равных частей (где n — чётное число), получая узлы разбиения.
- Вычисление значений функции:
- Определяем значения функции в узлах разбиения x0, x1, ..., xn.
- Применение формулы Симпсона:
где h = (b - a / n).
- Уточнение результата:
- Увеличение числа узлов разбиения n повышает точность интегрирования.

Пример Численное интегрирование функции:
import numpy as np
def simpson_rule(f, a, b, n):
if n % 2 == 1:
n += 1 # Делаем n четным
h = (b - a) / n
x = np.linspace(a, b, n+1)
fx = f(x)
integral = (h / 3) * (fx[0] + 4 * sum(fx[1:-1:2]) + 2 * sum(fx[2:-2:2]) + fx[-1])
return integral
# Пример использования
f = lambda x: x**2 # Интегрируемая функция
result = simpson_rule(f, 0, 1, 10)
print(f"Приближённое значение интеграла: {result}")#include <iostream>
#include <cmath>
double simpson_rule(double (*f)(double), double a, double b, int n) {
if (n % 2 == 1) n++; // Делаем n четным
double h = (b - a) / n;
double sum = f(a) + f(b);
for (int i = 1; i < n; i += 2)
sum += 4 * f(a + i * h);
for (int i = 2; i < n-1; i += 2)
sum += 2 * f(a + i * h);
return (h / 3) * sum;
}
double function(double x) {
return x * x; // Интегрируемая функция
}
int main() {
double result = simpson_rule(function, 0, 1, 10);
std::cout << "Приближенное значение интеграла: " << result << std::endl;
return 0;
}4 Варианты
y = x2 + 4
y = -x2 - 4

y = x
y = -x + 6

y = sin(x) + 3
y = sin(x) + 5

y = -2 + 0.5x
y = -2 - 0.5x
y = 2 + 0.5x

y = x2 + 4x
y = -x2 - 4x

y = -x + 8
y = x

y = 2sin(x) + 4
y = 0.5cos(x) + 1

y = 2x2 + 1
y = -2x2 + 7

y = sin(x)
y = cos(x)
y = sin(0.5x) - 0.5

y = x3 - 6x2 + 4
y = -x3 + 6x2 - 4

y = -2x + 12
y = 2x - 12
y = -2x + 4

y = 3x2 - 2
y = -x2 + 6

y = sin(x)
y = cos(x)
y = sin(0.5x) - 0.5

y = -x2 + 8

y = cos(x) + 2
y = cos(x) + 1

y = x
y = -x + 6

y = x3 - 12x2 + 4
y = -x3 + x2 - 4

y = sin(x)
y = cos(0.5x)
y = sin(0.5x) - 0.5

y = 3x2 - 2x
y = -x2 + 6x

y = 3sin(x) + 5
y = -2cos(x) + 3

y = x2
y = -x3 - 20

y = -3 + x
y = -3 - x
y = 3 + x

y = sin(x)
y = cos(x)
y = sin(0.5x) - 0.5

y = 3x2 - 2x - 6
y = -x2 + 6x + 3

y = 3cos(x) + 5
y = -2cos(x) + 3

y = 3
x = 5
x = 7

y = -x
y = x

y = -0.5x + 7
y = 0.5x + 1
y = -0.5x + 5

y = sin(x)
y = cos(0.5x)
y = sin(0.5x) - 0.5

y = x3 + 4x2
y = -x3 - 4x2
