Example #1
0
 /// <summary>
 ///  Esse método calcula a derivada parcial com relação a duas variáveis DIFERENTES e tem como parametros a função (formato string) , um vetor com as variaveis e as variaveis alvo-1.
 ///  Se, por exemplo, quiser fazer uma derivada em relação a x[1] e x[2] é só colocar 1 e 2 como alvo1-1 e alvo2-1,respectivamente.
 /// </summary>
 public double derivada_parcial(string func, double[] variaveis, int alvo1, int alvo2)
 {
     Interpretador inter = new Interpretador();
     double h = 0.1;
     double epslon = 0.0001;
     double d1 = 0;
     double d2 = 0;
     double diferença;
     double f1, f2, f3, f4;
     double xi = variaveis[alvo1-1];
     double xj = variaveis[alvo2-1];
     do
     {
         variaveis[alvo1-1] = xi + h;
         variaveis[alvo2-1] = xj + h;
         f1 = inter.interpretar(func, variaveis);
         variaveis[alvo2-1] = xj - h;
         f2 = inter.interpretar(func, variaveis);
         variaveis[alvo1-1] = xi - h;
         variaveis[alvo2-1] = xj + h;
         f3 = inter.interpretar(func, variaveis);
         variaveis[alvo2-1] = xj - h;
         f4 = inter.interpretar(func, variaveis);
         d2 = (f1 - f2 - f3 + f4) / (4 * Math.Pow(h, 2));
         diferença = d2 - d1;
         d1 = d2;
         h = h / 2;
     } while (Math.Abs(diferença) > epslon);
     return (d2);
 }
Example #2
0
        /// <summary>
        ///  Esse método calcula a derivada parcial com relação a duas variáveis DIFERENTES e tem como parametros a função (formato string) , um vetor com as variaveis e as variaveis alvo-1.
        ///  Se, por exemplo, quiser fazer uma derivada em relação a x[1] e x[2] é só colocar 1 e 2 como alvo1-1 e alvo2-1,respectivamente.
        /// </summary>
        public double derivada_parcial(string func, double[] variaveis, int alvo1, int alvo2)
        {
            Interpretador inter  = new Interpretador();
            double        h      = 0.1;
            double        epslon = 0.0001;
            double        d1     = 0;
            double        d2     = 0;
            double        diferença;
            double        f1, f2, f3, f4;
            double        xi = variaveis[alvo1 - 1];
            double        xj = variaveis[alvo2 - 1];

            do
            {
                variaveis[alvo1 - 1] = xi + h;
                variaveis[alvo2 - 1] = xj + h;
                f1 = inter.interpretar(func, variaveis);
                variaveis[alvo2 - 1] = xj - h;
                f2 = inter.interpretar(func, variaveis);
                variaveis[alvo1 - 1] = xi - h;
                variaveis[alvo2 - 1] = xj + h;
                f3 = inter.interpretar(func, variaveis);
                variaveis[alvo2 - 1] = xj - h;
                f4        = inter.interpretar(func, variaveis);
                d2        = (f1 - f2 - f3 + f4) / (4 * Math.Pow(h, 2));
                diferença = d2 - d1;
                d1        = d2;
                h         = h / 2;
            } while (Math.Abs(diferença) > epslon);
            return(d2);
        }
Example #3
0
        /// <summary>
        ///   método da derivada segunda tem como parametros a função, em relação a que variavel será feita a derivada e o vetor dos valores das variaveis
        /// </summary>
        public double derivada_segunda(string func, int alvo, double[] variaveis)
        {
            Interpretador inter  = new Interpretador();
            double        h      = 0.1;
            double        epslon = 0.001;

            double[] var  = new double[variaveis.Length];
            double[] var2 = new double[variaveis.Length];
            double[] var3 = new double[variaveis.Length];
            for (int i = 0; i < variaveis.Length; i++)
            {
                if (i == alvo - 1)
                {
                    var[alvo - 1]  = variaveis[alvo - 1] + 2 * h;
                    var2[alvo - 1] = variaveis[alvo - 1];
                    var3[alvo - 1] = variaveis[alvo - 1] - 2 * h;
                }
                else
                {
                    var[i]  = variaveis[alvo - 1];
                    var2[i] = variaveis[alvo - 1];
                    var3[i] = variaveis[alvo - 1];
                }
            }


            double d1 = ((inter.interpretar(func, var) - 2 * (inter.interpretar(func, var2)) + inter.interpretar(func, var3)) / (4 * h * h)), d2 = 0;

            for (int i = 0; i < 10; i++)
            {
                h              = h / 2;
                var[alvo - 1]  = variaveis[alvo - 1] + 2 * h;
                var2[alvo - 1] = variaveis[alvo - 1];
                var3[alvo - 1] = variaveis[alvo - 1] - 2 * h;
                d2             = ((inter.interpretar(func, var) - 2 * (inter.interpretar(func, var2)) + inter.interpretar(func, var3)) / (4 * h * h));
                if (Math.Abs(d2 - d1) < epslon)
                {
                    return(Math.Round(d2, 8));
                }
                d1 = Math.Round(d2, 8);
            }
            return(d2);
        }
