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

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

Восстановить пароль Регистрация
 
Sapfira71
0 / 0 / 0
Регистрация: 19.11.2013
Сообщений: 2
19.11.2013, 17:23     Вычисление площади трапеции методом Монте-Карло #1
Здравствуйте, уважаемые форумчане! Возникла проблема при написании одной из программ курсовой работы (см. заголовок темы). Проблема 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. Еще интересует, правильно ли я написала вычисление времени выполнения одной итерации цикла (необходим результат в милисекундах). + Я еще не вводила контроль вводимых вручную значений (думаю, сама потом справлюсь).
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.11.2013, 17:23     Вычисление площади трапеции методом Монте-Карло
Посмотрите здесь:

Вычисление числа Пи методом Монте-Карло C++
Вычисление числа Пи методом Монте-Карло C++
Вычисление площади методом Монте-Карло C++
Вычисление объема произвольного тела методом Монте-Карло C++
Рассчет определенного интеграла методом Монте-Карло. C++
C++ Странный интеграл методом Монте-Карло
Таблица умножения методом Монте-Карло C++
C++ Вычисление интеграла методом Монте-Карло

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 18:39. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru