Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Drawing;
- using System.Windows.Forms;
- namespace graph_course
- {
- public partial class Form1 : Form
- {
- //
- Random rand = new Random();
- float[] Pi_t, kSi;
- float[] mid_Pi_t;
- //счетчик графиков
- int k = 0, pos_last = 0;
- private bool isTimeMode = true;
- public Form1()
- {
- InitializeComponent();
- }
- public void addSeries(int n, int k, float[] pi_t, float t, int size, int pen_width, bool isRed, bool isLine)//k - какой по счету добавляем
- {
- //настрйоки чарта
- if (!isLine) chartField.Series[k].ChartType =
- System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StepLine;
- else chartField.Series[k].ChartType =
- System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
- if (isRed) chartField.Series[k].Color = Color.Red;
- chartField.Series[k].BorderWidth = pen_width;
- //построение графика
- float step = t / size; int i = 0;
- for (float xTime = 0; xTime < t; i++, xTime += step)
- if (!isLine) chartField.Series[k].Points.AddXY(xTime, pi_t[i]);
- else
- if (i > 0 && pi_t[i] != pi_t[i-1]) chartField.Series[k].Points.AddXY(xTime, pi_t[i]);
- else if (i < 1) chartField.Series[k].Points.AddXY(xTime, 0);
- }
- private void Form1_Load(object sender, EventArgs e)
- {
- //
- output.Items.Clear();
- }
- private int funcPi_t(int n, float t, int last, int kSi)
- {
- int result = 0;
- if (t >= 1/4) result = last + kSi;
- return result;
- }
- private int generatorTP(Random rand, double wall)//генерируем числа
- {
- if (rand.NextDouble() < wall)
- return 1;
- else return 0;
- }
- private double normalRange(Random rand, double a, double b)//генерируем числа
- {
- var result = (rand.NextDouble()
- * (b - a)) + a;
- return (double)result;
- }
- private void addGraphBtn_Click(object sender, EventArgs e)
- {
- GC.Collect();
- System.Diagnostics.Stopwatch _sw = new System.Diagnostics.Stopwatch();
- _sw.Reset();
- _sw.Start();
- int n = Convert.ToInt32(inputN.Text);
- float t = Convert.ToSingle(inputT.Text); double lymbda = Convert.ToSingle(inpLymbda.Text);
- int sizeNT = Convert.ToInt32(n * t);
- mid_Pi_t = new float[sizeNT + 1];
- //настрйоки чарта
- chartField.Series[0].LegendText = String.Format("Трасеров {0}", k + 1);
- chartField.ChartAreas[0].AxisX.Minimum = 0;
- chartField.ChartAreas[0].AxisX.Interval = Math.Round(t / 7, 0);
- chartField.ChartAreas[0].AxisY.Interval = Math.Round(t / 7, 0);
- //выделяем память
- Pi_t = new float[sizeNT + 1];
- kSi = new float[sizeNT + 1];
- float step = t / n, xTime = 0;
- if (lymbda / n < 1)
- {
- for (int how = 0; how < Convert.ToInt32(howKG.Text); how++)
- {
- Pi_t[0] = 0;
- step = t / n;
- xTime = 0;
- pos_last = 0;
- if (isTimeMode || !isTimeMode) {
- for (int i = 0; i <= sizeNT; i++)
- kSi[i] = generatorTP(rand, lymbda / Convert.ToDouble(n));
- for (int p = 1; p <= sizeNT; p++, xTime += step) {
- Pi_t[p] = funcPi_t(n, xTime, Convert.ToInt32(Pi_t[pos_last]), Convert.ToInt32(kSi[p]));
- //позиция последнего не нулевого
- if (kSi[p] != 0)
- pos_last = p;
- //для расчетов среднего
- mid_Pi_t[p] += Pi_t[p];
- }
- } else {
- /*
- float ksi = 0;
- float nu = generatorTP(rand, 1);
- int index = 0;
- while (xTime < t) {
- ksi = Convert.ToSingle((1 / lymbda) * Math.Log(normalRange(rand, 0, 1)));
- Pi_t[index] = index;
- index++;
- xTime += ksi;
- }
- */
- }
- addSeries(n, k, Pi_t, t, sizeNT, 3, false, false);
- k++;//+1 график
- chartField.Series.Add(String.Format("Series{0}", k + 1));
- chartField.Series[k].IsVisibleInLegend = false;
- }
- //calc mid --- summ / count
- for (int p = 1; p <= sizeNT; p++)
- mid_Pi_t[p] /= Convert.ToInt32(howKG.Text);
- }
- else
- {
- stringmessage = "Введены не верные значение лямбда или n. \nЛямба/n должно быть << 1!";
- string caption = "Ошибка ввода";
- MessageBoxButtons buttons = MessageBoxButtons.OK;
- DialogResult result;
- result = MessageBox.Show(message, caption, buttons);
- }
- _sw.Stop();
- output.Items.Add("Время выполнения: " + _sw.ElapsedMilliseconds + " мс.\n");
- output.Items.Add(isTimeMode ? "Способ по времени" : "Способ событийный");
- button1.Enabled = true;
- }
- private void clearBtn_Click(object sender, EventArgs e)//стереть
- {
- for (int i = k; i >= 0; i--)
- {
- chartField.Series[i].Points.Clear();
- if (i != 0) chartField.Series.RemoveAt(i);
- }
- k = 0;
- output.Items.Clear();
- button1.Enabled = false;
- }
- //для отрисовки средней траектории
- private void button1_Click(object sender, EventArgs e) {
- int n = Convert.ToInt32(inputN.Text);
- float t = Convert.ToSingle(inputT.Text); double lymbda = Convert.ToSingle(inpLymbda.Text);
- int sizeNT = Convert.ToInt32(n * t);
- //рассчеты выборочного среднего
- if (mid_Pi_t != null) {
- addSeries(n, k, mid_Pi_t, t, sizeNT, 5, true, true);
- float mean = 0;
- float step = t / sizeNT, time = 0;
- float summKV = 0;
- //float summInKV = 2;
- output.Items.Add("Выборочноесреднее:");
- //output.Items.Add("Испр. выб. дисперсия:");
- for (int i = 0; i < sizeNT; i++){
- mean += mid_Pi_t[i];
- summKV += mid_Pi_t[i] * mid_Pi_t[i];
- //summInKV += mid_Pi_t[i];
- output.Items.Add("X[" + Math.Round(time, 2) + "]: " + Math.Round(mean / i,2));
- //output.Items.Add("D[" + Math.Round(time, 2) + "]: " + Math.Round(summKV/i - ((summInKV / i) * (summInKV / i)), 2));
- time += step;
- }
- mean /= sizeNT-1;
- //summInKV /= sizeNT - 1;
- //summInKV *= summInKV;
- output.Items.Add("X["+t+"]: "+Math.Round(mean,2));
- //output.Items.Add("D[" + t + "]: " + Math.Round(summKV / (sizeNT-1) - summInKV, 2));
- }
- else output.Items.Add("[0] Ошибка!");
- k++;//+1 график
- chartField.Series.Add(String.Format("Series{0}", k + 1));
- chartField.Series[k].IsVisibleInLegend = false;
- }
- private void radioButton1_CheckedChanged(object sender, EventArgs e) {
- isTimeMode = true;
- }
- private void maxYInp_TextChanged(object sender, EventArgs e)
- {
- scaleChanged(1);
- }
- private void radioButton2_CheckedChanged(object sender, EventArgs e) {
- isTimeMode = false;
- }
- private void minYInp_TextChanged(object sender, EventArgs e)
- {
- scaleChanged(2);
- }
- private void scaleChanged(int type)
- {
- switch (type)
- {
- case 1:
- if (maxYInp.Text != "" && maxYInp.Text != "-" && minYInp.Text != "--" &&
- Convert.ToInt32(maxYInp.Text)> Convert.ToInt32(minYInp.Text))
- chartField.ChartAreas[0].AxisY.Maximum = Convert.ToInt32(maxYInp.Text);
- break;
- case 2:
- if (minYInp.Text != "" && minYInp.Text != "-" && minYInp.Text != "--" &&
- Convert.ToInt32(maxYInp.Text) > Convert.ToInt32(minYInp.Text))
- chartField.ChartAreas[0].AxisY.Minimum = Convert.ToInt32(minYInp.Text);
- break;
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement