Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Sapfira71
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 2
#1

Вычисление площади трапеции методом Монте-Карло - C++

19.11.2013, 17:23. Просмотров 479. Ответов 0
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане! Возникла проблема при написании одной из программ курсовой работы (см. заголовок темы). Проблема 1: собственно, в С++ (консоль), насколько я поняла, нет рандома, в котором и границами, и генерируемыми числами были бы double-значения (плюс равномерное распределение, которое на целых числах выглядело бы так: xA + rand()*(xC-xA), насколько я знаю). Проблема 2: как ни странно, не могу сделать божескую таблицу результатов. Огромная просьба помочь, ибо по первой проблеме я уже, кажется, излазила все, что можно, но результаты не подходили, а по второй не получается из-за рук кривых). Код представлен ниже, если кто еще какие проблемы увидит, буду премного благодарна.
main1.cpp
C++
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
#include <iostream>
#include "class.h"
#include <time.h>
#include <math.h>
#include <random>
using namespace std;
double koef(Point a, Point b)
{
   return (double)(b.Y - a.Y) / (double)(b.X - a.X);
}
double koefb(Point a, Point b)
{
   return a.Y-koef(a, b)*a.X;
}
int main()
{
    setlocale(LC_ALL, "rus");
    int xa=0, ya=0, xb=0, yb=0, xc=0, yc=0, xe=0, ye=0;
    double b1, b2, k1, k2;
    srand(time(NULL));
    cout << "Вычисление площади трапеции методом Монте-Карло  \n";
    cout << "------------------------------------------------\n";
    cout << "    ^ y                                          \n";
    cout << "    |                   b               c        \n";
    cout << "    |       ------------o---------------o       \n";
    cout << "    |      |            <<<<<<<<<<<<<<<<|        \n";
    cout << "    |      |          <<<<<<<<<<<<<<<  |         \n";
    cout << "    |      |        <<<<<<<<<<<<<< |             \n";
    cout << "    |      |      <<<<<<<<<<<<<        |         \n";
    cout << "    |      |    <<<<<<<<<<<<       |             \n";
    cout << "    |      |  <<<<<<<<<<<      |                 \n";
    cout << "    |      |<<<<<<<<<<         |    x            \n";
    cout << "    |------o---------o----------------------->  \n";
    cout << "    0      a         e                           \n";
    cout << "                                                 \n";
    cout << "------------------------------------------------\n";
metka1:
    cout << "Выберете необходимый пункт.\n";
    cout << "1 - Контрольный пример 1.\n";
    cout << "2 - Контрольный пример 2.\n";
    cout << "3 - Контрольный пример 3.\n";
    cout << "4 - Ввести значения вручную.\n";
    int n; cin >> n;
    switch (n)
    {
    case 1:
              xa=1; ya=0; xb=6; yb=10; xc=10; yc=10; xe=5; ye=0;
              goto metka2;
    case 2:
              xa=100; ya=0; xb=150; yb=300; xc=250; yc=300; xe=250; ye=0;
              goto metka2;
    case 3:
              xa=100; ya=0; xb=150; yb=300; xc=250; yc=300; xe=300; ye=0;
              goto metka2;
    case 4:
              cout << "Введите значения вручную (a.x, a.y, b.x, b.y, c.x, c.y, e.x, e.y):\n";
              cin >> xa >> ya >> xb >> yb >> xc >> yc >> xe >> ye; cout << endl;
              goto metka2;
    }
metka2:
    Point A = Point(xa, ya);
    Point B = Point(xb, yb);
    Point C = Point(xc, yc);
    Point E = Point(xe, ye);
    Point rands = Point();
    Rect Rec= Rect(A, B, C, E);
    cout << "Точки имеют координаты:\n";
    cout << "Точкa A: (" << A.X << ";" << A.Y << ")\n";
    cout << "Точкa B: (" << B.X << ";" << B.Y << ")\n";
    cout << "Точкa C: (" << C.X << ";" << C.Y << ")\n";
    cout << "Точкa E: (" << E.X << ";" << E.Y << ")\n";
    cout << "Точная площадь трапеции: " << Rec.TrapSquare(A, B, C, E) << "\tПлощадь описанного прямоугольника: " << Rec.RectSquare(A, B, C, E) << endl;
    b1 = koefb(A, B);
    b2 = koefb(E, C);
    k1 = koef(A, B);
    k2 = koef(E, C);
    cout << "-----------------------------------------------------------------\n";
    cout << "|  Количество |  Точек   |    Площадь   |Погрешность|   Время   | \n";
    cout << "|    точек    |  попало  |              |    (%)    |    (ms)   | \n";
    cout << "-----------------------------------------------------------------\n";
    for (int N = 1000; N < 100000000; N *= 10)
    {
       int vnutri = 0;
       time_t start = time(NULL)*1000;
       for (int i = 0; i < N; i++)
       {
          if (C.X >E.X)
          {
            rands.X = ((C.X - A.X) * ((double)rand() / (double) RAND_MAX)) + C.X;
            rands.Y = ((B.Y - A.Y) * ((double)rand() / (double) RAND_MAX)) + A.Y;
            if ((rands.Y <= k1 * rands.X + b1) && (rands.Y >= k2 * rands.X + b2))
               vnutri++;
          }
          if (C.X==E.X)
          {
            rands.X = ((C.X - A.X) * ((double)rand() / (double) RAND_MAX)) + A.X;
            rands.Y = ((B.Y - A.Y) * ((double)rand() / (double) RAND_MAX)) + A.Y;
            if ((rands.Y <= k1 * rands.X + b1))
               vnutri++;
          }
          if (C.X<E.X)
          {
            rands.X = ((E.X - A.X) * ((double)rand() / (double) RAND_MAX)) + A.X;
            rands.Y = ((B.Y - A.Y) * ((double)rand() / (double) RAND_MAX)) + A.Y;
            if ((rands.Y <= k1 * rands.X + b1) && (rands.Y <= k2 * rands.X + b2))
               vnutri++;
          }
       }
       time_t end = time(NULL)*1000;
       double pltrmc = Rec.RectSquare(A, B, C, E) * vnutri / N;
       time_t TimeResult = end - start;
       double Pogr = (abs(Rec.TrapSquare(A, B, C, E) - pltrmc) / Rec.TrapSquare(A, B, C, E)) * 100;
       cout << "|" << N << "    |" << vnutri << "\t|" << pltrmc << "\t|" << Pogr << "\t|" << TimeResult << "\t|\n";
       cout << "|_____________|__________|______________|___________|___________| \n";
    }
    cout << "Выберете дальнейшее действие:\n";
    cout << "1 - Оставить текущие координаты, и сгенерировать новые точки\n";
    cout << "2 - Изменить текущие координаты, и сгенерировать новые точки\n";
    cout << "3 - Выйти из программы\n";
    int vib;
    cin >> vib;
    switch (vib)
    {
       case 1: goto metka2;
       case 2: goto metka1;
       case 3: break;
    }
    system("pause");
    return 0;
}
class.h
C++
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
#include <iostream>
using namespace std;
class Point
{
    public: int X, Y;
    public: 
    Point()
    {
       X = 0;
       Y = 0;
    }
    Point(int x, int y)
    {
       X = x;
       Y = y;
    }
};
class Rect
{
    public: Point A, B, C, E;
    public: 
        Rect(Point a, Point b, Point c, Point d)
        {
            A = a;
            B = b;
            C = c;
            E = d;
        }
        double RectSquare(Point a, Point b, Point c, Point e)
        {
            if (e.X<=c.X) return ((double)(b.Y - a.Y) * (double)(c.X - a.X));
            else return ((double)(b.Y - a.Y) * (double)(e.X - a.X));
        }
        double TrapSquare(Point a, Point b, Point c, Point e)
        {
            return (((double)(c.X - b.X + e.X - a.X) / 2) * (double)(b.Y - a.Y));
        }
};
P.S. Еще интересует, правильно ли я написала вычисление времени выполнения одной итерации цикла (необходим результат в милисекундах). + Я еще не вводила контроль вводимых вручную значений (думаю, сама потом справлюсь).
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 17:23
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Вычисление площади трапеции методом Монте-Карло (C++):

