Типовые законы распределения

Название закона f(x) F(x)
Экспоненциальный
Вейбулла

 

Приложение 2

Обратные функции законов распределения

Название закона распределения Обратная функция F-1(x)
Экспоненциальный
Вейбулла

 

 

ПРИЛОЖЕНИЕ З

Листинг модулей программы

Модуль Form1

Модуль Form1 – содержит основную логику взаимодействия с пользователем, методы чтения и записи в файл, выгрузки графиков.

 

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;

using ZedGraph;

using System.IO;

 

namespace Kyrsovoi_erm

{

public partial class Form1: Form

{

bool func_nun = true;

Double alpha_value;

Double betta_value;

// Double discret;

int col_count = 1;

Veibolla veib = new Veibolla();

Exponent exp = new Exponent();

Sum_process s_p;

 

Double mat_oj = 0;

Double disp = 0;

Double k_assim = 0;

Double k_excess = 0;

 

int size=0;

 

public Form1()

{

InitializeComponent();

 

 

}

 

 

private void DrawGraph()

{

//////////////////////////////////////////////////////////////////

////////////////////Функция...................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_func();

 

//////////////////////////////////////////////////////////////////

////////////////////Процесс...................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_process();

 

//////////////////////////////////////////////////////////////////

////////////////////Гистограмма...................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_gist();

 

//////////////////////////////////////////////////////////////////

////////////////////Плотность...................................

//////////////////////////////////////////////////////////////////

 

Calculate_Plotnost();

 

//////////////////////////////////////////////////////////////////

////////////////////Мат.Ожидание.................................

//////////////////////////////////////////////////////////////////

 

Mat_oj_val.Text = Calculate_mat_oj().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Дисперсия.................................

//////////////////////////////////////////////////////////////////

 

disp_val.Text = Calculate_disp().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Коэфицент ассиметрии.................................

//////////////////////////////////////////////////////////////////

k_assim_val.Text = Calculate_k_assim().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Коэфициет эксцесса.................................

//////////////////////////////////////////////////////////////////

 

k_excess_val.Text = Calculate_k_excess().ToString();

//////////////////////////////////////////////////////////////////

////////////////////Процесс сумм.................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_sum_process();

 

//////////////////////////////////////////////////////////////////

////////////////////Гистограмма сумм.................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_sum_gist();

 

//////////////////////////////////////////////////////////////////

////////////////////Плотность сумм.................................

//////////////////////////////////////////////////////////////////

 

Calculate_sum_dansity();

 

 

}

 

private void button1_Click(object sender, EventArgs e)

{

 

DrawGraph();

 

}

 

private void listBox1_SelectedIndexChanged(object sender, EventArgs e)

{

if (listBox1.SelectedIndex == 0)

{

func_nun = true; // экспонента

textBox2.Enabled = false;

}

else

{

func_nun = false; // вейбулла

textBox2.Enabled = true;

 

}

 

 

}

 

 

private void tabControl1_Selected(object sender, TabControlEventArgs e)

{

// if (tabControl1.SelectedIndex == 0)

// button1.Enabled = true;

 

}

 

public void Calculate_func()

{

// Получим панель для рисования

GraphPane pane = zedGraph_func.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

 

// Создадим список точек

PointPairList list = new PointPairList();

 

if (func_nun == true) //экспонента

{

 

if (Double.TryParse(textBox1.Text, out alpha_value))

{

size = (int)numericUpDown1.Value;

list = exp.Calculate_Exponenta_func(alpha_value, size); // Заполняем список точек

 

}

else

{

if (!Double.TryParse(textBox1.Text, out alpha_value))

{

MessageBox.Show("Проверьте правильность ввода параметра альфа", "Некорректный ввод");

textBox1.Clear();

}

/*if (!Double.TryParse(textBox3.Text, out discret))

{

MessageBox.Show("Проверьте правильность ввода параметра дельта", "Некорректный ввод");

textBox3.Clear();

}*/

 

}

}

else

if (func_nun == false)//вейбулла

{

size = (int)numericUpDown1.Value;

if ((Double.TryParse(textBox2.Text, out betta_value)) && (Double.TryParse(textBox1.Text, out alpha_value)))

{

// Заполняем список точек

list = veib.Calculate_Veibolla_func(alpha_value, betta_value, size);

 

 

}

else

{

 

if (!Double.TryParse(textBox1.Text, out alpha_value))

{

MessageBox.Show("Проверьте правильность ввода параметров альфа", "Некорректный ввод");

textBox1.Clear();

}

if (!Double.TryParse(textBox2.Text, out betta_value))

{

MessageBox.Show("Проверьте правильность ввода параметров бетта", "Некорректный ввод");

textBox2.Clear();

}

 

/*if (!Double.TryParse(textBox3.Text, out discret))

{

MessageBox.Show("Проверьте правильность ввода параметра дельта", "Некорректный ввод");

textBox3.Clear();

}*/

 

}

}

 

 

// Создадим кривую с названием "Sinc",

// которая будет рисоваться голубым цветом (Color.Blue),

// Опорные точки выделяться не будут (SymbolType.None)

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

LineItem myCurve = pane.AddCurve(func_name, list, Color.Coral, SymbolType.None);

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

// В противном случае на рисунке будет показана только часть графика,

// которая умещается в интервалы по осям, установленные по умолчанию

zedGraph_func.AxisChange();

 

// Обновляем график

zedGraph_func.Invalidate();

}

 

 

private void Calculate_Plotnost()

{

// if (((func_nun) && (!exp.flistIsEmpty())) || ((!func_nun) && (!veib.flistIsEmpty()))) //нажимали ли кнопку

// {

//if (Int32.TryParse(textBox4.Text, out col_count))// получаем количество коридоров

// {

 

col_count = (int)numericUpDown2.Value;

PointPairList list = new PointPairList();

PointPairList tlist = new PointPairList();

/* if (((func_nun) && (exp.glistIsEmpty())) || ((!func_nun) && (veib.glistIsEmpty())))

{

 

 

if (func_nun)

{

list = exp.Calculate_gist(col_count);

 

}

else

{

list = veib.Calculate_gist(col_count);

}

}

else

{*/

if (func_nun)

{

list = exp.getGlist();

tlist = exp.Calculate_theoretical_density();

}

else

{

list = veib.getGlist();

tlist = veib.Calculate_theoretical_density();

}

 

//}

 

// Получим панель для рисования

GraphPane pane = zedGraphDensity.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

LineItem myCurve = pane.AddCurve("Эксперементальная плотность " + func_name, list, Color.Coral, SymbolType.None);

LineItem myCurve2 = pane.AddCurve("Теоретическая плотность " + func_name, tlist, Color.Blue, SymbolType.None);

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

// В противном случае на рисунке будет показана только часть графика,

// которая умещается в интервалы по осям, установленные по умолчанию

zedGraphDensity.AxisChange();

 

// Обновляем график

zedGraphDensity.Invalidate();

 

/* }

else

{

MessageBox.Show("Проверьте правильность ввода параметра 'Количество столбцов'", "Некорректный ввод");

textBox4.Clear();

}*/

 

 

/* }

else

{

MessageBox.Show("Нажмите кнопку для генерации значений функции распределения", "Некорректный ввод");

 

}*/

 

 

}

 

public void Calculate_gist()

{

//if (Int32.TryParse(textBox4.Text, out col_count))// получаем количество коридоров

// {

//button1.Enabled = false;

 

col_count = (int)numericUpDown2.Value;

 

// Получим панель для рисования

GraphPane gist_pane = zedGraph_gist.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

gist_pane.CurveList.Clear();

 

string func_name;

PointPairList glist;

 

 

if (func_nun)

{

func_name = "Exponenta";

glist = exp.Calculate_gist(col_count);

 

}

else

{

func_name = "Veibulla";

glist = veib.Calculate_gist(col_count);

 

}

 

// MessageBox.Show("Задница", "Некорректный ввод");

 

 

BarItem bar = gist_pane.AddBar("Гистограмма" + func_name, glist, Color.Blue);

 

//!!! Расстояния между кластерами (группами столбиков) гистограммы = 0.0

// У нас в кластере только один столбик.

gist_pane.BarSettings.MinClusterGap = 0.0f;

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

zedGraph_gist.AxisChange();

 

// Обновляем график

zedGraph_gist.Invalidate();

/*}

 

else

{

if (!Int32.TryParse(textBox4.Text, out col_count))

{

MessageBox.Show("Проверьте правильность ввода параметра 'Количество столбцов'", "Некорректный ввод");

textBox4.Clear();

}

}*/

 

}

 

public void Calculate_process()

{

Double [] process = new Double[size];

Double[] index = new Double[size];

 

if (func_nun)

{

process = exp.getProcess();

}

else

{

process = veib.getProcess();

}

for (int i = 0; i < size; i++)

{

index[i] = i;

}

 

 

// Получим панель для рисования

GraphPane pane = zedGraph_process.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

 

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

LineItem myCurve = pane.AddCurve("Процесс " + func_name,index, process, Color.Blue, SymbolType.None);

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

// В противном случае на рисунке будет показана только часть графика,

// которая умещается в интервалы по осям, установленные по умолчанию

zedGraph_process.AxisChange();

 

// Обновляем график

zedGraph_process.Invalidate();

 

/* }

else

{

MessageBox.Show("Проверьте правильность ввода параметра 'Количество столбцов'", "Некорректный ввод");

textBox4.Clear();

}*/

 

 

}

 

private void сохранитьToolStripMenuItem_Click(object sender, EventArgs e)

{

if (((func_nun) && (!exp.flistIsEmpty())) || ((!func_nun) && (!veib.flistIsEmpty()))) //нажимали ли кнопку

{

 

saveFileDialog1.Filter = "Текстовый *.txt|*.txt";

saveFileDialog1.ShowDialog();

 

}

 

 

else

{

MessageBox.Show("Нажмите кнопку для генерации значений функции распределения", "Невозможно сохранить");

}

 

 

}

 

 

public Double Calculate_mat_oj()

{

mat_oj = 0;

Double [] process= new Double[size];

// PointPairList list = new PointPairList();

if (func_nun) //экспонента

{

 

process = exp.getProcess();

}

else // вейбулла

{

process = veib.getProcess();

}

 

 

mat_oj = process.Sum()/size;

 

 

return mat_oj;

}

 

public Double Calculate_disp()

{

disp = 0;

Double [] process = new Double[size];

if (func_nun) //экспонента

{

 

process = exp.getProcess();

}

else // вейбулла

{

process = veib.getProcess();

}

for (int i = 0; i < size; i++)

{

disp += Math.Pow(process[i] - mat_oj,2);

}

disp = disp / (size - 1);

 

 

return disp;

 

}

 

public Double Calculate_k_assim()

{

 

Double[] process = new Double[size];

Double m3 = 0;

if (func_nun) //экспонента

{

 

process = exp.getProcess();

}

else // вейбулла

{

process = veib.getProcess();

}

for (int i = 0; i < size; i++)

{

m3 += Math.Pow(process[i] - mat_oj, 3);

}

m3 = m3 / (size-1);

 

k_assim = m3 / Math.Pow(disp,3/2);

 

return k_assim;

 

}

public Double Calculate_k_excess()

{

Double[] process = new Double[size];

Double m4 = 0;

if (func_nun) //экспонента

{

 

process = exp.getProcess();

}

else // вейбулла

{

process = veib.getProcess();

}

for (int i = 0; i < size; i++)

{

m4 += Math.Pow(process[i] - mat_oj, 4);

}

m4 = m4 / (size-1);

 

k_excess = (m4 / Math.Pow(disp, 2))-3;

return k_excess;

 

}

 

public void Calculate_sum_process()

{

Double tay = (Double) numericUpDown3.Value;

PointPairList list = new PointPairList();

 

if (func_nun) //экспонента

{

 

 

s_p = new Sum_process(exp.getProcess(),tay);

 

}

else // вейбулла

{

s_p = new Sum_process(veib.getProcess(), tay);

}

 

list = s_p.Calculate_summ_count();

 

 

// Получим панель для рисования

GraphPane pane = zedGraph_sum_process.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

 

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

LineItem myCurve = pane.AddCurve("Процесс сумм" + func_name,list,Color.Blue, SymbolType.None);

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

// В противном случае на рисунке будет показана только часть графика,

// которая умещается в интервалы по осям, установленные по умолчанию

zedGraph_sum_process.AxisChange();

 

// Обновляем график

zedGraph_sum_process.Invalidate();

 

}

 

public void Calculate_sum_gist()

{

 

 

PointPairList list = new PointPairList();

 

int col_count = (int)numericUpDown2.Value;

 

list = s_p.Calculate_gist(col_count);

 

 

// Получим панель для рисования

GraphPane gist_pane = zedGraph_sum_gist.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

gist_pane.CurveList.Clear();

 

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

 

 

BarItem bar = gist_pane.AddBar("Гистограмма сумм" + func_name, list, Color.Blue);

 

//!!! Расстояния между кластерами (группами столбиков) гистограммы = 0.0

// У нас в кластере только один столбик.

gist_pane.BarSettings.MinClusterGap = 0.0f;

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

zedGraph_sum_gist.AxisChange();

 

// Обновляем график

zedGraph_sum_gist.Invalidate();

 

}

 

public void Calculate_sum_dansity()

{

// Получим панель для рисования

GraphPane pane = zedGraph_sum_density.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

 

PointPairList list = new PointPairList();

list = s_p.getGlist();

 

 

string func_name = "Exponenta";

if (!func_nun)

func_name = "Veibulla";

 

LineItem myCurve = pane.AddCurve("Процесс сумм" + func_name, list, Color.Coral, SymbolType.None);

 

// Вызываем метод AxisChange (), чтобы обновить данные об осях.

// В противном случае на рисунке будет показана только часть графика,

// которая умещается в интервалы по осям, установленные по умолчанию

zedGraph_sum_density.AxisChange();

 

// Обновляем график

zedGraph_sum_density.Invalidate();

 

}

 

private void открытьToolStripMenuItem_Click(object sender, EventArgs e)

{

openFileDialog1.Filter = "Текстовый (*.txt)|*.txt";

openFileDialog1.ShowDialog();

 

 

}

 

private void openFileDialog1_FileOk(object sender, CancelEventArgs e)

{

string way;

if (openFileDialog1.FileName!= "")

{

//MessageBox.Show("Все ок");

 

way = openFileDialog1.FileName;

// Double[] s;

//int count;

//count = 0;

Double[] process;

// PointPairList list = new PointPairList();

Double discret;

// String [] str;

bool err = false;

 

string line ="";

System.IO.StreamReader file =

new System.IO.StreamReader(way);

 

if ((line = file.ReadLine())!= null)

{

if (!Int32.TryParse(line, out size))

{

err = true;

}

 

 

}

if(((line = file.ReadLine())!= null)&&(!err))

{

if (!Double.TryParse(line, out discret))

{

err = true;

}

 

 

}

 

// Read the file and display it line by line.

 

int i = 0;

process = new Double[size];

while (((line = file.ReadLine())!= null)&&(i<size)&&(!err))

{

if (!Double.TryParse(line, out process[i]))

{

err = true;

}

 

i++;

 

}

 

if (err)

{

MessageBox.Show("Некорректный формат файла");

file.Close();

 

}

else

{

file.Close();

exp.Analise_process(process);

veib.Analise_process(process);

exp.Calculate_gist((int)numericUpDown2.Value);

veib.Calculate_gist((int)numericUpDown2.Value);

PointPairList list = new PointPairList();

PointPairList tlist = new PointPairList();

double exp_delta = 0;

double veib_delta = 0;

int alpha_mega = 500;

int betta_mega = 500;

Double[,] exp_mega = new Double[alpha_mega-1,2 ];

Double[,] veib_mega = new Double[(alpha_mega-2)*(betta_mega-1),3];

Double [] min_exp = new Double[2];

Double[] min_veib = new Double[3];

 

list = exp.getGlist(); // экспонента

 

int h;

 

for (h = 1; h < alpha_mega; h++)

{

exp_delta = 0;

exp.Set_alpha(h);

tlist = exp.Calculate_theoretical_density();

 

for (int j=0; j < list.Count; j++)

{

exp_delta += Math.Abs(list.ElementAt(j).Y - tlist.ElementAt(j).Y);

 

}

exp_delta = exp_delta / list.Count;

exp_mega[h-1, 0] = h;

exp_mega[h-1, 1] = exp_delta;

if (h == 1)

{

min_exp[0] = exp_mega[0, 0];

min_exp[1] = exp_mega[0,1];

}

if (exp_mega[h - 1, 1] < min_exp[1])

{

min_exp[0] = exp_mega[h-1, 0];

min_exp[1] = exp_mega[h-1, 1];

 

}

 

}

 

list = veib.getGlist(); //вейбулла

 

int a;

long index =0;

for (a= 2; a < alpha_mega; a++) //экспонета это вейбулла при а = 1

{

for (int b = 1; b < betta_mega; b++)

{

 

veib_delta = 0;

veib.Set_alpha_betta(a,b);

tlist = veib.Calculate_theoretical_density();

 

for (int j = 0; j < list.Count; j++)

{

veib_delta += Math.Abs(list.ElementAt(j).Y - tlist.ElementAt(j).Y);

 

}

veib_delta = veib_delta / list.Count;

 

veib_mega[index, 0] = a;

veib_mega[index, 1] = b;

veib_mega[index, 2] = veib_delta;

 

 

if ((a == 2)&&(b==1))

{

min_veib[0] = veib_mega[0, 0];

min_veib[1] = veib_mega[0, 1];

min_veib[2] = veib_mega[0, 2];

 

}

if (veib_mega[index, 2] < min_veib[2])

{

min_veib[0] = veib_mega[index, 0];

min_veib[1] = veib_mega[index, 1];

min_veib[2] = veib_mega[index, 2];

 

}

index++;

}

 

}

 

string func_name = "Exponenta";

if (min_exp[1] < min_veib[2])

{

exp.Set_alpha(min_exp[0]);

// al

MessageBox.Show("Экспонента a="+min_exp[0]);

func_nun = true;

 

list = exp.Calculate_Exponenta_func_from_file();

 

}

else

{

veib.Set_alpha_betta(min_veib[0],min_veib[1]);

MessageBox.Show("Вейбулла a="+min_veib[0]+" b="+min_veib[1]);

func_nun = false;

list = veib.Calculate_Veobulla_func_from_file();

func_name = "Veibulla";

 

}

 

//////////////////////////////////////////////////////////////////

////////////////////Функция...................................

//////////////////////////////////////////////////////////////////

 

// Получим панель для рисования

GraphPane pane = zedGraph_func.GraphPane;

 

// Очистим список кривых на тот случай, если до этого сигналы уже были нарисованы

pane.CurveList.Clear();

LineItem myCurve = pane.AddCurve("Функция распределения " + func_name, list, Color.Coral, SymbolType.None);

 

zedGraph_func.AxisChange();

 

// Обновляем график

zedGraph_func.Invalidate();

 

 

//////////////////////////////////////////////////////////////////

////////////////////Процесс...................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_process();

 

//////////////////////////////////////////////////////////////////

////////////////////Гистограмма...................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_gist();

 

//////////////////////////////////////////////////////////////////

////////////////////Плотность...................................

//////////////////////////////////////////////////////////////////

 

Calculate_Plotnost();

 

//////////////////////////////////////////////////////////////////

////////////////////Мат.Ожидание.................................

//////////////////////////////////////////////////////////////////

 

Mat_oj_val.Text = Calculate_mat_oj().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Дисперсия.................................

//////////////////////////////////////////////////////////////////

 

disp_val.Text = Calculate_disp().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Коэфицент ассиметрии.................................

//////////////////////////////////////////////////////////////////

k_assim_val.Text = Calculate_k_assim().ToString();

 

//////////////////////////////////////////////////////////////////

////////////////////Коэфициет эксцесса.................................

//////////////////////////////////////////////////////////////////

 

k_excess_val.Text = Calculate_k_excess().ToString();

//////////////////////////////////////////////////////////////////

////////////////////Процесс сумм.................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_sum_process();

 

//////////////////////////////////////////////////////////////////

////////////////////Гистограмма сумм.................................

//////////////////////////////////////////////////////////////////

 

 

Calculate_sum_gist();

 

//////////////////////////////////////////////////////////////////

////////////////////Плотность сумм.................................

//////////////////////////////////////////////////////////////////

 

Calculate_sum_dansity();

 

}

 

 

}

 

}

 

private void saveFileDialog1_FileOk(object sender, CancelEventArgs e)

{

 

string way;

if (saveFileDialog1.FileName!= "")

{

way = saveFileDialog1.FileName;

String[] s;

int count;

Double[] process = new Double [size];

//PointPairList list = new PointPairList();

Double discret;

 

if (func_nun)

{

count = size + 2;

discret = (exp.getxmax() - exp.getxmin()) / size;

s = new string[count];

s[0] = size.ToString();

s[1] = discret.ToString();

process = exp.getProcess();

 

for (int i = 2; i < count; i++)

{

s[i] = process[i-2].ToString();

 

}

 

}

else

{

count = size + 2;

discret = (veib.getxmax() - veib.getxmin()) / size;

s = new string[count];

s[0] = size.ToString();

s[1] = discret.ToString();

process = veib.getProcess();

for (int i = 2; i < count; i++)

{

s[i] = process[i-2].ToString();

 

}

 

}

 

 

for (int n = 0; n < count; n++)

{

 

File.WriteAllLines(way, s);

 

 

}

 

 

}

 

}

 

private void выходToolStripMenuItem_Click(object sender, EventArgs e)

{

string message = "Вы действительно хотите выйти?";

string caption = "Выход";

MessageBoxButtons buttons = MessageBoxButtons.YesNo;

DialogResult result;

 

// Displays the MessageBox.

 

result = MessageBox.Show(message, caption, buttons);

 

if (result == System.Windows.Forms.DialogResult.Yes)

{

 

// Closes the parent form.

 

this.Close();

 

}

 

 

//zedGraph_func.MasterPane.GetImage().Save("test.bmp");

 

 

}

 

private void button2_Click(object sender, EventArgs e)

{

 

if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)

{

String way;

if (folderBrowserDialog1.SelectedPath!= null)

way = folderBrowserDialog1.SelectedPath;

else

way = folderBrowserDialog1.RootFolder.ToString();

 

zedGraph_process.MasterPane.GetImage().Save(way+"\\process.bmp");

zedGraph_func.MasterPane.GetImage().Save(way + "\\function.bmp");

zedGraph_gist.MasterPane.GetImage().Save(way + "\\gistogramm.bmp");

zedGraphDensity.MasterPane.GetImage().Save(way + "\\density.bmp");

zedGraph_sum_process.MasterPane.GetImage().Save(way + "\\sum_process.bmp");

zedGraph_sum_gist.MasterPane.GetImage().Save(way + "\\sum_gistogramm.bmp");

zedGraph_sum_density.MasterPane.GetImage().Save(way + "\\sum_density.bmp");

 

 

}

//zedGraph_func.MasterPane.GetImage().Save("test.bmp");

 

}

 

}

 

}

 

