геометрическая вероятность, интеграл

184
31 мая 2022, 14:20

Мне необходимо вычислить интеграл. Область G, ограниченная прямыми x=2, y=x и гиперболой xy=1, вписанная в прямоугольник D. Вычислить необходимо по формуле приведенной ниже. В условии дали ответ приблизительный 9/4. Я написал код, взял рандомные x и y которые могут войти в прямоугольник D (т.е Ig), подставил формулу из под интеграла (т.е. x^2/y^2) и вычислил сумму, а затем умножил все это на количество испытаний (1000) и площадь D, которая по идее по графику должна быть 1*1,5=1,5. Ответ не совсем сходится, подскажите пожалуйста, что не так сделал.

using namespace std;
int main() {
    srand(time(NULL));
    int n = 1000, flag = 0, bad_flag = 0;
    int pl;
    //points
    float x1 = 2, y1 = 0.5;
    float x2 = 1, y2 = 0.5;
    float x3 = 1, y3 = 2;
    float x4 = 2, y4 = 2;
    pl = 1.5 * 2;
    float x, y;
    float summ = 0;
    float a = 1, b = 1.5;
    float S = a * b;
    for (int i = 0; i < n; i++) {
        x = 1 + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 2));//1 3-1
        y = 0.5 + static_cast <float> (rand()) / (static_cast <float> (RAND_MAX / 2));// 0.5 3-1
        cout «"\n_______\nx-"« x;
        cout « "\ny-" « y;
        if (x <= 2 && x*y >= 1 && y <= x) {
            summ += pow(x, 2) / pow(y, 2);
        }
    }
    cout « endl « "s=" «S;
    cout «endl« endl «"vicislili integral="«(float)1 / n * S*summ;
    _getch();
}
Answer 1

У вас неправильный ответ от того, что площадь случайных чисел 2*2==4 не соотвествует к 1.5.

Генерируем правильно случайные точки: x = 1 .. 2 , y = 0.5 .. 2.

// g++ -lm -Wall -Wextra -std=c++11 inte.cpp -o inte
# include <iostream>
# include <cstdlib>
#include <cmath>
using namespace std;
int main() {
    srand(time(NULL));
    int n = 1000;
    float x, y;
    float summ = 0;
    float S = (2.0 - 1.0)*(2.0-0.5);
    for (int i = 0; i < n; i++) {
        x = 1.0 + static_cast <float> (rand()) /
          (static_cast <float> (RAND_MAX));//1 .. 2
        y = 0.5 + static_cast <float> (rand()) /
          (static_cast <float> (RAND_MAX)) * 1.5;// 0.5 .. 2
        if (x <= 2 && x*y >= 1 && y <= x) {
          cout <<"\n_______\nx = "<< x;
        cout << "\ny = " << y;
            summ += powf(x, 2) / powf(y, 2);
        }
    }
    cout << endl << "n=" <<n;
    cout << endl << "s=" <<S;
    cout << endl << endl <<"vicislili integral="<<
      (S / (float)n) * summ << endl;
}

Точность добавится, только если увеличить количество точек.

READ ALSO
Не работает ввод массива структур

Не работает ввод массива структур

Всем приветТакая проблема: нет возможности заполнить массив структур - программа тут же заканчивается, предлагая закрыть окно

181
Как получить uncompressed byte array (DirectShow)?

Как получить uncompressed byte array (DirectShow)?

Я использую DirectShow https://docsmicrosoft

284
Как написать текст символами в консоль Visual Studio?

Как написать текст символами в консоль Visual Studio?

Язык программирования с++Нужно вставить надпись

302
Ошибка [ilink64 Error] Error: Unresolved external в C++ Builder 10.3

Ошибка [ilink64 Error] Error: Unresolved external в C++ Builder 10.3

Начал изучать C++ Builder 103 и сразу столкнулся с непонятной ошибкой

180