示例#1
0
        /// <summary>
        ///
        ///  LLEVA A CABO LA EXPLICACION PASO A PASO DEL METODO DE RESOLUCION ELEGIDO ANTERIORMENTE
        ///
        /// </summary>

        private void Resolucion()
        {
            if (diagonales) // Resolucion por el metodo de las diagonales
            {
                label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Size.Height + 10);
                label3.BackColor = label1.BackColor;
                label4.Location  = new Point(label3.Location.X, label3.Location.Y + label3.Height + 10);
                label3.AutoSize  = true;
                label4.Location  = new Point(label3.Location.X, label3.Location.Y + label3.Height + 10);

                bool ordendos = (matriz.GetLength(0) == 2); // Si la matriz es de orden dos

                lbExplicacion.Text = " Realizamos la misma operacion con todas las diagonales a la derecha.";

                producto = new Racional(1, 1);
                if ((!ordendos & paso < matriz.GetLength(0)) || (ordendos & paso == 0))  // Mientras no se llegue a todas las diagonales a la derecha
                {
                    DespintarCajas();
                    string planteamiento = PintarDiagonal(matriz, paso, Color.GreenYellow, ref producto);
                    label1.Text = planteamiento + " " + Racional.AString(producto);

                    label2.Show();
                    if (producto.Numerador >= 0)
                    {
                        label2.Text += " + ";
                    }
                    if (paso == matriz.GetLength(0))
                    {
                        label2.Text += " = ";
                    }

                    label2.Text += Racional.AString(producto);

                    productos.Add(producto);
                }
                else if ((!ordendos && paso == orden) || (ordendos && paso == 1))// Cuando se hayan realizado todas las diagonales a la derecha
                {
                    Racional totalderecha = 0;
                    foreach (Racional r in productos)
                    {
                        totalderecha += r;
                    }
                    label3.Show(); // Etiqueta para el resultado de las diagonales a la derecha
                    label3.Text      = "Total derecha: " + Racional.AString(totalderecha);
                    label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Size.Height + 10);
                    label3.BackColor = label1.BackColor;

                    lbExplicacion.Text = " Una vez realizado el producto de todas las diagonales a la derecha, los sumamos y procedemos a realizar el producto de los elementos de las diagonales a la izquierda.";
                }
                else // Productos de las diagonales a la izquierda
                {
                    if ((!ordendos && descontador >= 0) || (ordendos && paso == 2))
                    {
                        if (descontador == orden - 1)
                        {
                            lbExplicacion.Text = "Comenzamos con el producto de la primera diagonal a la izquierda.";
                        }
                        else
                        {
                            lbExplicacion.Text = " Continuamos realizando el producto de la siguiente diagonal hacia la izquierda: ";
                        }

                        DespintarCajas();
                        producto = 1;
                        string planteamiento = PintarDiagonalIzquierda(matriz, descontador, Color.Coral, ref producto);
                        label1.Text = planteamiento + " = " + Racional.AString(producto);
                        productosizquierda.Add(producto);
                        if (descontador == matriz.GetLength(0) - 1)
                        {
                            label2.Text = " ";
                            label2.Text = "Memo: " + Racional.AString(producto);
                        }
                        else
                        {
                            if (producto.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(producto);
                        }
                        descontador--;
                    }
                    else
                    {
                        label2.Text        = " ";
                        lbExplicacion.Text = " Por ultimo restamos al total de la suma de productos de las diagonales a la derecha, el total de la suma de productos de las diagonales a la izquierda. ";
                        Racional totalizquierda = 0;
                        label1.Text = "  ";
                        foreach (Racional r in productosizquierda)
                        {
                            totalizquierda += r;
                        }
                        label4.Show();
                        label4.BackColor = Color.SeaGreen;
                        label4.Text      = "Toltal izquierda:  " + Racional.AString(totalizquierda);
                        Racional totalderecha = 0;
                        foreach (Racional r in productos)
                        {
                            totalderecha += r;
                        }
                        label1.Text = " El determinante o módulo de la matriz es: " + Racional.AString(totalderecha) + " - " + Racional.AString(totalizquierda) + " = " + Racional.AString(totalderecha - totalizquierda);
                        btContinuar.Hide();
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White;
                        }
                        lbExplicacion.Focus();
                    }
                }
            } // Fin de la resolucion por el metodo de las diagonales
            else if (menores) // Resolucion por el metodo de las menores principales
            {
                if (paso == 0) // primer paso de la resolucion
                {
                    productos.Clear();
                    producto = 0;
                    btContinuar.Show();
                    btContinuar.Location = new Point(900, 150);
                    radioButton1.Hide();
                    radioButton2.Hide();
                    radioButton3.Hide();
                    EtiquetaFilas.Hide();
                    tbFilas.Hide();
                    label1.BackColor = Color.SeaGreen;
                    label2.BackColor = Color.SeaGreen;
                    // Pintar de negro la fila y columna correspondiente
                    PintarFilaColumna(matriz, 0, 0, Color.Black);
                    lbExplicacion.Focus();
                    // Escribir explicacion en la etiqueta
                    lbExplicacion.Text  = " Primero extraemos la submatriz formada por los elementos cuya fila o columna, no coincida con el elemento numero " + paso.ToString() + " de la matriz, y calculamos el determinante de la misma.";
                    lbExplicacion.Text += " \n\r Mulplicamos el determinante de la submatriz " + Racional.AString(determinantemenor) + " por el elemento numero " + paso.ToString() + " de la matriz. ";
                    lbExplicacion.Text += " \n\r Como el indice del elemento 0 de la matriz es par, guardamos el resultado sin mas.";
                    // Mostrar el planteamiento
                    label1.Show();
                    label1.Location = new Point(matriz[0, 0].Location.X, matriz[matriz.GetLength(0) - 1, 0].Location.Y + matriz[0, 0].Height + 10);
                    label1.Text     = Racional.AString(determinantemenor) + " * " + matriz[0, 0].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    // Mostrar el resultado anterior
                    label2.Show();
                    label2.Location = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
                    label2.Text     = "Memo: " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    productos.Add(determinantemenor * Racional.StringToRacional(matriz[0, 0].Text));
                    filaactual    = 0;
                    columnaactual = 1;
                    paso++;
                }
                else if (paso > 0)  // pasos posteriores al primero hasta llegar al orden de la matriz
                {
                    if (paso < matriz.GetLength(0))
                    {
                        // Pintar de negro la fila y columna correspondiente
                        PintarFilaColumna(matriz, filaactual, columnaactual, Color.Black);
                        // Escribir la explicacion en la etiqueta
                        lbExplicacion.Text  = " Continuamos extrayendo la submatriz formada por los elementos cuya fila o columna, no coincida con el elemento numero " + paso.ToString() + " de la matriz, y calculamos el determinante de la misma.";
                        lbExplicacion.Text += " Mulplicamos el determinante de la submatriz " + Racional.AString(determinantemenor) + " por el elemento numero " + paso.ToString() + " de la matriz. ";
                        if (paso % 2 == 0)
                        {
                            lbExplicacion.Text += " \n\r Como el indice del elemento" + paso.ToString() + "  de la matriz es par, guardamos el resultado sin mas.";
                            label1.Show();
                            label1.Text = Racional.AString(determinantemenor) + " * " + matriz[filaactual, columnaactual].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                            label2.Show();
                            Racional parcial = determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text);
                            if (parcial.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(parcial);
                            productos.Add(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                        }
                        else
                        {
                            lbExplicacion.Text += " \n\r Como el indice del elemento " + paso.ToString() + " de la matriz es impar, cambiamos el signo del resultado";
                            label1.Show();
                            label1.Text = Racional.AString(determinantemenor) + " * " + matriz[filaactual, columnaactual].Text + " = " + Racional.AString(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text));
                            label2.Show();
                            Racional parcial = determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * -1;
                            if (parcial.Numerador >= 0)
                            {
                                label2.Text += " + ";
                            }
                            label2.Text += Racional.AString(parcial);

                            productos.Add(determinantemenor * Racional.StringToRacional(matriz[filaactual, columnaactual].Text) * -1);
                        }
                        columnaactual++;
                        if (columnaactual > matriz.GetLength(0) - 1)
                        {
                            columnaactual = 0;
                            filaactual++;
                        }
                    }
                    else
                    {
                        foreach (Racional r in productos)
                        {
                            producto += r;
                        }
                        label3.AutoSize  = true;
                        label3.Location  = new Point(label2.Location.X, label2.Location.Y + label2.Height + 10);
                        label3.BackColor = Color.SeaGreen;
                        label3.Show();
                        label3.Text = " El determinante de la matriz es la suma de los resultados anteriores: " + Racional.AString(producto);
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White;
                        }
                        label1.Hide();
                        lbExplicacion.Hide();
                        btContinuar.Hide();
                        label3.Focus();
                    }
                }
                ////////////////////////////////////
            }  // Fin de la resolucion por el metodo de las menores principales
            // Resolucion por el metodo de Gauss.
            else if (gauss)
            {
                if (paso == 0)
                {
                    lbExplicacion.Focus();
                    foreach (TextBox t in matriz)
                    {
                        t.Location = new Point(t.Location.X + (100 * matriz.GetLength(0)), t.Location.Y);
                    }

                    copiamatriz = new TextBox[matriz.GetLength(0), matriz.GetLength(0)];
                    for (int i = 0; i < matriz.GetLength(0); i++)
                    {
                        for (int j = 0; j < matriz.GetLength(0); j++)
                        {
                            copiamatriz[i, j]           = new TextBox();
                            copiamatriz[i, j].Size      = matriz[i, j].Size;
                            copiamatriz[i, j].TextAlign = HorizontalAlignment.Center;
                            copiamatriz[i, j].Location  = new Point(matriz[i, j].Location.X - (90 * matriz.GetLength(0)), matriz[i, j].Location.Y);
                            Controls.Add(copiamatriz[i, j]);
                            copiamatriz[i, j].Text = matriz[i, j].Text;
                        }
                    }

                    label5.Location = new Point(copiamatriz[0, 0].Location.X, copiamatriz[0, 0].Location.Y - 20);
                    label5.Show(); // Titulo de la matriz
                    label5.Text      = "Matriz original.";
                    label5.BackColor = Color.SeaGreen;
                    label5.Font      = new Font("Dejavu Sans", 10, FontStyle.Underline);
                    label6.Location  = new Point(matriz[0, 0].Location.X, label5.Location.Y);
                    label6.Show(); // Titulo de la matriz copia
                    label6.Text      = "Matriz copia.";
                    label6.Font      = label5.Font;
                    label6.BackColor = Color.SeaGreen;
                    filaactual       = 0;
                    columnaactual    = 0;
                    productos.Clear();
                    producto = 0;
                    btContinuar.Show();
                    btContinuar.Location = new Point(900, 150);
                    radioButton1.Hide();
                    radioButton2.Hide();
                    radioButton3.Hide();
                    EtiquetaFilas.Hide();
                    tbFilas.Hide();
                    lbExplicacion.Show();

                    lbExplicacion.Text  = " Para empezar, tenemos que convertir todos los elementos por debajo del primer elemento de la diagonal principal, en cero. ";
                    producto            = Racional.StringToRacional(matriz[filaarestar, columnaaconvertir].Text) / Racional.StringToRacional(matriz[columnaaconvertir, columnaaconvertir].Text);
                    lbExplicacion.Text += " \n\r Para ello,comenzamos dividiendo el elemento debajo del primer elemento de la diagonal principal por este, y guardamos el cociente.";
                    lbExplicacion.Text += " \n\r Este cociente, lo multiplicamos a cada elemento de la primera fila, y el resultado se lo restamos a cada elemento de la segunda.";

                    label1.Location = new Point(matriz[0, 0].Location.X, matriz[matriz.GetLength(0) - 1, 0].Location.Y + matriz[0, 0].Height + 10);
                    label1.Show();
                    label1.BackColor = Color.SeaGreen;
                    label1.Text      = matriz[filaarestar, columnaaconvertir].Text + " / " + matriz[columnaaconvertir, columnaaconvertir].Text + " = " + Racional.AString(producto);
                    label2.Show();
                    label2.BackColor = Color.SeaGreen;
                    label2.Location  = new Point(label1.Location.X, label1.Location.Y + label1.Height + 10);
                    label2.Text      = "Cociente = " + Racional.AString(producto);
                    filaactual       = 0;
                    label7.Show();
                    label7.BackColor = Color.SeaGreen;
                    label7.ForeColor = Color.Silver;
                    label7.Text      = "Secuencia de operaciones: ";
                    Temporizador1.Start();
                    paso++;
                }
                else if (paso > 0)
                {
                    lbExplicacion.Focus();
                    btContinuar.Hide();
                    label7.Text = "Secuencia de operaciones:  ";
                    // Si ya se ha alcanzado la ultima fila a pero quedan columnas por convertir a cero los elementos por debajo de la diagonal principal
                    if (filaarestar > matriz.GetLength(0) - 1 && columnaaconvertir < matriz.GetLength(0) - 1)
                    {
                        foreach (TextBox t in matriz)
                        {
                            t.BackColor = Color.White; // Repintar todas las celdas con fondo blanco
                        }
                        columnaaconvertir++;
                        filaarestar   = columnaaconvertir + 1;
                        filaactual    = columnaaconvertir;
                        columnaactual = columnaaconvertir;
                    }

                    // Fijar la cantidad de pasos a realizar para convertir todos los elemetos por debajo de la diagonal principal en cero
                    int limite = 0;

                    int orden = matriz.GetLength(0); // Orden de la matriz

                    while (orden > 0)                // Sumar la cantidad de pasos que seran necesarios para convertir la columna en cero
                    {
                        orden--;
                        limite += orden;
                    }

                    if (paso < limite)
                    {
                        lbExplicacion.Text = " Continuamos convitiendo en cero todos los elementos por debajo del elemento " + (paso + 1) + " de la diagonal principal de la matriz.";
                        producto           = Racional.StringToRacional(matriz[filaarestar, columnaaconvertir].Text) / Racional.StringToRacional(matriz[columnaaconvertir, columnaaconvertir].Text);
                        label1.Text        = matriz[filaarestar, columnaaconvertir].Text + " / " + matriz[columnaaconvertir, columnaaconvertir].Text + " = " + Racional.AString(producto);
                        label2.Text        = "Cociente = " + Racional.AString(producto);
                        Temporizador1.Start();
                    }
                    else
                    {
                        lbExplicacion.Text  = " Una vez convertidos en cero todos los elementos por debajo de la diagonal principal, hemos convertido la matriz en una matriz tringular.";
                        lbExplicacion.Text += "\r\n El determinante de las matrices triangulares, es el producto de los elementos de la diagonal principal: ";
                        label2.Hide();
                        label7.Hide();
                        string producto = " ";
                        // Racional resultado = 1;
                        for (int i = 0; i < matriz.GetLength(0); i++)
                        {
                            for (int j = 0; j < matriz.GetLength(0); j++)
                            {
                                if (i == j)
                                {
                                    producto += matriz[i, j].Text + " * ";
                                    // resultado *= Racional.StringToRacional(matriz[i, j].Text);
                                }
                            }
                        }
                        producto = producto.Substring(0, producto.Length - 2);
                        // label1.Text = producto + " = " + Racional.AString(resultado);
                        label1.MaximumSize = new Size(500, 200);
                        label1.Text        = producto + " = " + (Matematicas.AlgebraLineal.Determinante(matrizracional)).ToString();
                    }
                }
            }
        }