Möglich? Ja. Nützlich? Nein. Es ist unwahrscheinlich, dass die Optimierungen, die ich hier auflisten werde, mehr als einen winzigen Bruchteil eines Prozentunterschieds in der Laufzeit ausmachen. Ein guter Compiler kann dies bereits für Sie tun.
Wie auch immer, wenn Sie Ihre innere Schleife betrachten:
for (s=0,j=a;j<b;j+=h){
func2 = func(j+h);
s = s + 0.5*(func1+func2)*h;
func1 = func2;
}
Bei jeder Schleifeniteration führen Sie drei mathematische Operationen aus, die nach außen gebracht werden können: Addieren j + h, Multiplizieren mit 0.5und Multiplizieren mit h. Das erste können Sie beheben, indem Sie Ihre Iteratorvariable bei starten a + h, und das andere, indem Sie die Multiplikationen herausrechnen:
for (s=0, j=a+h; j<=b; j+=h){
func2 = func(j);
s += func1+func2;
func1 = func2;
}
s *= 0.5 * h;
Obwohl ich darauf hinweisen möchte, dass auf diese Weise aufgrund eines Gleitkomma-Rundungsfehlers die letzte Iteration der Schleife übersehen werden kann. (Dies war auch ein Problem in Ihrer ursprünglichen Implementierung.) Um dies zu umgehen, verwenden Sie einen unsigned intoder einen size_tZähler:
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;
Wie Brians Antwort sagt, ist es besser, Ihre Zeit damit zu verbringen, die Bewertung der Funktion zu optimieren func. Wenn die Genauigkeit dieser Methode ausreicht, werden Sie wahrscheinlich nichts schnelleres finden N. (Sie könnten jedoch einige Tests durchführen, um festzustellen, ob Sie beispielsweise mit Runge-Kutta so weit abgesenkt werden können N, dass die Gesamtintegration weniger Zeit in Anspruch nimmt, ohne die Genauigkeit zu beeinträchtigen.)
trapezoidal_integrationstatttrap,sumoderrunning_totalanstelle vons(und auch verwenden+=statts = s +),trapezoid_widthoderdxanstelle vonh(oder auch nicht, je nach Ihrer bevorzugten Schreibweise für die Trapezregel), und ändernfunc1und umfunc2die Tatsache widerzuspiegeln , dass sie Werte sind, nicht funktioniert. ZBfunc1->previous_valueundfunc2->current_valueoder so ähnlich.