Advertisement
Guest User

Untitled

a guest
Nov 27th, 2014
182
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.15 KB | None | 0 0
  1. // расчет для вывода
  2.  
  3. EnterParameters();
  4. Random();
  5. cl1.oP = Convert.ToDouble(cl1.n) / Convert.ToDouble(amount);
  6. cl2.oP = Convert.ToDouble(cl2.n) / Convert.ToDouble(amount);
  7. CalcEval(ref cl1);
  8. CalcEval(ref cl2);
  9. CalcError();
  10. cl1.Po = Convert.ToDouble(cl1.cntPo) / Convert.ToDouble(cl1.n);
  11. cl2.Po = Convert.ToDouble(cl2.cntPo) / Convert.ToDouble(cl2.n);
  12. Po = Convert.ToDouble(cl1.cntPo + cl2.cntPo) / Convert.ToDouble(amount);
  13. tmpCl1 = cl1;
  14. tmpCl2 = cl2;
  15. tmpAmount = amount;
  16.  
  17. // расчет для графика
  18.  
  19. private void Graph2()
  20. {
  21. graph2 = new Graph();
  22. graph2.X = new List<double>();
  23. graph2.Y = new List<double>();
  24.  
  25. //EnterParameters();
  26. double tmp = 0.0;
  27. cl1 = tmpCl1;
  28. cl2 = tmpCl2;
  29. amount = tmpAmount;
  30.  
  31.  
  32. for (int i = 0; i < 100; i++)
  33. {
  34. cl1.mas1.Clear();
  35. cl1.mas2.Clear();
  36. cl1.cntPo = 0;
  37.  
  38. cl2.mas1.Clear();
  39. cl2.mas2.Clear();
  40. cl2.cntPo = 0;
  41.  
  42. EnterParameters();
  43. tmp += 0.05;
  44.  
  45. cl2.d1 += tmp;
  46. cl2.d2 += tmp;
  47.  
  48. Random();
  49. cl1.oP = Convert.ToDouble(cl1.n) / Convert.ToDouble(amount);
  50. cl2.oP = Convert.ToDouble(cl2.n) / Convert.ToDouble(amount);
  51.  
  52. CalcEval(ref cl1);
  53. CalcEval(ref cl2);
  54. CalcError();
  55. cl1.Po = Convert.ToDouble(cl1.cntPo) / Convert.ToDouble(cl1.n);
  56. cl2.Po = Convert.ToDouble(cl2.cntPo) / Convert.ToDouble(cl2.n);
  57.  
  58. graph2.X.Add(Math.Abs((cl2.d1 + cl2.d2)/2.0 - (cl1.d1 + cl1.d2)/2.0));
  59. graph2.Y.Add(Convert.ToDouble(cl1.cntPo + cl2.cntPo) / Convert.ToDouble(amount));
  60. }
  61.  
  62. // функции расчета
  63.  
  64. private void EnterParameters()
  65. {
  66. cl1 = new Class();
  67. cl1.cntPo = 0;
  68. cl1.m1 = Convert.ToDouble(tbx_M11.Text);
  69. cl1.m2 = Convert.ToDouble(tbx_M12.Text);
  70. cl1.d1 = Math.Sqrt(Convert.ToDouble(tbx_D11.Text));
  71. cl1.d2 = Math.Sqrt(Convert.ToDouble(tbx_D12.Text));
  72. cl1.P = Convert.ToDouble(tbx_P1.Text);
  73. cl1.mas1 = new List<double>();
  74. cl1.mas2 = new List<double>();
  75.  
  76. cl2 = new Class();
  77. cl2.cntPo = 0;
  78. cl2.m1 = Convert.ToDouble(tbx_M21.Text);
  79. cl2.m2 = Convert.ToDouble(tbx_M22.Text);
  80. cl2.d1 = Math.Sqrt(Convert.ToDouble(tbx_D21.Text));
  81. cl2.d2 = Math.Sqrt(Convert.ToDouble(tbx_D22.Text));
  82. cl2.P = Convert.ToDouble(tbx_P2.Text);
  83. cl2.mas1 = new List<double>();
  84. cl2.mas2 = new List<double>();
  85.  
  86. amount = Convert.ToInt32(tbx_N.Text);
  87. }
  88.  
  89. private void Random()
  90. {
  91. double tmpRand = 0;
  92. double tmpRand1 = 0;
  93. double tmpRand2 = 0;
  94. double S;
  95. Random newRand = new Random();
  96.  
  97. for (int i = 0; i < amount; i++)
  98. {
  99. S = 1;
  100. tmpRand = newRand.NextDouble();
  101. while (S >= 1)
  102. {
  103. tmpRand1 = newRand.NextDouble();
  104. tmpRand2 = newRand.NextDouble();
  105. S = Math.Pow((2.0 * tmpRand1 - 1.0), 2) + Math.Pow((2.0 * tmpRand2 - 1.0), 2);
  106. }
  107.  
  108. if (tmpRand < cl1.P)
  109. {
  110. GetRandom(tmpRand1, tmpRand2, S, ref cl1);
  111. }
  112. else
  113. {
  114. GetRandom(tmpRand1, tmpRand2, S, ref cl2);
  115. }
  116. }
  117.  
  118. cl1.n = cl1.mas1.Count;
  119. cl2.n = cl2.mas1.Count;
  120. }
  121.  
  122. private void GetRandom(double tmp1, double tmp2, double S, ref Class cl)
  123. {
  124. double X = (2 * tmp1 - 1) * Math.Sqrt(-2 * Math.Log(S) / S);
  125. double Y = (2 * tmp2 - 1) * Math.Sqrt(-2 * Math.Log(S) / S);
  126.  
  127. X = cl.d1 * X + cl.m1;
  128. Y = cl.d2 * Y + cl.m2;
  129.  
  130. cl.mas1.Add(X);
  131. cl.mas2.Add(Y);
  132. }
  133.  
  134.  
  135. private void CalcEval(ref Class cl)
  136. {
  137. double tmp1 = 0.0;
  138. double tmp2 = 0.0;
  139.  
  140. for (int i = 0; i < cl.n; i++)
  141. {
  142. tmp1 += cl.mas1[i];
  143. tmp2 += cl.mas2[i];
  144. }
  145. cl.om1 = (1.0 / Convert.ToDouble(cl.n)) * tmp1;
  146. cl.om2 = (1.0 / Convert.ToDouble(cl.n)) * tmp2;
  147.  
  148. tmp1 = 0.0;
  149. tmp2 = 0.0;
  150.  
  151. for (int i = 0; i < cl.n; i++)
  152. {
  153. tmp1 += Math.Pow(cl.om1 - cl.mas1[i], 2);
  154. tmp2 += Math.Pow(cl.om2 - cl.mas2[i], 2);
  155. }
  156. cl.od1 = 1.0 / (Convert.ToDouble(cl.n) + 1.0) * tmp1;
  157. cl.od2 = 1.0 / (Convert.ToDouble(cl.n) + 1.0) * tmp2;
  158. }
  159.  
  160. private void CalcError()
  161. {
  162. for (int i = 0; i < cl1.n; i++)
  163. {
  164. if (NormDistr(cl1.mas1[i], cl1.mas2[i], cl1) * cl1.oP < NormDistr(cl1.mas1[i], cl1.mas2[i], cl2) * cl2.oP)
  165. cl1.cntPo++;
  166. }
  167.  
  168. for (int i = 0; i < cl2.n; i++)
  169. {
  170. if (NormDistr(cl2.mas1[i], cl2.mas2[i], cl2) * cl2.oP < NormDistr(cl2.mas1[i], cl2.mas2[i], cl1) * cl1.oP)
  171. cl2.cntPo++;
  172. }
  173. }
  174.  
  175. private double NormDistr(double X, double Y, Class cl)
  176. {
  177. // степень нормального распределения
  178. double ePow = (-0.5) * (Math.Pow(X - cl.om1, 2) / cl.od1 + Math.Pow(Y - cl.om2, 2) / cl.od2);
  179.  
  180. // нормальное распределение
  181. return (1.0/Math.PI*Math.Sqrt(cl.od1)*Math.Sqrt(cl.od2))*Math.Pow(Math.E, ePow);
  182. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement