Advertisement
Guest User

Untitled

a guest
Oct 24th, 2018
98
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.07 KB | None | 0 0
  1. using System;
  2. using System.Drawing;
  3. using System.Windows.Forms;
  4. namespace graph_course
  5. {
  6. public partial class Form1 : Form
  7. {
  8. //
  9. Random rand = new Random();
  10. float[] Pi_t, kSi;
  11. float[] mid_Pi_t;
  12. //счетчик графиков
  13. int k = 0, pos_last = 0;
  14.  
  15. private bool isTimeMode = true;
  16. public Form1()
  17. {
  18. InitializeComponent();
  19. }
  20.  
  21. public void addSeries(int n, int k, float[] pi_t, float t, int size, int pen_width, bool isRed, bool isLine)//k - какой по счету добавляем
  22. {
  23. //настрйоки чарта
  24. if (!isLine) chartField.Series[k].ChartType =
  25. System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StepLine;
  26. else chartField.Series[k].ChartType =
  27. System.Windows.Forms.DataVisualization.Charting.SeriesChartType.Line;
  28.  
  29. if (isRed) chartField.Series[k].Color = Color.Red;
  30. chartField.Series[k].BorderWidth = pen_width;
  31. //построение графика
  32. float step = t / size; int i = 0;
  33. for (float xTime = 0; xTime < t; i++, xTime += step)
  34. if (!isLine) chartField.Series[k].Points.AddXY(xTime, pi_t[i]);
  35. else
  36. if (i > 0 && pi_t[i] != pi_t[i-1]) chartField.Series[k].Points.AddXY(xTime, pi_t[i]);
  37. else if (i < 1) chartField.Series[k].Points.AddXY(xTime, 0);
  38. }
  39. private void Form1_Load(object sender, EventArgs e)
  40. {
  41. //
  42. output.Items.Clear();
  43. }
  44. private int funcPi_t(int n, float t, int last, int kSi)
  45. {
  46. int result = 0;
  47. if (t >= 1/4) result = last + kSi;
  48.  
  49. return result;
  50. }
  51. private int generatorTP(Random rand, double wall)//генерируем числа
  52. {
  53. if (rand.NextDouble() < wall)
  54. return 1;
  55. else return 0;
  56. }
  57. private double normalRange(Random rand, double a, double b)//генерируем числа
  58. {
  59. var result = (rand.NextDouble()
  60. * (b - a)) + a;
  61. return (double)result;
  62. }
  63. private void addGraphBtn_Click(object sender, EventArgs e)
  64. {
  65. GC.Collect();
  66. System.Diagnostics.Stopwatch _sw = new System.Diagnostics.Stopwatch();
  67. _sw.Reset();
  68. _sw.Start();
  69.  
  70. int n = Convert.ToInt32(inputN.Text);
  71. float t = Convert.ToSingle(inputT.Text); double lymbda = Convert.ToSingle(inpLymbda.Text);
  72. int sizeNT = Convert.ToInt32(n * t);
  73. mid_Pi_t = new float[sizeNT + 1];
  74. //настрйоки чарта
  75. chartField.Series[0].LegendText = String.Format("Трасеров {0}", k + 1);
  76. chartField.ChartAreas[0].AxisX.Minimum = 0;
  77. chartField.ChartAreas[0].AxisX.Interval = Math.Round(t / 7, 0);
  78. chartField.ChartAreas[0].AxisY.Interval = Math.Round(t / 7, 0);
  79. //выделяем память
  80. Pi_t = new float[sizeNT + 1];
  81. kSi = new float[sizeNT + 1];
  82. float step = t / n, xTime = 0;
  83. if (lymbda / n < 1)
  84. {
  85. for (int how = 0; how < Convert.ToInt32(howKG.Text); how++)
  86. {
  87. Pi_t[0] = 0;
  88. step = t / n;
  89. xTime = 0;
  90. pos_last = 0;
  91. if (isTimeMode || !isTimeMode) {
  92. for (int i = 0; i <= sizeNT; i++)
  93. kSi[i] = generatorTP(rand, lymbda / Convert.ToDouble(n));
  94.  
  95. for (int p = 1; p <= sizeNT; p++, xTime += step) {
  96. Pi_t[p] = funcPi_t(n, xTime, Convert.ToInt32(Pi_t[pos_last]), Convert.ToInt32(kSi[p]));
  97.  
  98. //позиция последнего не нулевого
  99. if (kSi[p] != 0)
  100. pos_last = p;
  101. //для расчетов среднего
  102. mid_Pi_t[p] += Pi_t[p];
  103. }
  104. } else {
  105. /*
  106. float ksi = 0;
  107. float nu = generatorTP(rand, 1);
  108. int index = 0;
  109.  
  110. while (xTime < t) {
  111. ksi = Convert.ToSingle((1 / lymbda) * Math.Log(normalRange(rand, 0, 1)));
  112. Pi_t[index] = index;
  113. index++;
  114. xTime += ksi;
  115. }
  116. */
  117. }
  118. addSeries(n, k, Pi_t, t, sizeNT, 3, false, false);
  119. k++;//+1 график
  120. chartField.Series.Add(String.Format("Series{0}", k + 1));
  121. chartField.Series[k].IsVisibleInLegend = false;
  122. }
  123. //calc mid --- summ / count
  124. for (int p = 1; p <= sizeNT; p++)
  125. mid_Pi_t[p] /= Convert.ToInt32(howKG.Text);
  126. }
  127. else
  128. {
  129. stringmessage = "Введены не верные значение лямбда или n. \nЛямба/n должно быть << 1!";
  130. string caption = "Ошибка ввода";
  131. MessageBoxButtons buttons = MessageBoxButtons.OK;
  132. DialogResult result;
  133.  
  134. result = MessageBox.Show(message, caption, buttons);
  135. }
  136. _sw.Stop();
  137. output.Items.Add("Время выполнения: " + _sw.ElapsedMilliseconds + " мс.\n");
  138. output.Items.Add(isTimeMode ? "Способ по времени" : "Способ событийный");
  139. button1.Enabled = true;
  140. }
  141. private void clearBtn_Click(object sender, EventArgs e)//стереть
  142. {
  143. for (int i = k; i >= 0; i--)
  144. {
  145. chartField.Series[i].Points.Clear();
  146. if (i != 0) chartField.Series.RemoveAt(i);
  147. }
  148. k = 0;
  149. output.Items.Clear();
  150. button1.Enabled = false;
  151. }
  152. //для отрисовки средней траектории
  153. private void button1_Click(object sender, EventArgs e) {
  154. int n = Convert.ToInt32(inputN.Text);
  155. float t = Convert.ToSingle(inputT.Text); double lymbda = Convert.ToSingle(inpLymbda.Text);
  156. int sizeNT = Convert.ToInt32(n * t);
  157. //рассчеты выборочного среднего
  158. if (mid_Pi_t != null) {
  159. addSeries(n, k, mid_Pi_t, t, sizeNT, 5, true, true);
  160. float mean = 0;
  161. float step = t / sizeNT, time = 0;
  162. float summKV = 0;
  163. //float summInKV = 2;
  164. output.Items.Add("Выборочноесреднее:");
  165. //output.Items.Add("Испр. выб. дисперсия:");
  166. for (int i = 0; i < sizeNT; i++){
  167. mean += mid_Pi_t[i];
  168. summKV += mid_Pi_t[i] * mid_Pi_t[i];
  169. //summInKV += mid_Pi_t[i];
  170. output.Items.Add("X[" + Math.Round(time, 2) + "]: " + Math.Round(mean / i,2));
  171. //output.Items.Add("D[" + Math.Round(time, 2) + "]: " + Math.Round(summKV/i - ((summInKV / i) * (summInKV / i)), 2));
  172. time += step;
  173. }
  174. mean /= sizeNT-1;
  175. //summInKV /= sizeNT - 1;
  176. //summInKV *= summInKV;
  177. output.Items.Add("X["+t+"]: "+Math.Round(mean,2));
  178. //output.Items.Add("D[" + t + "]: " + Math.Round(summKV / (sizeNT-1) - summInKV, 2));
  179. }
  180. else output.Items.Add("[0] Ошибка!");
  181. k++;//+1 график
  182. chartField.Series.Add(String.Format("Series{0}", k + 1));
  183. chartField.Series[k].IsVisibleInLegend = false;
  184. }
  185. private void radioButton1_CheckedChanged(object sender, EventArgs e) {
  186. isTimeMode = true;
  187. }
  188. private void maxYInp_TextChanged(object sender, EventArgs e)
  189. {
  190. scaleChanged(1);
  191. }
  192. private void radioButton2_CheckedChanged(object sender, EventArgs e) {
  193. isTimeMode = false;
  194. }
  195. private void minYInp_TextChanged(object sender, EventArgs e)
  196. {
  197. scaleChanged(2);
  198. }
  199. private void scaleChanged(int type)
  200. {
  201. switch (type)
  202. {
  203. case 1:
  204. if (maxYInp.Text != "" && maxYInp.Text != "-" && minYInp.Text != "--" &&
  205. Convert.ToInt32(maxYInp.Text)> Convert.ToInt32(minYInp.Text))
  206. chartField.ChartAreas[0].AxisY.Maximum = Convert.ToInt32(maxYInp.Text);
  207. break;
  208.  
  209. case 2:
  210. if (minYInp.Text != "" && minYInp.Text != "-" && minYInp.Text != "--" &&
  211. Convert.ToInt32(maxYInp.Text) > Convert.ToInt32(minYInp.Text))
  212. chartField.ChartAreas[0].AxisY.Minimum = Convert.ToInt32(minYInp.Text);
  213. break;
  214. }
  215. }
  216.  
  217. }
  218. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement