N
|
Объем выборок
|
M
|
Мат. Ожидание
|
S
|
Генеральное среднеквадратичное отклонение
|
Y1
|
Выборка №1
|
Y2
|
Выборка №2
|
k
|
Число интервалов
|
xmin
|
Минимальное значение выборки
|
xmax
|
Максимальное значение выборки
|
dx
|
Диапазон интервала
|
cnt1
|
Число элементов в каждом интервале первой выборки
|
cnt2
|
Число элементов в каждом интервале второй выборки
|
xmed
|
Среднее значение каждого интервала
|
xi1
|
Значение критерия Х2
|
xikr
|
Критическое значение Х2
|
Result1
|
Результат проверки гипотезы об идентичности двух плотностей
распределения
|
mid
|
Математическое ожидание выборки
|
sr
|
Выборочное среднеквадратичное отклонение
|
P
|
Вероятность попадания числа в каждый из интервалов
|
xi2
|
Значение критерия Х2
|
xi2kr
|
Критическое значение Х2
|
Result2
|
Результат проверки нулевой гипотезы о принадлежности случайного
числа нормальному закону распределения.
|
SX
|
Масштаб графика по Х
|
SY
|
Масштаб графика по Y
|
. Текст программы
System;System.
Collections. Generic;System. ComponentModel;System. Data;System.
Drawing;System. Text;System. Windows. Forms;oed4
{partial class Form1:
Form
{Form1 ()
{();
}double Laplas (double
X)
{F = 0;dt=Math. Abs
(X/1000);(int i = 0; i < 1000; i++)+= Math. Exp (-i * dt * i * dt / 2) *
dt;/= Math. Sqrt (2 * Math.PI)*Math. Sign(X);F;
}void button1_Click
(object sender, EventArgs e)
{
// получение данныхN =
Convert. ToInt32 (textBox1. Text); // объем выборкиM = Convert. ToDouble
(textBox2. Text); // мат. ожиданиеS = Convert. ToDouble (textBox3. Text); //
среднекв. отклонениеR = new Random(); // генератор случайных
чисел<double> Y1 = new List<double>(N); // выборка
// генерация выборки
№1(int i = 0; i < N; i++)
{sum = 0; // сумма 12
чисел(int ii = 0; ii < 12; ii++)+= (double) R. NextDouble(); // генерация
случайного числа. Add((M + S * (sum - 6))); // помещение числа в массив
}
// генерация выборки №2
- аналогично<double> Y2 = new List<double>(N);(int i = 0; i < N;
i++)
{sum = 0;(int ii = 0; ii
< 12; ii++)+= (double) R. NextDouble();. Add((M + S * (sum - 6)));
}k = (int) (1 + 3.32 *
Math. Log10 (N)); // число интервалов
// поиск пределовxmin =
Y1 [0], xmax = Y1 [0];(int i = 0; i < N; i++)
{(Y1 [i] < xmin) xmin
= Y1 [i];(Y1 [i] > xmax) xmax = Y1 [i];(Y2 [i] < xmin) xmin = Y2 [i];(Y2
[i] > xmax) xmax = Y2 [i];
}
{sum = 0; // сумма
значений интервала. Add(0);. Add(0);(int j = 0; j < N; j++) // анализ
интервала
{((Y1 [j] > xmin + i
* dx) && (Y1 [j] <= xmin + (i + 1) * dx))
{[i]++;+= Y1 [j];
}((Y2 [j] > xmin + i
* dx) && (Y2 [j] <= xmin + (i + 1) * dx))
{[i]++;+= Y2 [j];
}
}(cnt1 [i] + cnt2 [i] ==
0). Add(0);xmed. Add (sum / (cnt1 [i] + cnt2 [i])); // вычисление суммы(cnt2
[i]!= 0)+= (cnt1 [i] - cnt2 [i]) * (cnt1 [i] - cnt2 [i]) / (double) cnt2 [i];
// вычисление критерия
}
// вычисление
критического значения критерияdouble u = 1.645;v = k - 1;xikr = v * (1 - 2 / v
/ 9 + u * Math. Sqrt (2 / v / 9));Result1= «Нулевая гипотеза об отсутствии
статистически значиых различий между выборками»;(xi1<xikr) Result1+=
«Принимается»;Result1+= «Отвергается»;
// вычисление мат.
ожиданияmid = 0;(int i = 0; i < k; i++)+= xmed[i] * (cnt1 [i] + cnt2 [i]);/=
N*2;
// вычисление квадрата
отклоненияsr = 0;(int i = 0; i < k; i++)+= (xmed[i] - mid) * (xmed[i] - mid)
* (cnt1 [i] + cnt2 [i]);= Math. Sqrt (sr / (N*2 - 1) + (xmax - xmin) * (xmax -
xmin) / 12);<double> P = new List<double>(k); // вероятность
попадания величины в интервал(int i = 0; i < k; i++)
{a = xmin + dx * i;b =
xmin + dx * (i+1);p = Laplas((b - M) / S) - Laplas((a - M) / S);. Add(p);
}xi2 = 0;(int i = 0; i
< k - 1; i++)+= Math. Pow((cnt1 [i] + cnt2 [i] - 2 * N * P[i]), 2) / (2 * N
* P[i]);v2 = k - 3;xi2kr = v2 * (1 - 2 / v2 / 9 + u * Math. Sqrt (2 / v2 /
9));Result2 = «Гипотеза о нормальном законе распределения»;(xi2 < xi2kr)
Result2 += «Принимается»;Result2 += «Отвергается»;
// вывод графикаSX =
(float) pictureBox1. Width / k;SY = (float) pictureBox1. Height / N;bmp = new
Bitmap (pictureBox1. Width, pictureBox1. Height);gr = Graphics.
FromImage(bmp);. Clear (Color. White);
// оси(int i = 1; i <
k; i++)
{. DrawLine (Pens.
LightGray, i * SX, 0, i * SX, pictureBox1. Height);. DrawString (Convert.
ToString (xmin+ i * dx), Font, Brushes. Black,* SX, 0);
}(int i = 1; i < 4;
i++)
{. DrawLine (Pens.
LightGray, 0, i * SY * N / 4,. Width, i * SY * N / 4);. DrawString (Convert.
ToString (N - i * N / 4), Font,. Black, 0, i * SY * N / 4);
}
// график(int i = 0; i
< k; i++)
{f = 1 - 1 / Math. Sqrt
(2 * Math.PI) / sr * Math. Exp (-Math. Pow((xmin + dx * i - mid), 2) / 2 / sr
/sr);f1 = 1 - 1 / Math. Sqrt (2 * Math.PI) / sr * Math. Exp (-Math. Pow((xmin +
dx * (i + 1) - mid), 2) / 2 / sr/sr);. DrawLine (Pens. Red, i * SX, (float) f *
N * SY, (i + 1) * SX, (float) f1 * N * SY);. DrawLine (Pens. Black, i * SX,
(float) (N - cnt1 [i] - cnt2 [i]) * SY,
(i + 1) * SX, (float) (N
- cnt1 [i] - cnt2 [i]) * SY);
}(int i = 0; i < k-1;
i++). DrawLine (Pens. Green, (i+0.5f) * SX, (float) (1 - P[i]) * N * SY, (i +
1.5f) * SX, (float) (1 - P [i+1]) * N * SY);. Image = bmp;. Show («Критерий
согласия:» + xi1. ToString() + «\n» +
«крит. значение» + xikr.
ToString() + «\n»++»\n»+
«Математическое
ожидание» + mid. ToString() +
«среднеквадратичное
отклонение» + sr. ToString() +
«Критерий согласия:» +
xi2. ToString() + «\n» +
«крит. значение» +
xi2kr. ToString() + «\n»++»\n»);
}
}
}
3. Шаблон ввода
входных данных
4. Результаты работы
программы
алгоритм программа плотность пирсонг
Выводы
Был разработан алгоритм и написана
программа на языке С#, генерирующая значения
случайных величин, имеющих нормальный закон распределения. С помощью ее удалось
проверить гипотезу об идентичности двух плотностей распределения, используя
критерий -Пирсона, а также проверить гипотезу о принадлежности случайного
числа нормальному распределению.