Вычисление площади методом Монте-Карло - C++
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло площади S тела, ограниченного кривыми x*y = a и x + y =...

Определение площади заштрихованной фигуры методом Монте-Карло - C++
Составить программу для определения методом Монте-Карло пло- щади заштрихованой фигуры. Вычислить фактическую площадь и сравнить ее с...

Составить программу для определения методом Монте-Карло площади заштрихованой фигуры - C++
Всем привет! Помогите,пожалуйста , решить задачу .Нужно найти площадь фигуры методом Монте Карла.Я про этот метод впервые слышу ,поэтому...

Вычисление интеграла методом Монте-Карло - C++
Нужно вычислить интеграл, как показано на первой картинке внизу темы. На второй картинке сам интеграл. Написал программу, но она выдает это...

Вычисление интеграла методом Монте-Карло - C++
Здравствуйте! Задача такая: пользователь в текстовом файле задает координаты точек (любое количество точек), программа считывает...

Вычисление числа Пи методом Монте-Карло - C++
Решаю задачи по рандомным числам и столкнулся вот с такой&quot;Вычисление числа Пи методом Монте-Карло&quot;. Подскажите как это реализовать в С++,...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.11.2013, 17:23
Привет! Вот еще темы с ответами:

Вычисление числа Пи методом Монте-Карло - C++
Всем доброго время суток. Написать программу для вычисления значения \pi с помощью метода Монте-Карло. Для этого рассмотреть квадрат с...

Вычисление интеграла геометрическим методом Монте-Карло - C++
Всем доброго времени суток. В универе дали задание: вычислить интеграл \int_{0}^{1}dx\int_{0}^{1-x}(1-x-y)dy геометрическим методом...

Вычисление объема произвольного тела методом Монте-Карло - C++
Всем доброго время суток. Написать программу для вычисления методом Монте-Карло объема V тела, ограниченного поверхностями: z = {x}^{2}...

Метод Монте-Карло в вычислении площади многоугольника - C++
Ребята, добрый день!! Мне нужно набросать программу для вычисления площади выпухлого n-угольника с использованием ООП и STL; Помогите...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru