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.5
et 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 int
ou un size_t
compteur:
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 N
suffisamment pour que l'intégration globale prenne moins de temps sans sacrifier la précision.)
trapezoidal_integration
au lieu detrap
,sum
ourunning_total
au lieu des
(et également utiliser à la+=
place des = s +
),trapezoid_width
oudx
au lieu deh
(ou non, selon votre notation préférée pour la règle trapézoïdale), et changezfunc1
etfunc2
pour refléter le fait que ce sont des valeurs, pas des fonctions. Par exemplefunc1
->previous_value
etfunc2
->current_value
, ou quelque chose comme ça.