Вычисление интеграла многочлена 3-ой степени с диапазоном интегрирования от a до b методом Монте-Карло

Программа для расчета определенного интеграла многочлена 3 степени методом Монте Карло. Пользователь вводит коэффициенты многочленов и диапазон интегрирования. Для метода монте карло пользователь вводит количество жеребьевок.( Численное интегрирование)
method_monte_carlo_CPP

#include <iostream>
#include <cstdlib>
#include <string>
#include <cstring>
#include <cmath>
#pragma hdrstop
#include <math.h>
#include <conio.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#pragma argsused
using namespace std;
static float RandFloat(double b0, double b1)
{
    return double(rand()) / RAND_MAX * (b1 - b0) + b0;
}
double func( double a, double b, double c, double d , double x)
{
    return a * pow(x,3) + b * pow(x,2) + c * x + d;                            //степенная функция
}
int main(int argc, char* argv[])
{
   system("chcp 1251"); //Русский
   system("cls");  
    int n,i;
    double a, b, c, d, up, down, e, f;
    cout << "Вычисление интеграла многочлена 3-ой степени с диапазоном интегрирования от a до b методом Монте-Карло " << endl;
    cout << "Введите коэффициенты полинома ax^3 +bx^2 +cx + d" << endl;
    cout << "a = ";
    cin >> a;
    if ( a == 0.0 )
    {
      cout << "Ошибка. Это не полином третей степени. Выход" << endl;
      exit( EXIT_SUCCESS );
    }
    cout << "b = ";
    cin >> b;
    cout << "c = ";
    cin >> c;
    cout << "d = ";
    cin >> d;
    cout << "Введите пределы интегрирования( от a до b, где a <= b )" << endl;
    cout << "Введите нижний предел: ";
    cin >> down;
    cout << "Введите верхний предел: ";
    cin >> up;
    cout << "Введите количество жеребьевок: ";
    cin >> n;    
    if (func(a, b, c, d, up)>=func(a, b, c, d, down))
    {        
        e=func(a, b, c, d, up);  //максимальное значение функции
        f=func(a, b, c, d, down); //мин. значение ф-ции
    }
    else
    {
        e=func(a, b, c, d, down); //max
        f=func(a, b, c, d, up); //min          
    }
    double *x=new double[n];
    double *y=new double[n];

    int count=0;
    for  (i=0; i<n; i++)
    {
        x[i]=RandFloat(down,up);                //случайные точки //X
        y[i]=RandFloat(f,e);
        if (y[i]<=func(a, b, c, d,x[i]))    
        count++;
    }
    double integral=count*(up-down)*(e-f)/n;
    printf("\nIntegral=%f", integral);
    getch();
    return 0;
}

Суть метода Монте Карло: Фигура лежит внутри некоторой области известной площади So. Случайным образом кидаем n точек в эту область. Подсчитываем количество m точек попавших внутрь фигуры (внутрь хотя бы одного прямоугольника). Площадь искомой фигуры Sf = So * m / n.

Добавить комментарий