using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; namespace OTSExtremum { public partial class GroupsGridForm : Form { List data; List maxData=new List(); public GroupsGridForm(List list) { data = list; InitializeComponent(); } private void GroupsGridForm_Load(object sender, EventArgs e) { Calculation(); } private void Calculation() { //List> alldata = new List>(); //先设置一下头的高度,否则会太矮不好看 dtgrid.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.EnableResizing; dtgrid.ColumnHeadersHeight = 40; dtgrid.ColumnHeadersDefaultCellStyle.Font = new Font("微软雅黑", 12, FontStyle.Regular); dtgrid.ColumnHeadersDefaultCellStyle.BackColor = Color.WhiteSmoke; foreach (Business.groupInfo item in data) { List allData = new List(); double[] vs = item.values; Array.Sort(vs); int N = vs.Length; double mean = Business.Tools.Mean(vs); double sdev = Business.Tools.StDev(vs); double delta = sdev * Math.Sqrt(6) / 3.1416;//δ double lambda = mean - 0.5772 * delta;//λ double sumLL = 0; double[] ret = Business.Tools.OPTMax(vs); double[] C = new double[N]; double[] D = new double[N]; double[] E = new double[N]; double[] F = new double[N]; double[] G = new double[N]; double[] H = new double[N]; double[] I = new double[N]; for (int i = 0; i < N; i++) { double temp = i + 1; double t = 1; C[i] = temp / (N + 1); D[i] = -1 * Math.Log(-1 * Math.Log(C[i])); F[i] = Math.Log(t / delta) - (vs[i] - lambda) / delta - Math.Exp((lambda - vs[i]) / delta); E[i] = Math.Log(t / ret[0]) - (vs[i] - ret[1]) / ret[0] - Math.Exp((ret[1] - vs[i]) / ret[0]); G[i] = ret[0] * D[i] + ret[1]; double se = ret[0] * (Math.Sqrt((1.109 + 0.514 * D[i] + 0.608 * D[i] * D[i]) / N)); H[i] = G[i] - 2 * se; I[i] = G[i] + 2 * se; sumLL += E[i]; } allData.Add(D); allData.Add(vs); allData.Add(G); allData.Add(H); allData.Add(I); double se2 = (11.61 * ret[0]) / Math.Sqrt(N); double max = 6.91 * ret[0] + ret[1]; double tn = (vs.Max() - mean) / sdev; double t1 = (mean - vs.Min()) / sdev; Business.groupInfo maxdt = new Business.groupInfo() { groupTitle=item.groupTitle,values=new double[] { max , se2/2 } }; maxData.Add(maxdt); int add_rowindex = dtgrid.Rows.Add(); dtgrid.Rows[add_rowindex].Cells[0].Value = item.groupTitle; dtgrid.Rows[add_rowindex].Cells[1].Value =vs.Max().ToString(); dtgrid.Rows[add_rowindex].Cells[2].Value = vs.Min().ToString(); dtgrid.Rows[add_rowindex].Cells[3].Value = Math.Round(max, 1).ToString(); dtgrid.Rows[add_rowindex].Cells[4].Value = Math.Round(se2, 1).ToString(); dtgrid.Rows[add_rowindex].Cells[5].Value = Math.Round(tn, 3).ToString(); dtgrid.Rows[add_rowindex].Cells[6].Value = Math.Round(t1, 3).ToString(); dtgrid.Rows[add_rowindex].Cells[7].Value = Math.Round(max, 1).ToString() + "+-"+ Math.Round(se2, 1).ToString(); dtgrid.Rows[add_rowindex].Cells[8].Value = Math.Round(max- se2, 3).ToString(); dtgrid.Rows[add_rowindex].Cells[9].Value = Math.Round(max + se2, 3).ToString(); for (int i = 0; i < allData.Count; i++) { for (int j = 0; j < allData[i].Length; j++) { if (double.IsNaN(allData[i][j]) || double.IsInfinity(allData[i][j])) { MessageBox.Show("数据不正常,会造成溢出"); return; } } } ChartControl chartControl = new ChartControl(); chartControl.parameters = allData; chartControl.delta = ret[0]; chartControl.lambda= ret[1]; chartControl.title = item.groupTitle; int chkcount = panel1.Controls.Count; int row = chkcount / 2; int col = chkcount % 2; chartControl.Location = new Point(col * 550, row * 400 + 10); panel1.Controls.Add(chartControl); } } private void btnShow_Click(object sender, EventArgs e) { for (int i = 0; i < maxData.Count; i++) { for (int j = 0; j < maxData[i].values.Length; j++) { if (double.IsNaN(maxData[i].values[j]) || double.IsInfinity(maxData[i].values[j])) { MessageBox.Show("数据不正常,会造成溢出"); return; } } } GroupLmax groupLmax = new GroupLmax(); groupLmax.parameters = maxData; groupLmax.Show(); } } }