W
Ich habe mal schnell angefangen:
#include <iostream>
#include <cmath>
template<typename Func>
double delta_h(Func f, double h, double x) {
return f(x+h) - f(x-h);
}
template<typename Func>
double f_diff_h(Func f, double h, double x) {
return (8 * delta_h(f, h, x) - delta_h(f, 2*h, x)) / 12 / h;
}
template<typename Func>
double f_diff(Func f, double x) {
auto h = 0.000005;
return (16*f_diff_h(f, h, x) - f_diff_h(f, 2*h, x))/15;
}
void test() {
auto func = [](double x){return sin(x);};
const auto pi = 4*atan(1);
std::cout << f_diff(func, pi) - (-1) << " = 0\n";
std::cout << f_diff(func, pi/2) << " = 0\n";
std::cout << f_diff(func, pi/4) - cos(pi/4) << " = 0\n";
}
scheint zu funktionieren. Nur habe ich das h konstant gelassen und nicht geändert. Das kannst du ja gerne einbauen.
Übrigens noch 2 andere Hinweise:
Vermeide #define in C++, das ist hier komplett unnötig. Verwende einfach eine Konstante! (und EPS sieht so sehr nach dem gleichnamigen Format aus, da würde ich doch "epsilon" deutlich bevorzugen)
Bemerkung 2: Übersetze richtig ins Englische, sonst wirkt es komisch. Faculty ist sowas wie die Fakultät/der Fachbereich an einer Uni in UK bzw. das akademische Personal (US). n! ist das "factorial". Aber wo kommt das denn vor?!
Achso, und noch was:
die Test-Funktion sollte am besten auch etwas testen. Ich habe hier mal die Ableitung von sin an 3 verschiedenen Stellen getestet (da soll also 3x0 herauskommen). Hier kannst du die Ausgabe prüfen. Wenn mal alles funktioniert, kannst du dir auch z.B. sowas wie googletest anschauen. Dann würdest du da sowas wie
for (double x : x_test_values)
EXPECT_FLOAT_EQ(cos(x), f_diff(func, x));
schreiben können. Vielleicht ist float_eq auch zu stark, dann eher:
for (double x : x_test_values)
EXPECT_TRUE(std::abs(cos(x) - f_diff(func, x)) < epsilon);
oder so ähnlich.
Noch was:
for(i = 0; i < n; i++) {
result = (func(x + h) - func(x - h)) / (2 * h);
}
Das sieht komisch aus. Der Loop-Body hängt nicht von der Loop-Variablen ab. func soll wohl auch keine Nebeneffekte haben. Was soll also das for?