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);
                }
            }
        }
Example #3
0
        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;
        }