コード例 #1
0
ファイル: MomentosBase.cs プロジェクト: danieleRocha/Momentos
        protected double[] CalcularMomentosIniciais(MetodoCoeficientesDosMomentos metodoCoeficientes)
        {
            double[] m0 = new double[numeroDePontos];

            double precisaoRequerida = 1e-12;
            AutoQuad autoQuad = new AutoQuad(15,125, 1000, precisaoRequerida, 10);

            autoQuad.LimiteInferior = 125;
            autoQuad.LimiteSuperior = 1000;

            for (int i = 0; i < m0.Length; i++)
            {
                var i1 = i;

                Integral.Funcao funcaoDeMomento = x => funcao(x) * Polinomio(metodoCoeficientes, x, i1);

                double valorAutoquad;
                double valorComPrecisaoAutoquad;
                double precisaoAutoquad;

                if (!autoQuad.Calcular(funcaoDeMomento, out valorAutoquad, out valorComPrecisaoAutoquad, out precisaoAutoquad))
                    throw new Exception("Erro no cálculo da AutoQuad");

                if (precisaoAutoquad > precisaoRequerida)
                    throw new Exception("Precisão não foi atingida na AutoQuad");

                m0[i] = valorAutoquad;

                //m0[i] = Integral.CalcularIntegralImpropriaMidInf(funcaoDeMomento, limiteMinimo, limiteMaximo, numeroMaximoDePontos);
            }

            return m0;
        }
コード例 #2
0
ファイル: MomentosBase.cs プロジェクト: danieleRocha/Momentos
        public static double DerivadaPolinomio(MetodoCoeficientesDosMomentos metodoCoeficientes, double x, int k)
        {
            switch (metodoCoeficientes)
            {
                case MetodoCoeficientesDosMomentos.PDA:
                    return k * Math.Pow(x, k - 1);
                case MetodoCoeficientesDosMomentos.ChebyShev:
                    //Por Legendre:
                    double[] coeficientes;
                    AlgLib.ShiftedLegendreCoefficients(k, out coeficientes);

                    double valor = 0.0;

                    for (int i = 1; i < coeficientes.Length; i++)
                    {
                        valor += i * coeficientes[i] * Math.Pow(x, i - 1);
                    }

                    return valor;
                case MetodoCoeficientesDosMomentos.Wheeler:
                    return k * Math.Pow(x, k - 1);
                default:
                    throw new ArgumentOutOfRangeException("metodoCoeficientes", metodoCoeficientes, null);
            }
        }
コード例 #3
0
ファイル: MomentosBase.cs プロジェクト: danieleRocha/Momentos
 public static double Polinomio(MetodoCoeficientesDosMomentos metodoCoeficientes, double x, double k)
 {
     switch (metodoCoeficientes)
     {
         case MetodoCoeficientesDosMomentos.PDA:
             return Math.Pow(x, k);
         case MetodoCoeficientesDosMomentos.ChebyShev:
             //Por Legendre:
             throw new ArgumentOutOfRangeException("metodoCoeficientes", metodoCoeficientes, null);
         case MetodoCoeficientesDosMomentos.Wheeler:
             return Math.Pow(x, k);
         default:
             throw new ArgumentOutOfRangeException("metodoCoeficientes", metodoCoeficientes, null);
     }
 }
コード例 #4
0
ファイル: MomentosBase.cs プロジェクト: danieleRocha/Momentos
        public static void CalcularPesosEAbscissas(MetodoCoeficientesDosMomentos metodoCoeficientes, double[] momentos,
            out double[] pesos, out double[] abscissas)
        {
            int numeroDePontos = momentos.Length / 2;

            switch (metodoCoeficientes)
            {
                case MetodoCoeficientesDosMomentos.PDA:
                    AlgoritmoPD algoritmoPd = new AlgoritmoPD(numeroDePontos, momentos);
                    algoritmoPd.CalcularPesosEAbscissas(out pesos, out abscissas);
                    break;
                case MetodoCoeficientesDosMomentos.ChebyShev:
                    var chebyChev = new ChebyshevModificado(numeroDePontos,momentos,ChebyshevModificado.TipoDeDominio.Finito);
                    //var chebyChev = new ChebyshevModificado(momentos, numeroDePontos, ChebyshevModificado.TipoDeDominio.Finito);
                    chebyChev.CalcularPesosEAbscissas(out pesos, out abscissas);
                    break;
                case MetodoCoeficientesDosMomentos.Wheeler:
                    Wheeler wheeler = new Wheeler(numeroDePontos, momentos);
                    wheeler.CalcularPesosEAbscissas(out pesos, out abscissas);
                    break;
                default:
                    throw new ArgumentOutOfRangeException("metodoCoeficientes", metodoCoeficientes, null);
            }
        }
