public void CalcularRungeKutta4OrdemTeste() { double passo = 0.2; int numeroDePassos = 6; double[] y0 = new[] { 1.0 }; FuncaoDeIntegracao funcaoDeIntegracao = new FuncaoDeY(Potencia); RungeKutta4Ordem rungeKutta = new RungeKutta4Ordem(passo, funcaoDeIntegracao); double[] yEsperado = { 1.00000, 0.83334, 0.71429, 0.62501, 0.55556, 0.50000 }; List<double[]> yCalculado = new List<double[]> { y0 }; for (int i = 1; i < numeroDePassos; i++) { yCalculado.Add(rungeKutta.CalcularVariavelNoProximoPasso(yCalculado[i - 1])); } for (int i = 0; i < numeroDePassos; i++) { for (int j = 0; j < y0.Length; j++) { Assert.AreEqual(yEsperado[i], yCalculado[i][j], 1e-5); } } }
public void CalcularRungeKutta4OrdemMultidimensionalTeste() { double passo = 0.1; int numeroDePassos = 100; double[] y0 = new double[] { 1.0, 0.0 }; double x0 = 0.0; FuncaoDeIntegracao funcao = new FuncaoDeY(YTrocado); RungeKutta4Ordem rungeKutta = new RungeKutta4Ordem(passo, funcao); List<double[]> yEsperado = new List<double[]> { y0 }; double[] x = new double[numeroDePassos]; x[0] = x0; for (int i = 1; i < numeroDePassos; i++) { double[] yLinhaEsperado = new double[y0.Length]; x[i] = x[i - 1] + passo; yLinhaEsperado[0] = Math.Cosh(x[i]); yLinhaEsperado[1] = Math.Sinh(x[i]); yEsperado.Add(yLinhaEsperado); } List<double[]> yCalculado = new List<double[]> { y0 }; for (int i = 1; i < numeroDePassos; i++) { yCalculado.Add(rungeKutta.CalcularVariavelNoProximoPasso(yCalculado[i - 1])); } for (int i = 0; i < numeroDePassos; i++) { for (int j = 0; j < y0.Length; j++) { Assert.AreEqual(yEsperado[i][j], yCalculado[i][j], yEsperado[i][j] / 1000); } } }