Example #4
0
        //métodos adicionais
        /// <summary>
        ///  método da derivada primeira tem como parametros a função, em relação a que variavel será feita a derivada e o vetor dos valores das variaveis
        /// </summary>
        public double derivada(string func, int alvo, double[] variaveis)
        {
            Interpretador inter  = new Interpretador();
            double        h      = 1;
            double        epslon = 0.01;

            double[] var  = new double[variaveis.Length];
            double[] var2 = new double[variaveis.Length];
            for (int i = 0; i < variaveis.Length; i++)
            {
                if (alvo - 1 == i)
                {
                    var[i]  = variaveis[i] + h;
                    var2[i] = variaveis[i] - h;
                }
                else
                {
                    var[i]  = variaveis[i];
                    var2[i] = variaveis[i];
                }
            }

            double d1 = ((inter.interpretar(func, var) - inter.interpretar(func, var2)) / (2 * h)), d2 = 0;

            for (int i = 0; i < 1000; i++)
            {
                h              = h / 2;
                var[alvo - 1]  = variaveis[alvo - 1] + h;
                var2[alvo - 1] = variaveis[alvo - 1] - h;
                d2             = ((inter.interpretar(func, var) - inter.interpretar(func, var2)) / (2 * h));
                if (Math.Abs(d2 - d1) < epslon)
                {
                    return(Math.Round(d2, 8));
                }
                d1 = Math.Round(d2, 8);
            }
            return(d2);
        }
