Формування вхідних потоків і контролю їх якості для комп’ютерного моделювання складних систем статистичними методами

Інформація про навчальний заклад

ВУЗ:
Національний університет Львівська політехніка
Інститут:
Не вказано
Факультет:
Не вказано
Кафедра:
Не вказано

Інформація про роботу

Рік:
2009
Тип роботи:
Звіт
Предмет:
Інформаційні технології
Група:
ПІ

Частина тексту файла (без зображень, графіків і формул):

Міністерство освіти і науки України Національний університет “Львівська політехніка” Інститут Комп’ютерних наук та Інформаційних технологій Кафедра ПЗ Звіт з лабораторної роботи №3 На тему: “ Формування вхідних потоків і контролю їх якості для комп’ютерного моделювання складних систем статистичними методами” з дисципліни “ Моделювання ПЗ ” Мета роботи: одержання послідовностей псевдовипадкових квазірівномірно розподілених чисел запропонованими методами та перевірка їх якості. Завдання: Одержати послідовності псевдовипадкових квазірівномірно розподілених чисел при заданих параметрах для кожного з нижчевказаних способів: методу серединних квадратів; мультиплікативного методу; за допомогою вбудованих функцій із програмного забезпечення комп’ютера. Кожну з генерованих послідовностей перевірити на рівномірність двома методами: за гістограмою; за непрямими ознаками. Кожну з генерованих послідовностей провірити на незалежність методом, основаним на обчисленні кореляційного моменту. Перевірити одержані послідовності на стохастичність. Код програми Метод серединних квадратів using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Lab1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private static int t = 1; private static int count = 20; #region Метод серединних квадратів private void button1_Click(object sender, EventArgs e) { List<double> mas = new List<double>(); try { Output1.Clear(); double X1 = double.Parse(textBox1.Text); int N = int.Parse(textBox2.Text); int length = X1.ToString().Length - 2; if (length % 2 == 1) length++; StringBuilder sb = new StringBuilder(); string format = "{0:F" + length * 2 + "} "; string format_small = "{0:F" + length + "} "; sb.AppendFormat(format_small, X1); double Xi = X1; for (int i = 1; i < N; i++) { try { string tmp; Xi = Xi * Xi; tmp = string.Format(format, Xi); Xi = double.Parse(" 0," + tmp.Substring(length / 2 + 2, length)); mas.Add(Xi); sb.AppendFormat(format_small, Xi); } catch { } } Output1.Text = sb.ToString(); } catch (System.FormatException exc) { MessageBox.Show("Помилка при введенні даних для методу серединних квадратів"); } #region обчислення кореляційного моменту int NN = mas.Count; double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0; for (int i = 0; i < NN - t; i++) { SXi += mas[i]; SXit += mas[i + t]; SXiXit += mas[i] * mas[i + t]; SXi2 += mas[i] * mas[i]; SXit2 += mas[i + t] * mas[i + t]; } double DXi, DXit; DXi = 1.0 / (NN - t) * SXi2 - 1.0 / ((NN - t) * (NN - t)) * SXi * SXi; DXit = 1.0 / (NN - t) * SXit2 - 1.0 / ((NN - t) * (NN - t)) * SXit * SXit; double Pt; Pt = (1.0 / (NN - t) * SXiXit - (1.0) / ((NN - t) * (NN - t)) * SXi * SXit) / Math.Sqrt(DXi * DXit); textBox3.Text = Pt.ToString(); double B = 1.0 / NN; double rhs = (1.0 - B) * Math.Sqrt(1.0 / NN); if (Math.Abs(Pt) <= rhs) label5.Text = "Послідовність кореляційно незалежна"; else label5.Text = "Послідовність залежна"; #endregion // кінець обчислення кореляційного моменту #region Перевірка на стохастичність double hi2 = 0; int d = 5; // кількість підінтервалів double[] mas1 = new double[d]; double[] p = new double[d]; double cnt = 0; int a = 0; double dl = 1.0 / d; for (double j = 0; j < 1; j += dl) { cnt = 0; for (int i = 0; i < mas.Count; i++) { if (mas[i] > j && mas[i] <= (j + dl)) cnt++; } mas1[a] = cnt; p[a] = mas1[a] / NN; a++; } for (int i = 0; i < d; i++) if (p[i] != 0) hi2 = hi2 + Math.Pow((mas1[i] - NN * p[i]), 2) / (NN * p[i]); textBox4.Text = hi2.ToString(); double hia2 = 0.352; // критична точка розподілу про різні значимості 0,95 і 3 ступеням свободи if (hi2 >= hia2) label7.Text = "Гіпотеза про стохастичність не вірна"; else label7.Text = "Гіпотеза про стохастичність вірна з рівнем значимості 0,95"; #endregion #region вивід гістограми int[] sections = new int[count]; for (int i = 0; i < mas.Count; i++) { sections[(int)(mas[i] / (1.0 / count))]++; } int line_width = (int)((Gistograma1.Width - count + 1) / count); Graphics gr = Graphics.FromHwnd(Gistograma1.Handle); for (int i = 0; i < count; i++) { gr.DrawLine(new Pen(Color.Red, line_width), new Point(10 + (line_width + 1) * i, 110), new Point(10 + (line_width + 1) * i, 110 - ((int)((double)sections[i] / (double)sections.Max() * 100)))); } gr.Dispose(); #endregion // кінець виводу гісторгами #region перевірка за непрямими ознаками Graphic1.Refresh(); gr = Graphics.FromHwnd(Graphic1.Handle); int dot_count = mas.Count - 1; for (int i = 0; i < dot_count; i += 2) { gr.FillRectangle(Brushes.Red, (int)Math.Ceiling(mas[i] * 100), (int)Math.Floor(mas[i + 1] * 100), 1, 1); } gr.Dispose(); #endregion //кінець перевірки за непрямими ознаками } #endregion } } Метод стандартними засобами using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace WindowsFormsApplication5 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private static int t = 1; private static int count = 20; #region Метод стандартними засобами private void button1_Click(object sender, EventArgs e) { List<double> mas = new List<double>(); try { int N = int.Parse(textBox1.Text); Random rand = new Random(); StringBuilder sb = new StringBuilder(); string format = "{0:F4} "; for (int i = 0; i < N; i++) { mas.Add((double)rand.Next() / int.MaxValue); sb.AppendFormat(format, mas[i]); } Output1.Text = sb.ToString(); } catch (System.FormatException exc) { MessageBox.Show("Помилка при введені даних для генерації стандартними засобами"); } #region обчислення кореляційного моменту int NN = mas.Count; double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0; for (int i = 0; i < NN - t; i++) { SXi += mas[i]; SXit += mas[i + t]; SXiXit += mas[i] * mas[i + t]; SXi2 += mas[i] * mas[i]; SXit2 += mas[i + t] * mas[i + t]; } double DXi, DXit; DXi = 1.0 / (NN - t) * SXi2 - 1.0 / ((NN - t) * (NN - t)) * SXi * SXi; DXit = 1.0 / (NN - t) * SXit2 - 1.0 / ((NN - t) * (NN - t)) * SXit * SXit; double Pt; Pt = (1.0 / (NN - t) * SXiXit - (1.0) / ((NN - t) * (NN - t)) * SXi * SXit) / Math.Sqrt(DXi * DXit); textBox2.Text = Pt.ToString(); double B = 1.0 / NN; double rhs = (1.0 - B) * Math.Sqrt(1.0 / NN); if (Math.Abs(Pt) <= rhs) label4.Text = "Послідовність кореляційно незалежна"; else label4.Text = "Послідовність залежна"; #endregion // кінець обчислення кореляційного моменту #region Перевірка на стохастичність double hi2 = 0; int d = 5; // кількість підінтервалів double[] mas1 = new double[d]; double[] p = new double[d]; double cnt = 0; int a = 0; double dl = 1.0 / d; for (double j = 0; j < 1; j += dl) { cnt = 0; for (int i = 0; i < mas.Count; i++) { if (mas[i] > j && mas[i] <= (j + dl)) cnt++; } mas1[a] = cnt; p[a] = mas1[a] / NN; a++; } for (int i = 0; i < d; i++) if (p[i] != 0) hi2 = hi2 + Math.Pow((mas1[i] - NN * p[i]), 2) / (NN * p[i]); textBox3.Text = string.Format("{0:F8}", hi2.ToString()); double hia2 = 0.352; // критична точка розподілу при рівні значимості 0,95 і 3 ступеням свободи if (hi2 >= hia2) label6.Text = "Гіпотеза про стохастичність не вірна"; else label6.Text = "Гіпотеза про стохастичність вірна з рівнем значимості 0,95"; #endregion #region перевірка за непрямими ознаками Graphic3.Refresh(); Graphics gr = Graphics.FromHwnd(Graphic3.Handle); int dot_count = mas.Count - 1;// 2; for (int i = 0; i < dot_count; i += 2) { gr.FillRectangle(Brushes.Red, (int)Math.Ceiling(mas[i] * 100), (int)Math.Floor(mas[i + 1] * 100), 1, 1); } gr.Dispose(); #endregion //кінець перевірки за непрямими ознаками #region вивід гістограми int[] sections = new int[count]; for (int i = 0; i < mas.Count; i++) { sections[(int)(mas[i] / (1.0 / count))]++; } int line_width = (int)((Gistograma3.Width - count + 1) / count); gr = Graphics.FromHwnd(Gistograma3.Handle); for (int i = 0; i < count; i++) { gr.DrawLine(new Pen(Color.Blue, line_width), new Point(10 + (line_width + 1) * i, 110), new Point(10 + (line_width + 1) * i, 110 - ((int)((double)sections[i] / (double)sections.Max() * 100)))); } gr.Dispose(); #endregion // кінець виводу гісторгами } #endregion } } Мультиплікативний Метод using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace Laba1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private static int t = 1; private static int count = 20; #region private void button1_Click(object sender, EventArgs e) { List<double> mas = new List<double>(); try { Output2.Clear(); int X1 = int.Parse(textBox1.Text); int N = int.Parse(textBox3.Text); int L = int.Parse(textBox2.Text); int length = X1.ToString().Length; int M = (int)Math.Pow(10, length); StringBuilder sb = new StringBuilder(); string format = "{0:F4} "; int Xi = X1; for (int i = 0; i < N; i++) { try { Xi = (Xi * L) % M; mas.Add((double)Xi / (double)M); sb.AppendFormat(format, mas[i]); } catch { } } Output2.Text = sb.ToString(); } catch (System.FormatException exc) { MessageBox.Show("Помилка при введені даних для мультиплiкативного методу"); } #region обчислення кореляційного моменту int NN = mas.Count; double SXi = 0, SXit = 0, SXiXit = 0, SXi2 = 0, SXit2 = 0; for (int i = 0; i < NN - t; i++) { SXi += mas[i]; SXit += mas[i + t]; SXiXit += mas[i] * mas[i + t]; SXi2 += mas[i] * mas[i]; SXit2 += mas[i + t] * mas[i + t]; } double DXi, DXit; DXi = 1.0 / (NN - t) * SXi2 - 1.0 / ((NN - t) * (NN - t)) * SXi * SXi; DXit = 1.0 / (NN - t) * SXit2 - 1.0 / ((NN - t) * (NN - t)) * SXit * SXit; double Pt; Pt = (1.0 / (NN - t) * SXiXit - (1.0) / ((NN - t) * (NN - t)) * SXi * SXit) / Math.Sqrt(DXi * DXit); textBox4.Text = Pt.ToString(); double B = 1.0 / NN; double rhs = (1.0 - B) * Math.Sqrt(1.0 / NN); if (Math.Abs(Pt) <= rhs) label6.Text = "Послідовність кореляційно незалежна"; else label6.Text = "Послідовність залежна"; #endregion // кінець обчислення кореляційного моменту #region Перевірка на стохастичність double hi2 = 0; int d = 5; // кількість підінтервалів double[] mas1 = new double[d]; double[] p = new double[d]; double cnt = 0; int a = 0; double dl = 1.0 / d; for (double j = 0; j < 1; j += dl) { cnt = 0; for (int i = 0; i < mas.Count; i++) { if (mas[i] > j && mas[i] <= (j + dl)) cnt++; } mas1[a] = cnt; p[a] = mas1[a] / NN; a++; } for (int i = 0; i < d; i++) if (p[i] != 0) hi2 = hi2 + Math.Pow((mas1[i] - NN * p[i]), 2) / (NN * p[i]); textBox5.Text = hi2.ToString(); double hia2 = 0.352; // критична точка розподілу про різні значимості 0,95 і 3 ступеням свободи if (hi2 >= hia2) label8.Text = "Гіпотеза про стохастичність не вірна"; else label8.Text = "Гіпотеза про стохастичність вірна з рівнем значимості 0,95"; #endregion #region перевірка за непрямими ознаками Graphic2.Refresh(); Graphics gr = Graphics.FromHwnd(Graphic2.Handle); int dot_count = mas.Count - 1; for (int i = 0; i < dot_count; i += 2) { gr.FillRectangle(Brushes.Red, (int)Math.Ceiling(mas[i] * 100), (int)Math.Floor(mas[i + 1] * 100), 1, 1); } gr.Dispose(); #endregion //кінець перевірки за непрямими ознаками #region вивід гістограми int[] sections = new int[count]; for (int i = 0; i < mas.Count; i++) { sections[(int)(mas[i] / (1.0 / count))]++; } int line_width = (int)((Gistograma2.Width - count + 1) / count); gr = Graphics.FromHwnd(Gistograma2.Handle); for (int i = 0; i < count; i++) { gr.DrawLine(new Pen(Color.Green, line_width), new Point(10 + (line_width + 1) * i, 110), new Point(10 + (line_width + 1) * i, 110 - ((int)((double)sections[i] / (double)sections.Max() * 100)))); } gr.Dispose(); #endregion // кінець виводу гісторгами } #endregion } } Результат виконання завдання:    Висновок: в даній роботі я навчився одержувати послідовності псевдовипадкових квазірівномірно розподілених чисел запропонованими методами та перевірка їх на рівномірність за допомогою гістограми та за непрямими ознаками. Також я перевірив кожну із згенерованих послідовностей на незалежність методом, основаним на обчисленні кореляційного моменту, та гіпотезу про стохастичність послідовностей.
Антиботан аватар за замовчуванням

01.01.1970 03:01-

Коментарі

Ви не можете залишити коментар. Для цього, будь ласка, увійдіть або зареєструйтесь.

Ділись своїми роботами та отримуй миттєві бонуси!

Маєш корисні навчальні матеріали, які припадають пилом на твоєму комп'ютері? Розрахункові, лабораторні, практичні чи контрольні роботи — завантажуй їх прямо зараз і одразу отримуй бали на свій рахунок! Заархівуй всі файли в один .zip (до 100 МБ) або завантажуй кожен файл окремо. Внесок у спільноту – це легкий спосіб допомогти іншим та отримати додаткові можливості на сайті. Твої старі роботи можуть приносити тобі нові нагороди!
Нічого не вибрано
0%

Оголошення від адміністратора

Антиботан аватар за замовчуванням

Подякувати Студентському архіву довільною сумою

Admin

26.02.2023 12:38

Дякуємо, що користуєтесь нашим архівом!