| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135 | 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<Business.groupInfo> data;        List<Business.groupInfo> maxData=new List<Business.groupInfo>();        public GroupsGridForm(List<Business.groupInfo> list)        {            data = list;            InitializeComponent();        }        private void GroupsGridForm_Load(object sender, EventArgs e)        {            Calculation();        }        private void Calculation()        {            //List<List<double[]>> alldata = new List<List<double[]>>();            //先设置一下头的高度,否则会太矮不好看            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<double[]> allData = new List<double[]>();                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();        }    }}
 |