Распределения. Библиотека генерации экспоненциального закона распределения, Листинг 2

 

Листинг 2
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
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
    public class FormulaExp
    {
        //Параметры внутри класса
        //Расчетные параметры
        private int N;
        private int Ntb;
        private float Lya;
        private double[] arX;
        private double[,] arTable;
        private double MatO_T;
        private double Disp_T;
        private double SKO_T;
        private double MatO;
        private double Disp;
        private double SKO;
        private double maxNi;
        private double maxVer;
        private double SumXi;
        private double IdXi2;
        //не передаваемые значения (не глобальные)
        private double[] arXSorted;
        private double MaxExp;
        private double sumExp = 0;
        private double avgExp = 0;
        private double sumExp2 = 0;
 
        //Передаваемые (глобальные) параметры
        //Обозначаем глобальные переменные класс для
        //передачи их в форму и из формы сюда
        public int _N
        {
            get { return N; }
            set { N = value; }
        }
        public int _Ntb
        {
            get { return Ntb; }
            set { Ntb = value; }
        }
        public float _Lya
        {
            get { return Lya; }
            set { Lya = value; }
        }
        public double[] _arX
        {
            get { return arX; }
            set { arX = value; }
        }
        public double[,] _arTable
        {
            get { return arTable; }
            set { arTable = value; }
        }
        public double _MatO_T
        {
            get { return MatO_T; }
            set { MatO_T = value; }
        }
        public double _Disp_T
        {
            get { return Disp_T; }
            set { Disp_T = value; }
        }
        public double _SKO_T
        {
            get { return SKO_T; }
            set { SKO_T=value; }
        }
        public double _MatO
        {
            get { return MatO; }
            set { MatO = value; }
        }
        public double _Disp
        {
            get { return Disp; }
            set { Disp = value; }
        }
        public double _SKO
        {
            get { return SKO; }
            set { SKO = value; }
        }
        public double _maxNi
        {
            get { return maxNi; }
            set { maxNi = value; }
        }
        public double _maxVer
        {
            get { return maxVer; }
            set { maxVer = value; } 
        }
        public double _SumXi2
        {
            get { return SumXi; }
            set { SumXi = value; }
        }
        public double _idXi2
        {
            get { return IdXi2; }
            set { IdXi2 = value; }
        }
        public void FuncExp()
        {
            //
            //В этой процедуре выполняется генерирование 
            //СВ с экспоненциальным распределением
            //
            //обозначаем не передаваемые переменные
            //переменная для генератора(датчика)
            double R = 0;
            //double x = 0;
            //создание датчика
            Random rnd12 = new Random();
            //создание массива для СВ
            arX = new double[N];
            //создаем сортировочный массив
            arXSorted = new double[N];
            //
            //открываем цыкл для расчета x
            //экспоненциальное распределение
            //
            for (int i = 0; i < N; i++)
            {
                //находим одну переменную R
                R = rnd12.NextDouble() * 1.0;
                //расчитываем i-ую СВ для массива
                //Мат формула Log в C# это тоже что и ln
                arX[i] = (-1.0) * (1.0 / Lya) * Math.Log(1.0 - R);
                //передаем массив X в другой для сортировки
                arXSorted[i] = arX[i];
                //Считаем сумму 
                sumExp += arX[i];
                sumExp2 += Math.Pow(arX[i], 2);
            }
 
            Array.Sort(arXSorted);
            MaxExp = arXSorted[N - 1];
            //Средняя величина
            avgExp = sumExp / (double)N;
            //Вызываем процедуры для расчет табличной части
            FuncTable();
        }
        public void FuncTable()
        {
            //
            //В этой процедуре выполняется заполнение массива для таблицы,
            //расчет практически и теоретических величин
            //
            arTable = new double[Ntb,7];
            double SumInt = 0;
            SumXi = 0;
            double Int = MaxExp / (double)Ntb; //шаг интервала по Макс(Експ)
            double[] arA = new double[Ntb];
            double[] arB = new double[Ntb];
 
            for (int a = 0; a < Ntb; a++)
            {
                arTable[a, 0] = a + 1; //arN
                SumInt += Int;
                arTable[a, 1] = SumInt; //arInt
                //Расчет теоретического количества попаданий
                arA[a] = arTable[a, 1] - Int / (double)2;
                arB[a] = Lya * Math.Exp((-1.0) * Lya * arA[a]);
 
                arTable[a, 5] = Int * arB[a]; //arPi
            }
            for (int an = 0; an < N; an++) //перебирание R
            {
                for (int a = 0; a < Ntb; a++) //массив попаданий
                {
                    if ((arTable[a, 1] - Int) < arX[an] && arX[an] < arTable[a, 1])
                    //условие, что
                    //если R попдает в интервал (значение при первом интервале arInt[0]=0.1)
                    // от 0 до Int (Int = 0.1 всегда), то попадание зачисляется в счетчик arNi[0]
                    {
                        arTable[a, 2]++; //счетчик попаданий
                        arTable[a, 3] = arTable[a, 5] * (double)N;//расчет вероятности попаданий теоритической
                        arTable[a, 4] = Math.Pow((arTable[a, 2] - arTable[a, 3]), 2) /
                            arTable[a, 3];//расчет хи2
                        arTable[a, 6] = arTable[a, 2] / (double)N;//расчет частоты arTable_П
                    }
                }
            }
            for (int i = 0; i < Ntb; i++)
            {
                SumXi += arTable[i, 4];
            }
            //Расчетные проверочные величины
            //Хи2
            IdXi2 = 14.06714;
            //Теория
            MatO_T = (double)1.0 / Lya;
            Disp_T = (double)1.0 / Math.Pow(Lya, 2);
            SKO_T = Math.Sqrt(Disp_T);
            //практика
            MatO = sumExp / (double)N;
            Disp = (sumExp2 / (double)N) - Math.Pow(avgExp, 2);
            SKO = Math.Sqrt(Disp);
 
            //
            //Максимальное число для:
            //попаданий
            maxNi = arTable[0, 5];
            for (int iMaxNi = 0; iMaxNi <Ntb; iMaxNi++)
            {
                if (arTable[iMaxNi, 2] > maxNi)
                {
                    maxNi = arTable[iMaxNi, 2];
                }
                else if (arTable[iMaxNi, 3] > maxNi)
                {
                    maxNi = arTable[iMaxNi, 3];
                }
                else
                {
                    maxNi = maxNi;
                }
            }
            //вероятностей
            for (int iMaxVer = 0; iMaxVer < Ntb; iMaxVer++)
            {
                if (arTable[iMaxVer, 5] > maxVer)
                {
                    maxVer = arTable[iMaxVer, 5];
                }
                else if (arTable[iMaxVer, 6] > maxVer)
                {
                    maxVer = arTable[iMaxVer, 6];
                }
                else
                {
                    maxVer = maxVer;
                }
            }
        }
    }

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