?
Nachtrag: Code dazu beispielsweise
#include <stdio.h>
#include <math.h>
int epsilon_equal(double x, double y, double eps) {
return fabs(x - y) < eps;
}
double numeric_derivative(double (*func)(double), double x, double eps) {
return (func(x + eps) - func(x - eps)) / (2 * eps);
}
double numeric_second_derivative(double(*func)(double), double x, double eps_1, double eps_2) {
return
(numeric_derivative(func, x + eps_2, eps_1) -
numeric_derivative(func, x - eps_2, eps_1)) / (2 * eps_2);
}
int newton_iterate_derivative(double *result,
double (*func)(double),
double target,
double start,
unsigned max_try,
double eps_result,
double eps_deriv,
double eps_deriv2) {
double val_new, val_old = start;
unsigned i;
for(i = 0; i < max_try; ++i) {
val_new = val_old - (numeric_derivative(func, val_old, eps_deriv) - target) / numeric_second_derivative(func, val_old, eps_deriv, eps_deriv2);
if(epsilon_equal(val_new, val_old, eps_result)) {
*result = val_new;
return 0;
}
val_old = val_new;
}
return -1;
}
double my_function(double x) {
return (x + 4) * (x + 2) * (x + 1) * (x - 1) * (x - 3) / 20 + 2;
}
int main() {
double start_values[] = { -4.0, -2.0, 0.0, 2.0 };
unsigned i;
for(i = 0; i < 4; ++i) {
double result;
if(0 == newton_iterate_derivative(&result, my_function, 0.0, start_values[i], 2000, 1e-7, 1e-7, 1e-7)) {
printf("Lokales Min-/Maximum: %f\n", result);
} else {
printf("Newton-Iteration mit Startwert %f konvergiert nicht (schnell genug)\n", start_values[i]);
}
}
return 0;
}
Jetzt mal so hingekladdet (bzw. von einem Stück C++-Code, das ich hier noch rumliegen hatte, angepasst). Kennt jemand eine brauchbare C-Bibliothek, die Funktionsbinder hat? Ich bin ja von C++ her durch std::tr1::bind verwöhnt Das wäre hier echt praktisch gewesen.