Пример #1
0
        private void button2_Click(object sender, EventArgs e)
        {
            int Length;

            try
            {
                Length = Convert.ToInt32(textBox1.Text);
            }
            catch
            {
                return;
            }
            if ((Length > 30 || Length < 1))
            {
                LogOutput("Wrong size");
                return;
            }
            if (!MatrixExist)
            {
                LogOutput("You need to precompute inverte matrix");
                return;
            }
            double[,] x = new double[Length, 1];
            double[,] u = new double[Length, 1];
            double[,] v = new double[Length, 1];
            double[,] z = new double[Length, 1];
            double[,] y = new double[Length, 1];
            double[,] b = new double[Length, 1];
            double[,] A = new double[Length, Length];
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value));
                }
            }
            catch
            {
                LogOutput("Initial x vector is wrong;");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value));
                }
            }
            catch
            {
                LogOutput("B vector is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    for (int j = 0; j < Length; j++)
                    {
                        A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value));
                    }
                }
            }
            catch
            {
                LogOutput("A matrix is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    u[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 2].Value));
                }
            }
            catch
            {
                LogOutput("U vector is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    v[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 3].Value));
                }
            }
            catch
            {
                LogOutput("V vector is wrong");
                return;
            }
            DateTime Now = DateTime.Now;
            var      UV  = Matrixes.Multiply(u, Matrixes.GetTransp(v, Length, 1));

            for (int i = 0; i < Length; i++)
            {
                for (int j = 0; j < Length; j++)
                {
                    NewMatrix[i, j] = A[i, j] - UV[i, j];
                }
            }
            z = Matrixes.GetTransp(Matrixes.Multiply(Matrixes.GetTransp(v, Length, 1), InverseMatrix), 1, Length);
            y = Matrixes.Multiply(InverseMatrix, u);
            double alfa = 1d / (1 - Matrixes.Multiply(Matrixes.GetTransp(v, Length, 1), y)[0, 0]);
            double beta = Matrixes.Multiply(Matrixes.GetTransp(z, Length, 1), b)[0, 0];

            for (int i = 0; i < Length; i++)
            {
                x[i, 0] = x[i, 0] + alfa * beta * y[i, 0];
            }
            for (int i = 0; i < Length; i++)
            {
                dataGridView2.Rows[i].Cells[Length].Value = x[i, 0];
            }
            LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s");
        }
Пример #2
0
 private void button2_Click(object sender, EventArgs e)
 {
     int Length;
     try
     {
         Length = Convert.ToInt32(textBox1.Text);
     }
     catch
     {
         return;
     }
     if ((Length > 30 || Length < 1))
     {
         LogOutput("Wrong size");
         return;
     }
     double epsiolon;
     try
     {
         epsiolon = Convert.ToDouble(textBox3.Text);
     }
     catch
     {
         LogOutput("Wrong accuracy");
         return;
     }
     if (epsiolon < 0)
     {
         LogOutput("Wrong size");
         return;
     }
     double[,] x = new double[Length, 1];
     double[,] r = new double[Length, 1];
     double[,] b = new double[Length, 1];
     double[,] A = new double[Length, Length];
     try
     {
         for (int i = 0; i < Length; i++)
         {
             x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value));
         }
     }
     catch
     {
         LogOutput("Initial x vector is wrong; 0 values are taken instead");
         for (int i = 0; i < Length; i++)
         {
             x[i, 0] = 0;
         }
     }
     try
     {
         for (int i = 0; i < Length; i++)
         {
             b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value));
         }
     }
     catch
     {
         LogOutput("B vector is wrong");
         return;
     }
     try
     {
         for (int i = 0; i < Length; i++)
         {
             for (int j = 0; j < Length; j++)
             {
                 A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value));
             }
         }
     }
     catch
     {
         LogOutput("A matrix is wrong");
         return;
     }
     DateTime Now = DateTime.Now;
     var temp = Matrixes.Multiply(A, x);
     for (int i = 0; i < Length; i++)
     {
         r[i, 0] = b[i, 0] - temp[i, 0];
     }
     double tau=0;
     double tempDouble = 0;
     temp = Matrixes.Multiply(A, r);
     for (int i = 0; i < Length; i++)
     {
         tau += r[i, 0] * r[i, 0];
     }
     temp = Matrixes.Multiply(A, r);
     for (int i = 0; i < Length; i++)
     {
         tempDouble += temp[i, 0] * r[i, 0];
     }
     tau /= -tempDouble;
     for (int i = 0; i < Length; i++)
     {
         x[i,0] = x[i,0] - tau * r[i,0];
     }
     temp = Matrixes.Multiply(A, x);
     for (int i = 0; i < Length; i++)
     {
         r[i, 0] = b[i, 0] - temp[i, 0];
     }
     while (!Less(epsiolon, r))
     {
         tau = 0;
         tempDouble = 0;
         temp = Matrixes.Multiply(A, r);
         for (int i = 0; i < Length; i++)
         {
             tau += r[i, 0] * r[i, 0];
         }
         temp = Matrixes.Multiply(A, r);
         for (int i = 0; i < Length; i++)
         {
             tempDouble += temp[i, 0] * r[i, 0];
         }
         tau /= -tempDouble;
         for (int i = 0; i < Length; i++)
         {
             x[i, 0] = x[i, 0] - tau * r[i, 0];
         }
         temp = Matrixes.Multiply(A, x);
         for (int i = 0; i < Length; i++)
         {
             r[i, 0] = b[i, 0] - temp[i, 0];
         }
     }
     for (int i = 0; i < Length; i++)
     {
         dataGridView1.Rows[i].Cells[Length + 2].Value = x[i, 0];
     }
     LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s");
 }