Example #5
0
        private void button1_Click(object sender, EventArgs e)
        {
            double[] variaveis     = new double[(int)numericUpDown1.Value];
            double[] variaveisd1   = new double[(int)numericUpDown1.Value];
            double[] variaveisd2   = new double[(int)numericUpDown1.Value];
            double[] variaveisgrad = new double[(int)numericUpDown1.Value];
            double[] variaveishess = new double[(int)numericUpDown1.Value];
            double[] gradiente     = new double[(int)numericUpDown1.Value];
            double[,] hessiana = new double[(int)numericUpDown1.Value, (int)numericUpDown1.Value];
            string funcao = textBox1.Text;

            for (int i = 0; i < dataGridView1.RowCount; i++)
            {
                variaveis[i]     = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
                variaveisd1[i]   = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
                variaveisd2[i]   = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
                variaveisgrad[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
                variaveishess[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
            }
            Interpretador a = new Interpretador(); // aqui se instancia um intrepretador, cujos parametros do construtor são a função(string),os valores das variaveis em um vetor de double e o numero inteiro de variaveis

            label4.Text = "ƒ(x) =" + a.interpretar(funcao, variaveis).ToString("0.00000000");
            label7.Text = "ƒ'(x) =" + Math.Round(a.derivada(funcao, (int)numericUpDown2.Value, variaveisd1), 8).ToString("0.00000000");
            label8.Text = "ƒ''(x) =" + Math.Round(a.derivada_segunda(funcao, (int)numericUpDown2.Value, variaveisd2), 8).ToString("0.0000000");
            gradiente   = a.gradiente(funcao, variaveisgrad);
            hessiana    = a.hessiana(funcao, variaveishess);
            for (int i = 0; i < (int)numericUpDown1.Value; i++)
            {
                dataGridView2.Rows[i].Cells[0].Value = Math.Round(gradiente[i], 8).ToString("0.0000000");
            }
            for (int i = 0; i < (int)numericUpDown1.Value; i++)
            {
                for (int j = 0; j < (int)numericUpDown1.Value; j++)
                {
                    dataGridView3.Rows[i].Cells[j].Value = Math.Round(hessiana[i, j], 8).ToString("0.0000000");
                }
            }
        }
Example #6
0
        //métodos adicionais
        /// <summary>
        ///  método da derivada primeira tem como parametros a função, em relação a que variavel será feita a derivada e o vetor dos valores das variaveis
        /// </summary>
        public double derivada(string func, int alvo, double[] variaveis)
        {
            Interpretador inter = new Interpretador();
            double h = 1;
            double epslon = 0.01;
            double[] var = new double[variaveis.Length];
            double[] var2 = new double[variaveis.Length];
            for (int i = 0; i < variaveis.Length; i++)
            {
                if (alvo-1 == i)
                {
                    var[i] = variaveis[i] + h;
                    var2[i] = variaveis[i] - h;
                }
                else
                {
                    var[i] = variaveis[i];
                    var2[i] = variaveis[i];
                }
            }

            double d1 = ((inter.interpretar(func, var) - inter.interpretar(func, var2)) / (2 * h)), d2 = 0;
            for (int i = 0; i < 1000; i++)
            {
                h = h / 2;
                var[alvo-1] = variaveis[alvo-1] + h;
                var2[alvo-1] = variaveis[alvo-1] - h;
                d2 = ((inter.interpretar(func, var) - inter.interpretar(func, var2)) / (2 * h));
                if (Math.Abs(d2 - d1) < epslon)
                {
                    return (Math.Round(d2, 8));
                }
                d1 = Math.Round(d2, 8);
            }
            return (d2);
        }
Example #7
0
 private void button1_Click(object sender, EventArgs e)
 {
     double[] variaveis =new double[(int)numericUpDown1.Value];
     double[] variaveisd1 = new double[(int)numericUpDown1.Value];
     double[] variaveisd2 = new double[(int)numericUpDown1.Value];
     double[] variaveisgrad = new double[(int)numericUpDown1.Value];
     double[] variaveishess = new double[(int)numericUpDown1.Value];
     double[] gradiente = new double[(int)numericUpDown1.Value];
     double[,] hessiana = new double[(int)numericUpDown1.Value,(int)numericUpDown1.Value];
     string funcao = textBox1.Text;
     for (int i = 0; i < dataGridView1.RowCount; i++)
     {
      variaveis[i]=Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
      variaveisd1[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
      variaveisd2[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
      variaveisgrad[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
      variaveishess[i] = Convert.ToDouble(dataGridView1.Rows[i].Cells[0].Value);
     }
     Interpretador a =new Interpretador(); // aqui se instancia um intrepretador, cujos parametros do construtor são a função(string),os valores das variaveis em um vetor de double e o numero inteiro de variaveis
     label4.Text = "ƒ(x) =" + a.interpretar(funcao, variaveis).ToString("0.00000000");
     label7.Text = "ƒ'(x) =" + Math.Round(a.derivada(funcao, (int)numericUpDown2.Value, variaveisd1), 8).ToString("0.00000000");
     label8.Text = "ƒ''(x) =" +Math.Round( a.derivada_segunda(funcao, (int)numericUpDown2.Value, variaveisd2),8).ToString("0.0000000");
     gradiente=a.gradiente(funcao,variaveisgrad);
     hessiana=a.hessiana(funcao,variaveishess);
     for (int i = 0; i < (int)numericUpDown1.Value; i++)
     {
         dataGridView2.Rows[i].Cells[0].Value = Math.Round(gradiente[i], 8).ToString("0.0000000");
     }
     for (int i = 0; i < (int)numericUpDown1.Value; i++)
     {
         for (int j = 0; j < (int)numericUpDown1.Value; j++)
         {
             dataGridView3.Rows[i].Cells[j].Value = Math.Round(hessiana[i, j], 8).ToString("0.0000000");
         }
     }
 }
Example #8
0
        /// <summary>
        ///   método da derivada segunda tem como parametros a função, em relação a que variavel será feita a derivada e o vetor dos valores das variaveis
        /// </summary>
        public double derivada_segunda(string func, int alvo, double[] variaveis)
        {
            Interpretador inter = new Interpretador();
            double h = 0.1;
            double epslon = 0.001;
            double[] var = new double[variaveis.Length];
            double[] var2 = new double[variaveis.Length];
            double[] var3 = new double[variaveis.Length];
            for (int i = 0; i < variaveis.Length; i++)
            {
                if (i == alvo-1)
                {
                    var[alvo-1] = variaveis[alvo-1] + 2 * h;
                    var2[alvo-1] = variaveis[alvo-1];
                    var3[alvo-1] = variaveis[alvo-1] - 2 * h;
                }
                else
                {
                    var[i] = variaveis[alvo-1];
                    var2[i] = variaveis[alvo-1];
                    var3[i] = variaveis[alvo-1];
                }
            }

            double d1 = ((inter.interpretar(func, var) - 2 * (inter.interpretar(func, var2)) + inter.interpretar(func, var3)) / (4 * h * h)), d2 = 0;
            for (int i = 0; i < 10; i++)
            {
                h = h / 2;
                var[alvo-1] = variaveis[alvo-1] + 2 * h;
                var2[alvo-1] = variaveis[alvo-1];
                var3[alvo-1] = variaveis[alvo-1] - 2 * h;
                d2 = ((inter.interpretar(func, var) - 2 * (inter.interpretar(func, var2)) + inter.interpretar(func, var3)) / (4 * h * h));
                if (Math.Abs(d2 - d1) < epslon)
                {
                    return (Math.Round(d2, 8));
                }
                d1 = Math.Round(d2, 8);
            }
            return (d2);
        }