double trap(double func(double), double b, double a, double N) {
double j;
double s;
double h = (b-a)/(N-1.0); //Width of trapezia
double func1 = func(a);
double func2;
for (s=0,j=a;j<b;j+=h){
func2 = func(j+h);
s = s + 0.5*(func1+func2)*h;
func1 = func2;
}
return s;
}
O código acima é o meu código C ++ para uma integração numérica 1D (usando a regra do trapézio estendido) func()
entre os limites usando o trapézio .
Na verdade, estou fazendo uma integração 3D, onde esse código é chamado recursivamente. Eu trabalho com me dando resultados decentes.
Além de reduzir ainda mais o , alguém pode sugerir como otimizar o código acima para que ele seja executado mais rapidamente? Ou, ainda, pode sugerir um método de integração mais rápido?
trapezoidal_integration
vez detrap
,sum
ou emrunning_total
vez des
(e também usar em+=
vez des = s +
),trapezoid_width
ou emdx
vez deh
(ou não, dependendo da sua notação preferida para a regra trapezoidal) e alterarfunc1
efunc2
refletir o fato de que são valores, não funções. Por exemplofunc1
->previous_value
efunc2
->current_value
, ou algo assim.