МодульExponent

Данный модуль осуществляет расчет основных характеристик экспоненциального распределения.

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ZedGraph;

 

namespace Kyrsovoi_erm

{

class Exponent

{

private PointPairList flist = new PointPairList();

 

private PointPairList glist;

 

private Double alpha=1;

// private Double discret= 0.001;

//private Double ymin = 0;

// private Double ymax = 1;

private Double xmin;

private Double xmax;

private Double[] process;

// private Double[] process_sort;

Double korigor;

Double[] gistX;

int c_count;

 

public void Set_alpha(Double a)

{

alpha = a;

 

}

 

public Double getxmin()

{

return xmin;

}

 

public Double getxmax()

{

return xmax;

}

 

public void Analise_process(Double [] p)

{

process = new Double[p.Length];

xmax = process[0];

xmin = process[0];

process = p;

size = p.Length;

 

// c_count = c;

 

for (int i = 0; i < process.Length; i++)

{

if (process[i] < xmin)

{

xmin = process[i];

}

if (process[i] > xmax)

{

xmax = process[i];

}

 

}

 

 

}

 

 

private int size = 0;

 

public int getflistCount()

{

return flist.Count();

}

 

public bool glistIsEmpty()

{

if (glist == null)

return true;

return false;

 

}

public Double[] getProcess()

{

return process;

}

/* public Double getDiscret()

{

return discret;

}*/

 

 

public bool flistIsEmpty()

{

if (flist.Count == 0)

return true;

return false;

}

 

public PointPairList getGlist()

{

return glist;

}

public PointPairList getFlist()

{

return flist;

}

 

public void update(Double a, int s)

{

alpha = a;

//discret = d;

size = s;

}

 

public PointPairList Calculate_Exponenta_func(Double a, int s)

{

process = new Double[s];

//process_sort = new Double[s];

Random r = new Random();

double y;

double x_res;

update(a, s);

flist.Clear();

 

y = r.NextDouble();

x_res = f_exp_r(a, y);

process[0] = x_res;

 

xmax = x_res;

xmin = x_res;

flist.Add(x_res, y);

 

for (int i =1; i < size; i ++)

{

y = r.NextDouble();

x_res=f_exp_r(a,y);

// добавим в список точку

flist.Add(x_res,y);

process[i] = x_res;

 

if (x_res > xmax)

{

xmax = x_res;

// ymax2 = y;

}

if (x_res < xmin)

{

xmin = x_res;

// ymax2 = y;

}

 

 

}

flist.Sort();

 

/* for (int i = 0; i < size; i++)

{

process_sort[i] = flist.ElementAt(i).X;

}*/

 

 

return flist;

}

 

 

public PointPairList Calculate_Exponenta_func_from_file()

{

 

//process_sort = new Double[size];

 

double x;

double y_res;

 

flist.Clear();

 

for (int i = 0; i < size; i++)

{

 

x = process[i];

y_res = f_exp(x);

flist.Add(x, y_res);

 

}

 

flist.Sort();

 

/* for (int i = 0; i < size; i++)

{

process_sort[i] = flist.ElementAt(i).X;

}*/

 

 

return flist;

}

 

private double f_exp(Double x)

{

if (x == 0)

{

return 0;

}

 

return 1-(Math.Exp(-alpha*x));

 

 

}

 

 

private double f_exp_r(Double a, Double y)

{

if (y == 0)

{

return 0;

}

 

return (-1 / a) * (Math.Log((1 - y), Math.E));

}

private double f_exp_densitY(double x)

{

 

if (x < 0)

{

return 0;

}

else

{

return alpha*Math.Pow(Math.E,(-alpha*x));

 

}

 

 

}

 

public PointPairList Calculate_theoretical_density()

{

PointPairList list = new PointPairList();

Double y;

Double x;

Double sum = 0;

for(int i=0;i<c_count;i++)

{

x =gistX[i];

y = f_exp_densitY(x);

sum += y;

//list.Add(x,y);

 

 

}

for (int i = 0; i < c_count; i++)

{

x = gistX[i];

y = f_exp_densitY(x);

 

list.Add(x,y/sum);

 

 

}

 

return list;

 

}

 

public PointPairList Calculate_gist(int c_c)

{

c_count = c_c;

 

 

Double [] gistY = new Double[c_c];

gistX = new Double[c_c];

 

korigor = (xmax - xmin) / c_c; //ширина коридора

 

//Считаем середину для каждого столбика гистограммы

int h = 0;

for (Double i = xmin+korigor/2; i < xmax; i +=korigor)

{

gistX[h] = i;

h++;

}

 

int j;

for (int i = 0; i < size; i++)

{

j = (int) (((process[i])-xmin) / korigor);

 

if ((((process[i]) - xmin) % korigor!= 0) && ((process[i])!= xmax))

{

 

gistY[j] = gistY[j] + 1;

}

else

{

if (((process[i])!= xmax) && ((process[i])!= xmin))

{

gistY[j - 1] = gistY[j - 1] + 1/2;

gistY[j] = gistY[j] + 1/2;

}

 

else

{

if ((process[i]) == xmax)

gistY[j - 1] = gistY[j - 1] + 1;

 

if ((process[i]) == xmin)

gistY[j] = gistY[j] + 1;

 

 

}

 

}

 

}

 

 

Double temp=0;

for (int i = 0; i < c_c; i++)

{

gistY[i] = gistY[i] / size;

 

temp += gistY[i];

 

}

temp = temp * korigor;

 

glist = new PointPairList(gistX, gistY);

return glist;

}

 

}

}

 

