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