GroupsGridForm.cs 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel;
  4. using System.Data;
  5. using System.Drawing;
  6. using System.Linq;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9. using System.Windows.Forms;
  10. namespace OTSExtremum
  11. {
  12. public partial class GroupsGridForm : Form
  13. {
  14. List<Business.groupInfo> data;
  15. List<Business.groupInfo> maxData=new List<Business.groupInfo>();
  16. public GroupsGridForm(List<Business.groupInfo> list)
  17. {
  18. data = list;
  19. InitializeComponent();
  20. }
  21. private void GroupsGridForm_Load(object sender, EventArgs e)
  22. {
  23. Calculation();
  24. }
  25. private void Calculation()
  26. {
  27. //List<List<double[]>> alldata = new List<List<double[]>>();
  28. //先设置一下头的高度,否则会太矮不好看
  29. dtgrid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing;
  30. dtgrid.ColumnHeadersHeight = 40;
  31. dtgrid.ColumnHeadersDefaultCellStyle.Font = new Font("微软雅黑", 12, FontStyle.Regular);
  32. dtgrid.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke;
  33. foreach (Business.groupInfo item in data)
  34. {
  35. List<double[]> allData = new List<double[]>();
  36. double[] vs = item.values;
  37. Array.Sort(vs);
  38. int N = vs.Length;
  39. double mean = Business.Tools.Mean(vs);
  40. double sdev = Business.Tools.StDev(vs);
  41. double delta = sdev * Math.Sqrt(6) / 3.1416;//δ
  42. double lambda = mean - 0.5772 * delta;//λ
  43. double sumLL = 0;
  44. double[] ret = Business.Tools.OPTMax(vs);
  45. double[] C = new double[N];
  46. double[] D = new double[N];
  47. double[] E = new double[N];
  48. double[] F = new double[N];
  49. double[] G = new double[N];
  50. double[] H = new double[N];
  51. double[] I = new double[N];
  52. for (int i = 0; i < N; i++)
  53. {
  54. double temp = i + 1;
  55. double t = 1;
  56. C[i] = temp / (N + 1);
  57. D[i] = -1 * Math.Log(-1 * Math.Log(C[i]));
  58. F[i] = Math.Log(t / delta) - (vs[i] - lambda) / delta - Math.Exp((lambda - vs[i]) / delta);
  59. E[i] = Math.Log(t / ret[0]) - (vs[i] - ret[1]) / ret[0] - Math.Exp((ret[1] - vs[i]) / ret[0]);
  60. G[i] = ret[0] * D[i] + ret[1];
  61. double se = ret[0] * (Math.Sqrt((1.109 + 0.514 * D[i] + 0.608 * D[i] * D[i]) / N));
  62. H[i] = G[i] - 2 * se;
  63. I[i] = G[i] + 2 * se;
  64. sumLL += E[i];
  65. }
  66. allData.Add(D);
  67. allData.Add(vs);
  68. allData.Add(G);
  69. allData.Add(H);
  70. allData.Add(I);
  71. double se2 = (11.61 * ret[0]) / Math.Sqrt(N);
  72. double max = 6.91 * ret[0] + ret[1];
  73. double tn = (vs.Max() - mean) / sdev;
  74. double t1 = (mean - vs.Min()) / sdev;
  75. Business.groupInfo maxdt = new Business.groupInfo() { groupTitle=item.groupTitle,values=new double[] { max , se2/2 } };
  76. maxData.Add(maxdt);
  77. int add_rowindex = dtgrid.Rows.Add();
  78. dtgrid.Rows[add_rowindex].Cells[0].Value = item.groupTitle;
  79. dtgrid.Rows[add_rowindex].Cells[1].Value =vs.Max().ToString();
  80. dtgrid.Rows[add_rowindex].Cells[2].Value = vs.Min().ToString();
  81. dtgrid.Rows[add_rowindex].Cells[3].Value = Math.Round(max, 1).ToString();
  82. dtgrid.Rows[add_rowindex].Cells[4].Value = Math.Round(se2, 1).ToString();
  83. dtgrid.Rows[add_rowindex].Cells[5].Value = Math.Round(tn, 3).ToString();
  84. dtgrid.Rows[add_rowindex].Cells[6].Value = Math.Round(t1, 3).ToString();
  85. dtgrid.Rows[add_rowindex].Cells[7].Value = Math.Round(max, 1).ToString() + "+-"+ Math.Round(se2, 1).ToString();
  86. dtgrid.Rows[add_rowindex].Cells[8].Value = Math.Round(max- se2, 3).ToString();
  87. dtgrid.Rows[add_rowindex].Cells[9].Value = Math.Round(max + se2, 3).ToString();
  88. for (int i = 0; i < allData.Count; i++)
  89. {
  90. for (int j = 0; j < allData[i].Length; j++)
  91. {
  92. if (double.IsNaN(allData[i][j]) || double.IsInfinity(allData[i][j]))
  93. {
  94. MessageBox.Show("数据不正常,会造成溢出");
  95. return;
  96. }
  97. }
  98. }
  99. ChartControl chartControl = new ChartControl();
  100. chartControl.parameters = allData;
  101. chartControl.delta = ret[0];
  102. chartControl.lambda= ret[1];
  103. chartControl.title = item.groupTitle;
  104. int chkcount = panel1.Controls.Count;
  105. int row = chkcount / 2;
  106. int col = chkcount % 2;
  107. chartControl.Location = new Point(col * 550, row * 400 + 10);
  108. panel1.Controls.Add(chartControl);
  109. }
  110. }
  111. private void btnShow_Click(object sender, EventArgs e)
  112. {
  113. for (int i = 0; i < maxData.Count; i++)
  114. {
  115. for (int j = 0; j < maxData[i].values.Length; j++)
  116. {
  117. if (double.IsNaN(maxData[i].values[j]) || double.IsInfinity(maxData[i].values[j]))
  118. {
  119. MessageBox.Show("数据不正常,会造成溢出");
  120. return;
  121. }
  122. }
  123. }
  124. GroupLmax groupLmax = new GroupLmax();
  125. groupLmax.parameters = maxData;
  126. groupLmax.Show();
  127. }
  128. }
  129. }