Модуль Veibulla

Данный модуль осуществляет расчет основных характеристик распределения Вейбулла

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ZedGraph;

 

namespace Kyrsovoi_erm

{

public class Veibolla

{

 

private PointPairList flist = new PointPairList();

private Double alpha=1;

private Double betta=1;

// private Double discret;

// private Double ymin = 0;

// private Double ymax = 1;

private PointPairList glist;

private int size = 0;

private int c_count; // количество коридоров

 

private Double korigor;

 

private Double xmin;

private Double xmax;

private Double [] process;

Double[] gistX; // серидины коридоров

 

public Double[] getProcess()

{

return process;

}

public void Set_alpha_betta(Double a,Double b)

{

alpha = a;

betta = b;

 

}

public void Analise_process(Double[] p)

{

process = new Double[p.Length];

xmax = process[0];

xmin = process[0];

process = p;

size = p.Length;

 

// c_count = c;

 

for (int i = 0; i < process.Length; i++)

{

if (process[i] < xmin)

{

xmin = process[i];

}

if (process[i] > xmax)

{

xmax = process[i];

}

 

}

 

}

 

 

public PointPairList Calculate_Veobulla_func_from_file()

{

 

//process_sort = new Double[size];

 

double x;

double y_res;

 

flist.Clear();

 

for (int i = 0; i < size; i++)

{

 

x = process[i];

y_res = f_veib(x);

flist.Add(x, y_res);

 

}

 

flist.Sort();

 

 

return flist;

}

 

public bool glistIsEmpty()

{

if (glist == null)

return true;

return false;

 

}

public bool flistIsEmpty()

{

if (flist.Count == 0)

return true;

return false;

}

public int getflistCount()

{

return flist.Count();

}

public PointPairList getGlist()

{

return glist;

}

/* public Double getDiscret()

{

return discret;

}

* */

public PointPairList getFlist()

{

return flist;

}

 

public void update(Double a, Double b, int s)

{

alpha = a;

betta = b;

size = s;

// discret = d;

}

 

public PointPairList Calculate_Veibolla_func(Double a, Double b, int s)

{

process = new Double [s];

Random r = new Random();

double y;

double x_res;

update(a,b,s);

flist.Clear();

 

y = r.NextDouble();

x_res = f_veib_r(a,b,y);

process[0] = x_res;

 

xmax = x_res;

xmin = x_res;

flist.Add(x_res, y);

// Сохраняем значения в объекте класса

/* for (double y = ymin; y < ymax; y += d)

{

x_res = f_veib(a,b,y);

 

// добавим в список точку

flist.Add(x_res,y);

if (x_res > xmax)

xmax = x_res;

}*/

 

for (int i = 1; i < size; i++)

{

y = r.NextDouble();

x_res = f_veib_r(a,b,y);

// добавим в список точку

flist.Add(x_res, y);

process[i] = x_res;

 

if (x_res > xmax)

{

xmax = x_res;

// ymax2 = y;

}

if (x_res < xmin)

{

xmin = x_res;

// ymax2 = y;

}

 

 

}

flist.Sort();

 

return flist;

}

 

 

private double f_veib(Double x)

{

if (x == 0)

{

return 0;

}

 

return 1-Math.Exp(-betta*Math.Pow(x,alpha));

}

 

private double f_veib_r(Double a, Double b, Double y)

{

if (y == 0)

{

return 0;

}

 

return Math.Pow(-1 / b * Math.Log(1 - y, Math.E), 1/a); //(-1 / Double.Parse(textBox1.Text)) * (Math.Log((1 - y), Math.E));

}

 

 

private double f_veib_densitY(double x)

{

 

if (x < 0)

{

return 0;

}

else

{

return alpha *betta* Math.Pow(x, (alpha - 1))*Math.Pow(Math.E,(-betta*Math.Pow(x,alpha)));

 

}

 

 

}

 

public PointPairList Calculate_theoretical_density()

{

PointPairList list = new PointPairList();

Double y;

Double x;

Double sum = 0;

for (int i = 0; i < c_count; i++)

{

x = gistX[i];

y = f_veib_densitY(x);

sum += y;

//list.Add(x,y);

 

 

}

for (int i = 0; i < c_count; i++)

{

x = gistX[i];

y = f_veib_densitY(x);

 

list.Add(x, y / sum);

 

 

}

 

return list;

 

}

 

public Double getxmin()

{

return xmin;

}

 

public Double getxmax()

{

return xmax;

}

 

public PointPairList Calculate_gist(int c_c)

{

c_count = c_c;

Double [] gistY = new Double[c_c];

gistX = new Double[c_c];

 

korigor = (xmax - xmin) / c_c; //ширина коридора

 

//Считаем середину для каждого столбика гистограммы

int h = 0;

for (Double i = xmin+korigor/2; i < xmax; i +=korigor)

{

gistX[h] = i;

h++;

}

 

int j;

for (int i = 0; i < size; i++)

{

j = (int)(((process[i]) - xmin) / korigor);

 

if ((((process[i]) - xmin) % korigor!= 0) && ((process[i])!= xmax))

{

 

gistY[j] = gistY[j] + 1;

}

else

{

if (((process[i])!= xmax) && ((process[i])!= xmin))

{

gistY[j - 1] = gistY[j - 1] + 1/2;

gistY[j] = gistY[j] + 1/2;

}

 

else

{

if ((process[i]) == xmax)

gistY[j - 1] = gistY[j - 1] + 1;

 

if ((process[i]) == xmin)

gistY[j] = gistY[j] + 1;

 

 

}

 

}

 

}

 

 

Double temp=0;

for (int i = 0; i < c_c; i++)

{

gistY[i] = gistY[i] / size;

 

temp += gistY[i];

 

}

temp = temp * korigor;

 

glist = new PointPairList(gistX, gistY);

return glist;

 

}

 

 

}

}

 

Модуль Sum_process

В данном модуле рассчитываются и храняться основные параметры сумм значений случайных величин.

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using ZedGraph;

 

namespace Kyrsovoi_erm

{

 

public class Sum_process

{

 

private Double[] sourse_process;

private int size;

private Double tay;

private PointPairList dest_process;

private Double c_count;

private Double[] gistX;

private Double xmin;

private Double xmax;

private PointPairList glist;

 

public PointPairList getGlist()

{

return glist;

}

 

 

public Sum_process(Double[]s_process,Double t)

{

tay = t;

size = s_process.Length;

sourse_process = new Double[size];

sourse_process = s_process;

 

}

public PointPairList Calculate_summ_count()

{

dest_process = new PointPairList();

Double sum;

int j;

int i_i;

 

for (int i = 0; i < size; i++)

{

i_i = i;

sum= sourse_process[i];

j = 0;

 

 

while ((sum<tay)&&(i_i+1<size))

{

j++;

sum += sourse_process[i_i++];

 

}

 

if (i == 0)

{

xmin = j;

xmax = j;

}

if (j < xmin)

{

xmin = j;

}

if (j > xmax)

{

xmax = j;

}

 

dest_process.Add(i,j);

 

 

}

 

return dest_process;

 

}

 

public PointPairList Calculate_gist(int c_c)

{

c_count = c_c;

Double[] gistY = new Double[c_c];

gistX = new Double[c_c];

 

Double korigor = (xmax - xmin) / c_c; //ширина коридора

 

//Считаем середину для каждого столбика гистограммы

int h = 0;

for (Double i = xmin + korigor / 2; i < xmax; i += korigor)

{

gistX[h] = i;

h++;

}

 

int j;

for (int i = 0; i < size; i++)

{

Double temp2 = dest_process.ElementAt(i).Y;

j = (int)(((dest_process.ElementAt(i).Y) - xmin) / korigor);

 

//j = (int)temp1;

 

if ((((dest_process.ElementAt(i).Y) - xmin) % korigor!= 0) && ((dest_process.ElementAt(i).Y)!= xmax))

{

 

gistY[j] = gistY[j] + 1;

}

else

{

if (((dest_process.ElementAt(i).Y)!= xmax) && ((dest_process.ElementAt(i).Y)!= xmin))

{

gistY[j - 1] = gistY[j - 1] + 1 / 2;

gistY[j] = gistY[j] + 1 / 2;

}

 

else

{

if ((dest_process.ElementAt(i).Y) == xmax)

gistY[j - 1] = gistY[j - 1] + 1;

 

if ((dest_process.ElementAt(i).Y) == xmin)

gistY[j] = gistY[j] + 1;

 

 

}

 

}

 

}

 

 

// Double temp = 0;

for (int i = 0; i < c_c; i++)

{

gistY[i] = gistY[i] / size;

 

// temp += gistY[i];

 

}

//temp = temp * korigor;

 

glist = new PointPairList(gistX, gistY);

return glist;

 

}

 

}

}

 

 


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: