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.5
und 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 int
oder einen size_t
Zä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_integration
statttrap
,sum
oderrunning_total
anstelle vons
(und auch verwenden+=
statts = s +
),trapezoid_width
oderdx
anstelle vonh
(oder auch nicht, je nach Ihrer bevorzugten Schreibweise für die Trapezregel), und ändernfunc1
und umfunc2
die Tatsache widerzuspiegeln , dass sie Werte sind, nicht funktioniert. ZBfunc1
->previous_value
undfunc2
->current_value
oder so ähnlich.