
Программа для расчета определенного интеграла многочлена 3 степени методом Монте Карло. Пользователь вводит коэффициенты многочленов и диапазон интегрирования. Для метода монте карло пользователь вводит количество жеребьевок.( Численное интегрирование)
method_monte_carlo_CPP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 | #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.