/// <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); }
/// <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); }
/// <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); }
//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); }
//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); }
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"); } } }
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"); } } }
/// <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); }