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;
}
Наведене вище - мій C ++ код для 1D числової інтеграції (використовуючи розширене правило трапеції) func()
між межами використовуючи трапеція.
Я фактично роблю 3D-інтеграцію, де цей код називається рекурсивно. Я працюю з даючи мені гідні результати.
Крім скорочення далі, чи хтось може підказати, як оптимізувати код вище, щоб він працював швидше? Або, навіть, може запропонувати швидший метод інтеграції?
trapezoidal_integration
замістьtrap
,sum
абоrunning_total
замістьs
(і також використовувати+=
замістьs = s +
),trapezoid_width
абоdx
замістьh
(або ні, залежно від бажаного позначення трапецієподібного правила), і змінюватиfunc1
таfunc2
відображати той факт, що вони є значеннями, а не функціями. Наприкладfunc1
->previous_value
іfunc2
->current_value
, або щось подібне.