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

Лабы / 4 lab 10 vsr

.cpp
Скачиваний:
1
Добавлен:
26.01.2024
Размер:
2.15 Кб
Скачать
#define _USE_MATH_DEFINES
#define M_PI
#include <time.h>
#include <iostream>
#include <cmath>
#include <random>
using namespace std;

constexpr int K = 20000;
constexpr int N = K * 2;

double f(double x)
{
	return x * pow(sin(x), 3);
}

double rectInt(double a, double b) {
	double* X = new double[N + 1];
	double dx = (b - a) / N;
	for (int i = 0; i <= N; i++) {
		X[i] = a + dx * i;
	}
	double I = 0;
	for (int i = 1; i <= N; i++) {
		I += f(X[i - 1] + dx / 2) * dx;
	}
	return I;
}

double trapezeInt(double a, double b) {
	double* X = new double[N + 1];
	double dx = (b - a) / N;
	for (int i = 0; i <= N; i++) {
		X[i] = a + dx * i;
	}
	double I = (f(a) + f(b)) / 2 * dx;
	for (int i = 1; i <= N - 1; i++) {
		I += f(X[i]) * dx;
	}
	return I;
}

double simsponInt(double a, double b) {
	double* X = new double[N + 1];
	double dx = (b - a) / N;
	for (int i = 0; i <= N; i++) {
		X[i] = a + dx * i;
	}
	double I = (f(a) + f(b)) * dx / 3;
	for (int i = 0; i <= K - 1; i++) {
		I += 4 * f(X[2 * i + 1]) * dx / 3;
	}
	for (int i = 1; i <= K - 1; i++) {
		I += 2 * f(X[2 * i]) * dx / 3;
	}
	return I;
}

double montecarloInt(double a, double b) {
	double* X = new double[N + 1];
	default_random_engine gen;
	uniform_real_distribution<double> dist(a, b);
	for (int i = 0; i <= N; i++) {
		X[i] = dist(gen);
	}
	double I = 0;
	for (int i = 1; i <= N; i++) {
		I += f(X[i]) / N;
	}
	return I * (b - a);
}
double metmontcar(double a, double b)
{
	double s = 0;
	srand((unsigned)time(NULL));
	for (int i = 0; i < N; i++)
	{
		s += f(a + ((double)rand() / RAND_MAX * (b - a)));
	}
	s = s / (double)N * (b - a);
	return s;
}

int main() {
	setlocale(LC_ALL, "Rus");
	cout << "Реальное решение:  " << 0.7777777 << endl;
	cout << "Прямоугольник:  " << rectInt(0, M_PI / 2) << endl;
	cout << "Трапеция: " << trapezeInt(0, M_PI / 2) << endl;
	cout << "Симпсона: " << simsponInt(0, M_PI / 2) << endl;
	cout << "Монте-карло " << montecarloInt(0, M_PI / 2) << endl;
	cout << "Монте-карло(рандом другой) " << metmontcar(0, M_PI / 2) << endl;
	system("pause");
	return 0;
}
Соседние файлы в папке Лабы