Міністерство освіти та науки України
Національний університет «Львівська політехніка»
Кафедра автоматизованих систем управління
Звіт
про виконання лабораторної роботи №1
з курсу МОДЕЛЮВАННЯ СИСТЕМ
на тему:
“Ідентифікація законів розподілу та оцінювання параметрів вибіркових даних при моделюванні випадкових процесів”
Мета роботи: вивчення методів ідентифікації характеристик випадкових величин та процесів при статистичному моделюванні систем.
Теоретичні положення
Точкове оцінювання математичного сподівання та дисперсії
Точкові оцінки являють собою числа, отримані шляхом підстановки значень вибірки у формулу для оцінюваного параметру. Математичне сподівання mx та дисперсію оцінюють за допомогою співвідношень:
Інтервальне оцінювання математичного сподівання та дисперсії
Точкові оцінки параметрів не дозволяють оцінити, наскільки близька оцінка до відповідного значення теоретичного параметру g. Більш інформативний спосіб полягає в побудові інтервалу, в якому з заданою достовірністю виявиться оцінюваний параметр, тобто в визначенні інтервальної оцінки параметру g.
Інтервальною оцінкою параметру g називається інтервал, межі якого l1 та l2 являють собою функції значень вибірки і який з заданою ймовірністю Р накриває оцінюваний параметр:
Інтервал називається довірчим, а його межі l1 та l2 - випадкові величини - нижня та верхня довірчі межі відповідно. Р називається довірчяою ймовірністю, а величина α=1-P - рівнем значимості, який використовується при побудові довірчого інтервалу. Таким чином інтервальна оцінка характеризується шириною довірчого інтервалу L=l2-l1 та довірчою ймовірністю Р, яка характеризує степінь надійності результатів.
Побудова гістограми
Гiстограма являє собою емпіричний аналог функції густини закону розподілу f(x). Побудова гістограми відбувається наступним чином:
Визначаємо попередню кількість інтервалів розбиття осі ординат К за формулою
заокруглюючи отримане число до найближчого більшого цілого.
Визначаємо довжину інтервалів за формулою
(x = (xmax - xmin)/K
Для зручності обчислень значення можна дещо скоректувати.
Середину області зміни вибірки приймаємо як центр деякого інтервалу (xmax - xmin)/2, після чого знаходимо межі та остаточну кількість інтервалів таким чином, щоб вони в сукупності перекривали цілу область від xmin до xmax.
Підраховуємо кількість спостережень Nm, які потрапляють в кожен інтервал: Nm дорівнює числу членів варіаційного ряду, для яких справедлива нерівність xm ( xi ( xm + (x, де xm , xm + (x - межі т-го інтервалу. Значення xi, які потрапляють на межу між т-м та (т-1)м інтервалами, відносимо до т - го інтервалу.
Підраховуємо відносну кількість спостережень Nm/N, які потрапляють в даний інтервал.
Будуємо гістограму, яка являє собою криву зі сходинок, значення якої на т-му інтервалі (xm, xm + (x) постійне та дорівнює Nm/N.
Стандартний метод моделювання неперервної випадкової величини (метод Монте-Карло)
Загальний розподіл дійсної випадкової величини ξ описується в термінах інтегральної функції закону розподілу F(x) = Pξ(ξ≤x) - ймовірність того, що випадкова величина ξ прийме значення (x. F(x) - монотонно неспадна функція, межі зміни якої від 0 до 1 (F(-()=0, F(+()=1).
Загальний спосіб генерації випадкової величини ξ з функцією F(x), яка має обернену функцію F-1, полягає в тому, що реалізацію випадкової величини ξ обчислюють за формулою , де y - рівномірно розподілене в інтервалі (0,1) число.
Методи моделювання нормально розподілених випадкових величин
Модифікація метода полярних координат дозволяє отримати дві незалежних нормально розподілених випадкових величини. Генерація проводиться за допомогою наступного алгоритму:
І. Згенерувати два рівномірно розподілених в інтервалі (0,1) випадкових числа (1 та (2. Обчислити .
2. Обчислити .
3. Якщо S(1 то перейти до кроку 1.
4. Обчислити два значення нормально розподілених випадкових величин з параметрами m=0, за формулами
Перехід до нормально розподіленої з параметрами m, (2 величини здійснюється шляхом масштабування нормованого розподілу за формулою
Побудова довірчого інтервалу для при невідомому значенні із заданою надійністю (
Для малих вибірок, з якими стикаємося, досліджуючи різні ознаки в техніці чи сільському господарстві, для оцінювання при невідомому значенні неможливо скористатися нормальним законом розподілу. Тому для побудови довірчого інтервалу застосовується випадкова величина
що має розподіл Стьюдента з ступенями свободи.
Тоді (421) набирає такого вигляду:
оскільки для розподілу Стьюдента є функцією парною.
Обчисливши за даним статистичним розподілом , S і визначивши за таблицею розподілу Стьюдента значення , будуємо довірчий інтервал
Тут обчислюємо за заданою надійністю γ і числом ступенів свободи за таблицею
Побудова довірчих інтервалівіз заданою надійністю ( для ,
У разі, коли ознака Х має нормальний закон розподілу, для побудови довірчого інтервалу із заданою надійністю ( для застосовуємо випадкову величину
що має розподіл із ступенями свободи.
Оскільки випадкові події
і
є рівноймовірними, тобто їх імовірності рівні маємо:
Підставляючи в (424) дістанемо
=
=
Отже, довірчий інтервал для матиме вигляд:
.
Тоді довірчий інтервал для випливає із (425) і буде таким:
.
Значення , знаходимо за таблицею (додаток 4) згідно з рівностями:
де .
Ідентифікацію законів розподілу з обчисленими параметрами з використанням критерію значимості χ2 з заданими рівнем значимості та значенням степені вільності.
Теоретичні частоти обчислюються за формулою
,
де n — обсяг вибірки,
а Pi — імовірність того, що випадкова величина Х потрапить в і-й частковий інтервал.
,
де — функції Лапласа.
.
Таким чином, для обчислення необхідно знайти числове значення параметра (. Ураховуючи, що для експоненціального закону, маємо
.
Отже, для визначення ( необхідно обчислити його точкову незміщену статистичну оцінку . Тоді .
Критерій узгодженості Пірсона. Критерій узгодженості Пірсона є випадковою величиною, що має розподіл , який визначається за формулою
,
і має k = q – m – 1 ступенів свободи,
де q — число часткових інтервалів інтервального статистичного розподілу вибірки;
m — число параметрів, якими визначається закон розподілу ймовірностей генеральної сукупності згідно з нульовою гіпотезою. Так, наприклад, для закону Пуассона, який характеризується одним параметром (, m = 1, для нормального закону m = 2, оскільки цей закон визначається двома параметрами i (.
Якщо (усі емпіричні частоти збігаються з теоретичними), то , у противному разі . Визначивши при заданому рівні значущості ( і числу ступенів свободи критичну точку , за таблицею (додаток 8) будується правобічна критична область. Якщо виявиться, що спостережуване значення критерію , то Н0 про закон розподілу ознаки генеральної сукупності відхиляється. У противному разі Н0 приймається.
Порядок виконання роботи.
Скласти програму, яка виконує наступні дії:
генерує випадкові послідовності за експоненційним та нормальним законами розподілу за параметрами згідно індивідуального завдання,
здійснює точкову та інтервальну оцінку математичного сподівання та дисперсії отриманих випадкових послідовностей,
будує гістограми функцій густини відповідних законів розподілу на основі отриманих випадкових послідовностей,
проводить ідентифікацію законів розподілу з обчисленими параметрами з використанням критерію значимості χ2 з заданими рівнем значимості та значенням степені вільності.
Зробити висновок по перевірці гіпотез про відповідність законів розподілу експериментальних даних обраним теоретичним розподілам.
Отримати роздрук результатів роботи програми.
Оформити звіт по результатах виконаної роботи
Текст програми
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;
using System.Data;
namespace ny_vso_eee
{
public class Form1 : System.Windows.Forms.Form
{
private System.ComponentModel.Container components = null;
private Rectangle rectangleBounds = new Rectangle(new Point(10, 10),
new Size(20, 200));
private Pen bluePen = new Pen(Color.Black, 1);
private Pen redPen = new Pen(Color.Red, 1);
private Brush blackBrush = Brushes.Black;
private Brush solidAzureBrush = Brushes.Azure;
private Brush solidYellowBrush = new SolidBrush(Color.Yellow);
private Brush solidRedBrush = new SolidBrush(Color.Red);
private Font boldTimesFont = new Font("Times New Roman", 10, FontStyle.Bold);
Font haettens = new Font("Haettenschweiler", 12);
//static private Brush brickBrush = new HatchBrush(HatchStyle.DiagonalBrick,
// Color.DarkGoldenrod, Color.Cyan);
//private Pen brickWidePen = new Pen(brickBrush, 10);
//int[] freq;
int [] freq_e;
int [] freq_n;
int[] freq;
double[] mas_im,ni_sh,extra;
double a1,a2,v1,v2,s,y;
int i, k, j_n = 0, j_e = 0, tot_num_e, tot_num_n, max_num_n, max_num_e;
uint N=0;
double v_max=0,v_min=0,R_min,delx,L,lam,SiqSquare,m,D_hyp;
double ee = 2.71;
double[] a_interval;
string[] rech;
const int M=16;
NormalTable norTable;
ExtendedTable exTable;
float x;
bool flag_draw = false, already_draw = false;
private System.Windows.Forms.MainMenu mainMenu1;
private System.Windows.Forms.MenuItem menuItem1;
private System.Windows.Forms.MenuItem menuItem2;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.MenuItem menuItem4;
private System.Windows.Forms.MenuItem menuItem9;
private System.Windows.Forms.TextBox textBox2;
private System.Windows.Forms.TextBox textBox3;
private System.Windows.Forms.TextBox textBox4;
private System.Windows.Forms.MenuItem menuItem11;
private System.Windows.Forms.MenuItem menuItem12;
private System.Windows.Forms.MenuItem menuItem13;
private System.Windows.Forms.MenuItem menuItem14;
private System.Windows.Forms.MenuItem menuItem15;
private System.Windows.Forms.TextBox textBox5;
private System.Windows.Forms.TextBox textBox6;
private System.Windows.Forms.MenuItem menuItem3;
private System.Windows.Forms.MenuItem menuItem16;//ex_d=false,norm_d=false;
Random rnd;
//private System.ComponentModel.Container components = null;
public Form1()
{
rnd = new Random();
norTable = new NormalTable();
exTable = new ExtendedTable("xtable.txt");
//N = 10000;
// freq_n = new int[N];
// freq_e = new int[N];
InitializeComponent();
}
protected override void Dispose( bool disposing )
{
if( disposing )
{
if (components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
protected override void OnPaint(PaintEventArgs e)
{
base.OnPaint(e);
Graphics dc = e.Graphics;
Point scrollOffset = this.AutoScrollPosition;
int width = 20,height,max_height = 200,j,tot_num,max_num,skip,pop=0;
int kilk,distance,st_x=10,st_y,start=30,step=15,st_x_text=400;
distance = width * 10 / 100;
skip = start;
if (flag_draw)
for (int done = 1; done >= 0;done--,start*=10, skip = start,pop=(int)M/2 )
{
if (done == 0)
{
j = j_e; max_num = max_num_e; tot_num = tot_num_e;
for (i = 0; i < j_e; i++)
freq[i] = freq_e[i];
}
else
{
j = j_n; max_num = max_num_n; tot_num = tot_num_n;
for (i = 0; i < N; i++)
freq[i] = 0;
for (i = 0; i < j_n; i++)
freq[i] = freq_n[i];
}
for (kilk = 0; kilk <= j; kilk++)
{
if (kilk == max_num)
{
height = max_height;
st_y = start;
}
else
{
height = freq[kilk] * max_height / tot_num;
st_y = start + max_height - height;
}
if (done == 0)
{
dc.DrawRectangle(bluePen, st_x, st_y, width, height); //rectangleBounds);
dc.FillRectangle(solidYellowBrush, st_x, st_y, width, height); //rectangleBounds);
}
else
{
dc.DrawRectangle(redPen, st_x, st_y, width, height); //rectangleBounds);
dc.FillRectangle(solidRedBrush, st_x, st_y, width, height); //rectangleBounds);
}
st_x += width + distance;
}
if(done==1)
dc.DrawString("Нормальний розподіл ", haettens, blackBrush,500, start);
else dc.DrawString("Експоненціальний розподіл ", haettens, blackBrush, 500, start);
dc.DrawString("Мат.сподівання = " + rech[0+pop], boldTimesFont, blackBrush, st_x_text, skip+=2*step);
dc.DrawString("Дисперсія = " + rech[1+pop], boldTimesFont, blackBrush, st_x_text,skip +=step);
dc.DrawString("Довірчий інтервал :", boldTimesFont, blackBrush, st_x_text, skip += step);
dc.DrawString("для мат. спод:"+"["+ rech[2+pop]+" "+ rech[3+pop] + "]", boldTimesFont, blackBrush, st_x_text, skip += step);
dc.DrawString("для дисперсії:"+"["+ rech[4+pop]+" "+ rech[5+pop] + "]", boldTimesFont, blackBrush, st_x_text, skip += step);
if (a_interval[6+pop] > a_interval[7+pop])
{
dc.DrawString("Xiквад.розр. > Xiквад.крит.", boldTimesFont, blackBrush, st_x_text, skip += step);
dc.DrawString(rech[6+pop] + " > " + rech[7+pop] + " - гіпотезу відхилено", boldTimesFont, blackBrush, st_x_text, skip += step);
}
else
{
dc.DrawString("Xiквад.розр. < Xiквад.крит.", boldTimesFont, blackBrush, st_x_text, skip += step);
dc.DrawString(rech[6+pop] + " < " + rech[7+pop] + " - гіпотеза прийнята", boldTimesFont, blackBrush, st_x_text, skip += step);
}
st_x = 10; flag_draw = false;
}
}
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{}
#endregion
[STAThread]
static void Main()
{
Application.Run(new Form1());
}
private void Form1_Load(object sender, System.EventArgs e)
{
}
private void menuItem3_Click_1(object sender, System.EventArgs e)
{
N= Convert.ToUInt32(textBox1.Text);
mas_im = new double[N];
freq_e = new int[N];
freq_n = new int[N];
freq = new int[N];
a_interval = new double[M];
rech = new string[M];
double ty,x1,x2,xi_1,xi_2,hama,S_sum=0,Q_sum=0,Sx,Xb,Db,p,q,xXx=0,Mx_t,Dx_t,siqma_b;
float a;
double[] midle=new double[N];
double[] extra = new double[30];
double[] ni = new double[30];
flag_draw = true;
lam = Convert.ToDouble(textBox2.Text);
SiqSquare = Convert.ToDouble(textBox6.Text);
int z,suma=0,b,n=0;
m = Convert.ToDouble(textBox5.Text);
hama =Convert.ToDouble(textBox3.Text);
D_hyp= Convert.ToDouble(textBox4.Text);
for (i = 0; i < N; )
{
a1 = rnd.NextDouble();
a2 = rnd.NextDouble();
v1 = 2 * a1 - 1; v2 = 2 * a2 - 1;
s = v1 * v1 + v2 * v2;
if (s < 1)
{
x1 = v1 * Math.Sqrt((-2 * Math.Log10(s) / Math.Log10(ee)) / s);
x2 = v2 * Math.Sqrt((-2 * Math.Log10(s) / Math.Log10(ee)) / s);
mas_im[i] = SiqSquare*x1 + m;
mas_im[i + 1] = SiqSquare * x2 + m;
if (i == 0) v_max = v_min = mas_im[i];
i += 2;
}
}
for (i = 0, Mx_t = 0; i < N; i++)
Mx_t += mas_im[i];
Mx_t = Mx_t / N;
a_interval[0] = Mx_t;
for (i = 0, Dx_t = 0; i < N; i++)
Dx_t += Math.Pow(mas_im[i] - Mx_t, 2);
Dx_t = Dx_t/(N-1);
a_interval[1] = Dx_t;
for (i = 0; i < N; i++)
{
if (mas_im[i] > v_max)
v_max = mas_im[i];
if (mas_im[i] < v_min)
v_min = mas_im[i];
}
k = (int)(1 + 3.2 * Math.Log10(N));
delx = (double)(v_max - v_min) / k;
L = (int)(((v_max + v_min) / 2 - delx / 2 - v_min) / delx);
y = (v_max + v_min) / 2 - delx / 2 - L * delx;
for ( p = y; (p + delx) <= v_max; p = p + delx, j_n++)
{
ex[j_n] = p;
for (i = 0; i < N; i++)
if (mas_im[i] > p && mas_im[i] <= p + delx)
freq[j_n]++;
} ex[j_n] = p;
for (i = 0; i < j_n; i++)
if (freq[i] > tot_num_n)
{
tot_num_n = freq[i];
max_num_n = i;
}
extra[n] = ex[0];
for (i = 0; i < j_n; i++)
{
if (freq[i] < 5)
{
if (i != 0 && freq[i - 1] > freq[i] && freq[i - 1] >= 5)
{
z = i - 1;
while (i < j_n && freq[i] < 5)
suma += freq[i++];
if (suma < 5)
{
freq_n[n - 1] = freq[z] + suma;
extra[n] = ex[i];
}
else
{
freq_n[n] = suma;
extra[n + 1] = ex[i];
} suma = 0;
}
else
{
while (freq[i] < 5)
suma += freq[i++];
if (suma < 5)
freq_n[n] = freq[i] + suma;
else freq_n[n] = suma;
suma = 0; extra[n + 1] = ex[i + 1]; n++;
}
}
else
{
freq_n[n] = freq[i];
extra[n + 1] = ex[i + 1];
n++;
}
}
for (i = 0; i < N; i++)
freq[i] = 0;
j_n = n;
for (i = 0; i < j_n; i++)
midle[i] = (extra[i] + extra[i + 1]) / 2;
for (i = 0; i < j_n; i++)
{
S_sum += midle[i] * freq_n[i];
Q_sum += midle[i] * midle[i] * freq_n[i];
}
Xb = S_sum / N; Db = Q_sum / N - Xb * Xb;
Sx = Math.Sqrt(N * Db / (N - 1));
siqma_b = Math.Sqrt(Db);
ty = norTable[0.5 * hama]; a = (float)(1 - hama);
xi_1 = exTable[k - 1, 1 - a / 2]; xi_2 = exTable[k - 1, a / 2];
for (i = 0; i < j_n ; i++)
ni[i] =(int) (N * (norTable[(float)((extra[i + 1] - Xb) / siqma_b)] - norTable[(float)((extra[i] - Xb) / siqma_b)]));
for (i = 0; i < j_n; i++) if (ni[i] != 0) xXx += Math.Pow(freq_n[i] - ni[i], 2) / ni[i];
q = exTable[k - 2 - 1, (float)D_hyp];
a_interval[2] = Xb - ty * Sx / Math.Sqrt(N);
a_interval[3] = Xb + ty * Sx / Math.Sqrt(N);
a_interval[4] = (k - 1) * Sx * Sx / xi_2;
a_interval[5] = (k - 1) * Sx * Sx / xi_1;
a_interval[6] = xXx;
a_interval[7] = q;
//===========================================================================================================
for (i = 0; i < N; i++)
mas_im[i]=midle[i]=0;
S_sum = Q_sum = xXx = Mx_t = Dx_t=n= 0;
for (i = 0; i < 30; i++) ni[i] = extra[i]=ex[i]= 0;
for (i = 0; i < N; i++)
{
y = rnd.NextDouble();
mas_im[i] = -1 * Math.Log10(1 - y) / Math.Log10(ee) / lam;
if (i == 0) v_max = v_min = mas_im[i];
if (mas_im[i] > v_max)
v_max = mas_im[i];
if (mas_im[i] < v_min)
v_min = mas_im[i];
}
for (i = 0, Mx_t = 0; i < N; i++)
Mx_t += mas_im[i];
Mx_t = Mx_t / N;
a_interval[8] = Mx_t;
for (i = 0, Dx_t = 0; i < N; i++)
Dx_t += Math.Pow(mas_im[i] - Mx_t, 2);
Dx_t = Dx_t / (N - 1);
a_interval[9] = Dx_t;
k = (int)(1 + 3.2 * Math.Log10(N));
delx = (double)(v_max - v_min) / k;
L = (int)(((v_max + v_min) / 2 - delx / 2 - v_min) / delx);
y = (v_max + v_min) / 2 - delx / 2 - L * delx;
for (p = y; (p + delx) <= v_max; p = p + delx, j_e++)
{
ex[j_e] = p;
//midle[j_n] = (2 * p + delx) / 2;
for (i = 0; i < N; i++)
if (mas_im[i] >= p && mas_im[i] < p + delx)
freq[j_e]++;
} ex[j_e] = p;
for (i = 0; i < j_e; i++)
if (freq[i] > tot_num_e)
{
tot_num_e = freq[i];
max_num_e = i;
}
extra[n] = ex[0];
for (i = 0; i < j_e; i++)
{
if (freq[i] < 5)
{
if (i != 0 && freq[i - 1] > freq[i] && freq[i - 1] >= 5)
{
z = i - 1;
while (i < j_e && freq[i] < 5)
suma += freq[i++];
if (suma < 5)
{
freq_e[n - 1] = freq[z] + suma;
extra[n] = ex[i];
}
else
{
freq_e[n] = suma;
extra[n + 1] = ex[i];
} suma = 0;
}
else
{
while (freq[i] < 5)
suma += freq[i++];
if (suma < 5)
freq_e[n] = freq[i] + suma;
else freq_e[n] = suma;
suma = 0; extra[n+1] = ex[i+1];
}
}
else
{
freq_e[n] = freq[i];
extra[n+1] = ex[i + 1];
n++;
}
}
for (i = 0; i < N;i++)
freq[i] = 0;
j_e = n;
for (i = 0; i < j_e; i++)
midle[i] = (extra[i] + extra[i + 1]) / 2;
for(i=0;i<j_n;i++)
{
S_sum=S_sum+midle[i]*freq_e[i];
Q_sum=Q_sum+midle[i]*midle[i]*freq_e[i];
}
Xb=S_sum/N;Db=Q_sum/N-Xb*Xb;
Sx = Math.Sqrt(N * Db / (N - 1));
ty = norTable[0.5 * hama]; a = (float)(1 - hama);
x1 = exTable[k - 1, 1 - a / 2]; x2 = exTable[k - 1, a / 2];
for (i = 0; i < j_e-1; i++)
ni[i] =(int) (N * (Math.Exp(-1 / Xb * extra[i]) - Math.Exp(-1 / Xb * extra[i + 1])));
for (i = 0; i < j_e; i++) if(ni[i]!=0)xXx += Math.Pow(freq_e[i] - ni[i], 2) / ni[i];
q = exTable[k - 1 - 1,(float)D_hyp];
a_interval[10] = Xb - ty * Sx / Math.Sqrt(N);
a_interval[11] = Xb + ty * Sx / Math.Sqrt(N);
a_interval[12] = (k - 1) * Sx * Sx / x2;
a_interval[13] = (k - 1) * Sx * Sx / x1;
a_interval[14] = xXx;
a_interval[15] = q;
for (i = 0; i < M; i++)
rech[i] = Convert.ToString(a_interval[i]);
menuItem2.Visible=menuItem4.Visible = false; Invalidate();
}
private void menuItem3_Click(object sender, System.EventArgs e)
{
}
private void menuItem4_Click(object sender, System.EventArgs e)
{
textBox1.Visible=textBox2.Visible=textBox3.Visible=textBox4.Visible=textBox5.Visible=textBox6.Visible= true;
menuItem9.Visible=menuItem9.Visible=menuItem11.Visible=menuItem12.Visible=menuItem13.Visible=menuItem14.Visible=menuItem15.Visible=true;
}
private void menuItem16_Click_1(object sender, System.EventArgs e)
{
Close();
}
}
}
using System;
using System.Collections;
using System.IO;
using System.Threading;
using System.Globalization;
namespace ny_vso_eee
{
public class Tupple
{
public Tupple(float x, double fx)
{
X = x;
Fx = fx;
}
#region MEMBERS & PROPERTIES
public float X
{
get { return m_x; }
set { m_x = value; }
}
private float m_x = float.NaN;
public double Fx
{
get { return m_fx; }
set { m_fx = value; }
}
private double m_fx = double.NaN;
#endregion
}
public class NormalTable
{
public NormalTable()
{
Thread.CurrentThread.CurrentCulture =new CultureInfo("en-us");
FileStream tableFile = new FileStream("table.txt", FileMode.Open);
StreamReader streamReader = new StreamReader(tableFile);
string line = string.Empty;
do
{
line = streamReader.ReadLine();
if (line != null)
{
string[] strings = line.Split(new char[] {'\t'}, 2);
float x = (float)Convert.ToDouble(strings[0]);
double fx = Convert.ToDouble(strings[1]);
Tupples.Add(new Tupple(x,fx));
}
}while(line != null);
streamReader.Close();
}
#region MEMBERS & PROPERTIES
public ArrayList Tupples
{
get { return m_tupples; }
}
private ArrayList m_tupples = new ArrayList();
#endregion
#region METHODS
public float this[double index]
{
get
{
float tableValue = float.NaN;
foreach (Tupple tupple in Tupples)
{
if (index > tupple.Fx)
{
continue;
}
else
{
tableValue = tupple.X;
break;
}
}
return tableValue;
}
}
public double this[float index]
{
get
{
bool sign = false;
double tableValue = double.NaN;
if (index > 5.0f)
{
return 0.5;
}
if (index < 0.0f)
{
index = Math.Abs(index);
sign = true;
}
foreach (Tupple tupple in Tupples)
{
if (index > tupple.X)
{
continue;
}
else
{
tableValue = tupple.Fx;
break;
}
}
if (sign)
{
return (-1.0)*tableValue;
}
else
{
return tableValue;
}
}
}
#endregion
}
using System.Collections;
using System.IO;
using System.Threading;
using System.Globalization;
namespace ny_vso_eee
{
public class ExtendedTupple
{
public ExtendedTupple(float probability, int v, double x)
{
Probability = probability;
V = v;
X = x;
}
#region MEMBERS & PROPERTIES
public int V
{
get { return m_v; }
set { m_v = value; }
}
private int m_v = 0;
public double X
{
get { return m_x; }
set { m_x = value; }
}
private double m_x = double.NaN;
public float Probability
{
get{ return m_probability; }
set{ m_probability=value; }
}
private float m_probability = float.NaN;
#endregion
}
public class ExtendedTable
{
public ExtendedTable(string file)
{
Thread.CurrentThread.CurrentCulture =new CultureInfo("en-us");
FileStream tableFile = new FileStream(file, FileMode.Open);
StreamReader streamReader = new StreamReader(tableFile);
string line = string.Empty;
do
{
line = streamReader.ReadLine();
if (line != null)
{
string[] strings = line.Split(new char[] {'\t'}, 3);
float probability = (float)Convert.ToDouble(strings[0]);
int v = Convert.ToInt32(strings[1]);
double x = Convert.ToDouble(strings[2]);
ExtendedTupples.Add(new ExtendedTupple(probability,v,x));
}
}while(line != null);
streamReader.Close();
}
#region MEMBERS & PROPERTIES
public ArrayList ExtendedTupples
{
get { return m_extendedTupples; }
}
private ArrayList m_extendedTupples = new ArrayList();
public double this[int v, float p]
{
get
{
double tableValue = double.NaN;
foreach (ExtendedTupple tupple in ExtendedTupples)
{
if (v != tupple.V || p < tupple.Probability)
{
continue;
}
else
{
tableValue = tupple.X;
break;
}
}
return tableValue;
}
}
#endregion
}
}
Висновок : у даній лабораторній роботі ми вивчили методи ідентифікації характеристик випадкових величин та процесів при статистичному моделюванні систем.