public static double[] Calcular(int n, string fx, double e, string x_ini) { double[] xk = x_ini.SplitToDoubles(); double[] grad = Gradiente.CalculaGradiente(n, fx, x_ini.SplitToDoubles()).ToArray(); double[] gk = (double[])grad.Clone(); double[] gk_1; double[] dk = gk.Negativo(); double beta; while (Interpretadores.NormaVetor(grad) > e) { for (int i = 0; i < n; i++) { string xk_s = Interpretadores.GeraVetorY(xk, Interpretadores.LambdaVDirec(dk)); double lamb = Newton.Calcular(0, ((Interpretadores.GeraFy(fx, xk_s)).Replace(',', '.')).Replace("lamb", "x[1]"), 0.1); xk = Interpretadores.SubsLambda(lamb, xk_s.Replace(',', '.')); gk_1 = Gradiente.CalculaGradiente(n, fx, xk).ToArray(); if (i >= n - 1) { break; } beta = GradConjugado.MultEscalar(gk_1, gk_1) / GradConjugado.MultEscalar(gk, gk); dk = Interpretadores.SomaVetor(gk_1.Negativo(), dk.MultConstante(beta)); gk = (double[])gk_1.Clone(); } grad = Gradiente.CalculaGradiente(n, fx, xk).ToArray(); } return(xk); }
public static double[] Calcular(int n, string fx, double e, string x_ini) { double[] x0 = x_ini.SplitToDoubles(); double[] xk; double[] gk = (double[])Gradiente.CalculaGradiente(n, fx, x0).ToArray().Clone(); double[] gk_1; double[] dk; double[] qk; double[] pk; double[] xi; double lambdak; double[,] Sk = MatrizSimetricaPositivaDefinida(n); int k, i; k = i = 0; volta: xk = (double[])x0.Clone(); while (Interpretadores.NormaVetor(gk) > e) { dk = GradConjugado.MultMatriz(Sk, gk.ToMatriz()).ToVector().Negativo(); string vy = Interpretadores.GeraVetorY(xk, Interpretadores.LambdaVDirec(dk)); string fy = Interpretadores.GeraFy(fx, vy.Replace(',', '.')).Replace("lamb", "x[1]"); lambdak = Newton.Calcular(3, fy, 0.1); xk = Interpretadores.SubsLambda(lambdak, vy.Replace(',', '.')); if (k < n - 1) { gk_1 = Gradiente.CalculaGradiente(n, fx, xk).ToArray(); qk = Interpretadores.SubtracaoVetor(gk_1, gk); pk = dk.MultConstante(lambdak); var parte1 = GradConjugado.MultMatriz(pk.ToMatriz(), pk.TranspVetor()).DivideConstante(GradConjugado.MultEscalar(pk, qk)); var parte2 = GradConjugado.MultMatriz(GradConjugado.MultMatriz(GradConjugado.MultMatriz(Sk, qk.ToMatriz()), qk.TranspVetor()), Sk).DivideConstante(GradConjugado.MultEscalar((GradConjugado.MultMatriz(qk.TranspVetor(), Sk)).ToVector(), qk)); Sk = SubtracaoMatriz(SomaMatriz(Sk, parte1), parte2); k += 1; gk = (double[])gk_1.Clone(); } else { xi = (double[])xk.Clone(); i += 1; x0 = (double[])xk.Clone(); gk = Gradiente.CalculaGradiente(n, fx, x0).ToArray(); k = 0; goto volta; } } return(xk); }
public static double[] Calcular(string func, double[] xk, double erro, int n) { int k = 0; double lambda, norma = 1000; double[] d, yk, vetNorma, x; vetNorma = new double[n]; d = new double[n]; yk = new double[n]; string lambdaD, vetYj, Fy; do { k++; x = (double[])xk.Clone(); yk = (double[])xk.Clone(); for (int j = 0; j < n; j++) { /*Monta o vetor d*/ for (int b = 0; b < n; b++) { d[b] = 0; } d[j] = 1; /**/ //multiplica lambda por d lambdaD = Interpretadores.LambdaVDirec(d); //vetor lambda*d + vetor yk vetYj = Interpretadores.GeraVetorY(yk, lambdaD); //substitui lambda por x nos lugares corretos -> Fy só com lambda de variável Fy = Interpretadores.GeraFy(func, vetYj.Replace(',', '.')); //Newton para calcular o valor de lambda lambda = Newton.Calcular(0, (Fy.Replace("lamb", "x[1]")).Replace(',', '.'), 0.1); //substitui o valor de lambda na função Fy -> gera vetor xk novo yk = Interpretadores.SubsLambda(lambda, vetYj.Replace(',', '.')); } xk = (double[])yk.Clone(); vetNorma = Interpretadores.SubtracaoVetor(xk, x); //resultado da norma norma = Interpretadores.NormaVetor(vetNorma); } while (norma > erro); return(xk); }
/// <summary> /// Minimiza F(x) utilizando o método do Gradiente. /// </summary> /// <param name="n">Número de variáveis.</param> /// <param name="fx">Função a ser minimizada.</param> /// <param name="e">Erro.</param> /// <param name="x_ini">X inicial.</param> /// <returns>Retorna o X ótimo.</returns> public static double[] Calcular(int n, string fx, double e, string x_ini) { int k = 0; double[] x = Interpretadores.SplitToDoubles(x_ini); double[] gradiente = CalculaGradiente(n, fx, x).ToArray(); double[] d = new double[n]; while (Math.Abs(Interpretadores.NormaVetor(gradiente)) >= e) { for (int i = 0; i < gradiente.Length; i++) { d[i] = -gradiente[i]; } string yj = Interpretadores.GeraVetorY(x, Interpretadores.LambdaVDirec(d)); string f = Interpretadores.GeraFy(fx, yj); var lambda = Newton.Calcular(0, (f.Replace("lamb", "x[1]")).Replace(',', '.'), 0.1); x = Interpretadores.SubsLambda(lambda, yj.Replace(',', '.')); gradiente = CalculaGradiente(n, fx, x).ToArray(); k += 1; } return(x); }
private void button_Click(object sender, EventArgs e) { var radioChecked = radioButtons.Controls.OfType <RadioButton>().FirstOrDefault(r => r.Checked); switch (radioChecked.Text) { case "Busca Uniforme": BuscaUniforme buscUni = new BuscaUniforme(); buscUni.FinishCalculating += FinishCalculating; try { buscUni.dados.a = Convert.ToDouble(aTextBox.Text); buscUni.dados.b = Convert.ToDouble(bTextBox.Text); buscUni.dados.delta = Convert.ToDouble(deltaTextBox.Text); buscUni.dados.func = funcTextBox.Text; xotimoTextBox.Text = buscUni.Calcular().ToString(); } catch (FormatException) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; case "Busca Dicotômica": BuscaDic buscDic = new BuscaDic(); buscDic.FinishCalculating += FinishCalculating; try { buscDic.infos.a = Convert.ToDouble(aDicTextBox.Text); buscDic.infos.b = Convert.ToDouble(bDicTextBox.Text); buscDic.infos.l = Convert.ToDouble(lTextBox.Text); buscDic.infos.e = Convert.ToDouble(episTextBox.Text); buscDic.infos.func = funcDicTextBox.Text; xotimoDicTextBox.Text = buscDic.Calcular().ToString(); } catch (Exception) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; case "Seção Áurea": SecAurea secAurea = new SecAurea(); secAurea.FinishCalculating += FinishCalculating; try { secAurea.infos.a = Convert.ToDouble(aAureaTextBox.Text); secAurea.infos.b = Convert.ToDouble(bAureaTextBox.Text); secAurea.infos.l = Convert.ToDouble(lAureaTextBox.Text); secAurea.infos.func = funcAureaTextBox.Text; xotimoAureaTextBox.Text = secAurea.Calcular().ToString(); } catch (Exception) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; case "Busca de Fibonacci": Fibonacci fib = new Fibonacci(); fib.FinishCalculating += FinishCalculating; try { fib.infos.a = Convert.ToDouble(aFibTextBox.Text); fib.infos.b = Convert.ToDouble(bFibTextBox.Text); fib.infos.l = Convert.ToDouble(lFibTextBox.Text); fib.infos.func = funcFibTextBox.Text; xotimoFib.Text = fib.Calcular().ToString(); } catch (Exception) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; case "Bisseção": Bissecao biss = new Bissecao(); biss.FinishCalculating += FinishCalculating; try { biss.infos.a = Convert.ToDouble(aBissecTextBox.Text); biss.infos.b = Convert.ToDouble(bBissecTextBox.Text); biss.infos.l = Convert.ToDouble(lBissecTextBox.Text); biss.infos.func = funcBissecTextBox.Text; xotimoBissecTextBox.Text = biss.Calcular().ToString(); } catch (Exception) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; case "Newton": Newton newt = new Newton(); newt.FinishCalculating += FinishCalculating; try { newt.infos.a = Convert.ToDouble(aNewTextBox.Text); newt.infos.b = Convert.ToDouble(bNewTextBox.Text); newt.infos.e = Convert.ToDouble(episNewTextBox.Text); newt.infos.func = funcNewTextBox.Text; xotimoNewTextBox.Text = newt.Calcular().ToString(); } catch (Exception) { string aux = lastArchieve.Text; lastArchieve.Text = "Insira um valor válido"; var t = new Timer(); t.Interval = 2000; t.Tick += (s, eT) => { lastArchieve.Text = aux; t.Stop(); }; t.Start(); } break; default: break; } }