Пример #3
0
        private void button1_Click(object sender, EventArgs e)
        {
            int Length;

            try
            {
                Length = Convert.ToInt32(textBox1.Text);
            }
            catch
            {
                return;
            }
            if ((Length > 30 || Length < 1))
            {
                LogOutput("Wrong size");
                return;
            }
            double[,] x = new double[Length, 1];
            double[,] u = new double[Length, 1];
            double[,] v = new double[Length, 1];
            double[,] b = new double[Length, 1];
            double[,] A = new double[Length, Length];
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    x[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length].Value));
                }
            }
            catch
            {
                LogOutput("Initial x vector is wrong;");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    b[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 1].Value));
                }
            }
            catch
            {
                LogOutput("B vector is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    for (int j = 0; j < Length; j++)
                    {
                        A[i, j] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[j].Value));
                    }
                }
            }
            catch
            {
                LogOutput("A matrix is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    u[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 2].Value));
                }
            }
            catch
            {
                LogOutput("U vector is wrong");
                return;
            }
            try
            {
                for (int i = 0; i < Length; i++)
                {
                    v[i, 0] = (Convert.ToDouble(dataGridView1.Rows[i].Cells[Length + 3].Value));
                }
            }
            catch
            {
                LogOutput("V vector is wrong");
                return;
            }
            DateTime Now = DateTime.Now;

            InverseMatrix = Matrixes.GetReverse(A, Length);
            var res = Matrixes.Multiply(InverseMatrix, b);

            for (int i = 0; i < Length; i++)
            {
                dataGridView1.Rows[i].Cells[Length].Value = res[i, 0];
            }
            var UV = Matrixes.Multiply(u, Matrixes.GetTransp(v, Length, 1));

            MatrixExist = true;
            dataGridView2.Columns.Clear();
            dataGridView2.Rows.Clear();
            for (int i = 0; i < Length; i++)
            {
                dataGridView2.Columns.Add(new DataGridViewTextBoxColumn());
            }
            dataGridView2.Columns.Add(new DataGridViewTextBoxColumn());
            dataGridView2.Columns.Add(new DataGridViewTextBoxColumn());
            for (int i = 0; i < Length; i++)
            {
                dataGridView2.Rows.Add();
            }
            NewMatrix = new double[3, 3];
            for (int i = 0; i < Length; i++)
            {
                for (int j = 0; j < Length; j++)
                {
                    dataGridView2.Rows[i].Cells[j].Value = (NewMatrix[i, j] = A[i, j] - UV[i, j]);
                }
                dataGridView2.Rows[i].Cells[Length + 1].Value = b[i, 0];
            }
            LogOutput("Time of work =" + (DateTime.Now - Now).TotalMilliseconds / 1000 + "s");
            MatrixExist = true;
        }