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; }
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); } }
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); } }
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); } }
//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; }
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; }
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(); }
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; }