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;
}
Powyżej jest mój kod C ++ dla integracji numerycznej 1D (przy użyciu reguły rozszerzonego trapezu) func()
między granicami za pomocą trapezia.
W rzeczywistości wykonuję integrację 3D, w której ten kod jest wywoływany rekurencyjnie. Ja pracuję z dając mi przyzwoite wyniki.
Inne niż redukcja ponadto, czy ktoś jest w stanie zasugerować, jak zoptymalizować powyższy kod, aby działał szybciej? A może nawet sugeruje szybszą metodę integracji?
trapezoidal_integration
zamiasttrap
,sum
lubrunning_total
zamiasts
(a także używaj+=
zamiasts = s +
),trapezoid_width
lubdx
zamiasth
(lub nie, w zależności od preferowanego zapisu dla reguły trapezoidalnej) i zmieniajfunc1
ifunc2
odzwierciedlaj fakt, że są to wartości, a nie funkcje. Np.func1
->previous_value
ifunc2
->current_value
lub coś takiego.