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;
}
Lo anterior es mi código C ++ para una integración numérica 1D (usando la regla de trapecio extendida) de func()
entre límites usando trapecia .
Realmente estoy haciendo una integración 3D, donde este código se llama recursivamente. Trabajo con dándome resultados decentes.
Además de reducir aún más , ¿alguien puede sugerir cómo optimizar el código anterior para que se ejecute más rápido? ¿O incluso puede sugerir un método de integración más rápido?
trapezoidal_integration
lugar detrap
,sum
o enrunning_total
lugar des
(y también usar en+=
lugar des = s +
),trapezoid_width
o endx
lugar deh
(o no, dependiendo de su notación preferida para la regla trapezoidal), y cambiarfunc1
yfunc2
reflejar el hecho de que son valores, no funciones. Por ejemplo,func1
->previous_value
yfunc2
->current_value
, o algo así.