コード例 #5
0
ファイル: MomentosBase.cs プロジェクト: danieleRocha/Momentos
        //public static double CalcularMomento(double[] pesos, double[] abscissas, double indice)
        //{
        //    double momento = 0;
        //    for (int i = 0; i < pesos.Length; i++)
        //    {
        //        momento += pesos[i]*Math.Pow(abscissas[i], indice);
        //    }
        //    return momento;
        //}
        public static double CalcularMomento(MetodoCoeficientesDosMomentos metodoDeCoeficientes, double[] pesos, double[] abscissas, Integral.Funcao deltaAbscissas, double indice)
        {
            double momento = 0;

            if (deltaAbscissas == null)
            {
                for (int i = 0; i < pesos.Length; i++)
                {
                    momento += pesos[i] * Polinomio(metodoDeCoeficientes, abscissas[i], indice);
                }
            }
            else
            {
                for (int i = 0; i < pesos.Length; i++)
                {
                    momento += pesos[i] * Polinomio(metodoDeCoeficientes, (abscissas[i] + deltaAbscissas(abscissas[i])), indice);
                }
            }
            return momento;
        }
コード例 #6
0
ファイル: DQMoM.cs プロジェクト: danieleRocha/Momentos
            private void ObterSistemaLinear(int numeroDePontos, MetodoCoeficientesDosMomentos metodoCoeficientesDosMomentos, double[] pesos, double[] abscissas, Integral.Funcao funcaoDeltaAbscissas, TermoFonteDQMoM termoFonteSistemaLinearDqmoM, DecoradorDePesos decorarPesos, DecoradorDeAbscissas decorarAbscissas, double tempo)
            {
                if (decorarPesos != null) pesosDecorados = decorarPesos(pesos, tempo);
                else pesosDecorados = pesos;
                if (pesosDecorados == null) pesosDecorados = pesos;
                if (decorarAbscissas != null) abscissasDecoradas = decorarAbscissas(abscissas, tempo);
                else abscissasDecoradas = abscissas;
                if (abscissasDecoradas == null) abscissasDecoradas = abscissas;

                resposta = termoFonteSistemaLinearDqmoM(pesosDecorados, abscissasDecoradas, metodoCoeficientesDosMomentos,tempo);

                if (resposta.Length != numeroDePontos) throw new Exception("Número de pontos deve ser igual na matriz de coeficientes e no termo fonte do DQMoM!");

                for (int k = 0; k < numeroDePontos; k++)
                {
                    for (int i = 0; i < numeroDePontos/2; i++)
                    {
                        if (funcaoDeltaAbscissas == null)
                        {
                            matrizDeCoeficientes[k, i] = Polinomio(metodoCoeficientesDosMomentos, abscissas[i], k);
                            matrizDeCoeficientes[k, i + numeroDePontos / 2] = pesos[i] * DerivadaPolinomio(metodoCoeficientesDosMomentos, abscissas[i], k);
                        }
                        else
                        {
                            matrizDeCoeficientes[k, i] = Polinomio(metodoCoeficientesDosMomentos, (abscissas[i] + funcaoDeltaAbscissas(abscissas[i])), k);

                            matrizDeCoeficientes[k, i + numeroDePontos / 2] = pesos[i] * DerivadaPolinomio(metodoCoeficientesDosMomentos, (abscissas[i] + funcaoDeltaAbscissas(abscissas[i])), k);
                        }
                    }
                }

                sistema.MatrizDeCoeficientes = matrizDeCoeficientes;
                sistema.Resposta = resposta;
            }
コード例 #7
0
ファイル: DQMoM.cs プロジェクト: danieleRocha/Momentos
            public Funcao(NumericalRecipes numericalRecipes, int numeroDePontos, MetodoCoeficientesDosMomentos metodoCoeficientesDosMomentos, TermoFonteDQMoM termoFonteDQMoM, DecoradorDeAbscissas decorarAbscissas, DecoradorDePesos decorarPesos, Integral.Funcao funcaodeltaAbscissas)
            {
                this.numeroDePontos = numeroDePontos;
                this.termoFonteDQMoM = termoFonteDQMoM;
                this.decorarAbscissas = decorarAbscissas;
                this.decorarPesos = decorarPesos;
                this.funcaodeltaAbscissas = funcaodeltaAbscissas;
                this.metodoCoeficientesDosMomentos = metodoCoeficientesDosMomentos;
                this.numericalRecipes = numericalRecipes;

                SetVetores();
            }
コード例 #8
0
ファイル: QMoM.cs プロジェクト: danieleRocha/Momentos
 public Funcao(MetodoCoeficientesDosMomentos metodoDeCoeficientes, TermoFonteQMoM termoFonteQMoM, DecoradorDeAbscissas decorarAbscissas, DecoradorDePesos decorarPesos, Integral.Funcao funcaodeltaAbscissas)
 {
     this.termoFonteQMoM = termoFonteQMoM;
     this.decorarAbscissas = decorarAbscissas;
     this.decorarPesos = decorarPesos;
     this.metodoDeCoeficientes = metodoDeCoeficientes;
     this.funcaodeltaAbscissas = funcaodeltaAbscissas;
     calculoMomento = CalculoMomento;
 }