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); } } }
public List<double[]> Calcular(int npassos,double passo) { tempo = new double[npassos]; tempo[0] = 0.0; passoInicial = tempo[0]; for (int i = 1; i < npassos; i++) { tempo[i] = tempo[i - 1] + passo; } x = new double[N]; x[0] = x0; for (int i = 1; i < N; i++) { x[i] = x[i - 1] + (xf - x0) / (N - 1); } double[] f0 = new double[N]; double[] f1 = new double[N - 1]; for (int i = 0; i < N; i++) { f0[i] = funcaoInicial(x[i]); if (i < (N - 1)) f1[i] = f0[i]; } List<double[]> resultados = new List<double[]>(npassos) { f0 };//Adicionar a distribuição inicial aqui List<double[]> yCalculado = new List<double[]> { f1 };//Adicionar a distribuição inicial sem o último termo FuncaoDeIntegracao funcaoDeIntegracao = new FuncaoDeY(TermoFonte); RungeKutta5Ordem rungeKutta = new RungeKutta5Ordem(passo, funcaoDeIntegracao); for (int i = 1; i < npassos; i++) { rungeKutta = new RungeKutta5Ordem(passo, funcaoDeIntegracao); double[] yAtual = rungeKutta.CalcularVariavelNoProximoPasso(0.0, yCalculado[i - 1]); yCalculado.Add(yAtual); } //var termoFonte = TermoFonte(yCalculado[0]); //Dasslc dasslc = new Dasslc(yCalculado[0].Length, passoInicial, passo, npassos, yCalculado[0], termoFonte); //int codigoErro; //List<KeyValuePair<double, double[]>> resultadosDasslc; //if (!dasslc.Calcular(DelegateSistemaLinear, out resultadosDasslc, out codigoErro)) // throw new Exception("Erro durante a integração temporal, pelo cálculo da DasslC. Código = " + codigoErro); //for (int i = 1; i < npassos; i++) //{ // double[] resultado = new double[N]; // resultado[N - 1] = resultados[0][N - 1] * Math.Exp(-k * tempo[i]); // for (int j = 0; j < N-1; j++) // { // resultado[j] = resultadosDasslc[i].Value[j]; // } // resultados.Add(resultado); //} for (int i = 1; i < npassos; i++) { double[] resultado = new double[N]; resultado[N - 1] = resultados[0][N - 1] * Math.Exp(-bf(0.0) * tempo[i]); for (int j = 0; j < N - 1; j++) { resultado[j] = yCalculado[i][j]; } resultados.Add(resultado); } return resultados; }