Possible? Oui. Utile? Non. Il est peu probable que les optimisations que je vais énumérer ici fassent plus qu'une infime fraction d'un pourcentage de différence dans l'exécution. Un bon compilateur peut déjà les faire pour vous.
Quoi qu'il en soit, en regardant votre boucle intérieure:
for (s=0,j=a;j<b;j+=h){
func2 = func(j+h);
s = s + 0.5*(func1+func2)*h;
func1 = func2;
}
À chaque itération de boucle, vous effectuez trois opérations mathématiques qui peuvent être apportées à l'extérieur: addition j + h, multiplication par 0.5et multiplication par h. Le premier que vous pouvez corriger en démarrant votre variable d'itérateur sur a + h, et les autres en factorisant les multiplications:
for (s=0, j=a+h; j<=b; j+=h){
func2 = func(j);
s += func1+func2;
func1 = func2;
}
s *= 0.5 * h;
Bien que je souligne qu'en faisant cela, en raison d'une erreur d'arrondi en virgule flottante, il est possible de manquer la dernière itération de la boucle. (C'était également un problème dans votre implémentation d'origine.) Pour contourner ce problème, utilisez un unsigned intou un size_tcompteur:
size_t n;
for (s=0, n=0, j=a+h; n<N; n++, j+=h){
func2 = func(j);
s += func1+func2;
func1 = func2;
}
s *= 0.5 * h;
Comme le dit la réponse de Brian, votre temps est mieux utilisé pour optimiser l'évaluation de la fonction func. Si la précision de cette méthode est suffisante, je doute que vous trouverez quelque chose de plus rapide pour la même chose N. (Bien que vous puissiez exécuter des tests pour voir si, par exemple, Runge-Kutta vous permet de baisser Nsuffisamment pour que l'intégration globale prenne moins de temps sans sacrifier la précision.)
trapezoidal_integrationau lieu detrap,sumourunning_totalau lieu des(et également utiliser à la+=place des = s +),trapezoid_widthoudxau lieu deh(ou non, selon votre notation préférée pour la règle trapézoïdale), et changezfunc1etfunc2pour refléter le fait que ce sont des valeurs, pas des fonctions. Par exemplefunc1->previous_valueetfunc2->current_value, ou quelque chose comme ça.