Добавил:
ArGoN4ik
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабы / 4 lab 10 vsr
.cpp#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;
}