3 #include <gsl/gsl_errno.h> 4 #include <gsl/gsl_math.h> 5 #include <gsl/gsl_roots.h> 33 return (a * x + b) * x +
c;
49 return 2.0 * a * x +
b;
68 *y = (a * x +
b) * x + c;
69 *dy = 2.0 * a * x +
b;
87 double x_lo = 0.0, x_hi = 5.0;
89 const gsl_root_fsolver_type *T = gsl_root_fsolver_bisection;
92 s = gsl_root_fsolver_alloc(T);
94 gsl_root_fsolver_set(s, &F, x_lo, x_hi);
98 printf(
"using %s method\n", gsl_root_fsolver_name(s));
99 printf(
"%5s [%9s, %9s] %9s %10s %9s\n",
"iter",
"lower",
"upper",
"root",
"err",
"err(est)");
101 double r = 0, r_expected = sqrt(5.0);
103 int iter = 0, max_iter = 100;
108 status = gsl_root_fsolver_iterate(s);
109 r = gsl_root_fsolver_root(s);
111 x_lo = gsl_root_fsolver_x_lower(s);
112 x_hi = gsl_root_fsolver_x_upper(s);
114 status = gsl_root_test_interval(x_lo, x_hi, 0, 0.001);
116 if (status == GSL_SUCCESS) {
117 printf(
"Converged:\n");
120 printf(
"%5d [%.7f, %.7f] %.7f %+.7f %.7f\n",
127 }
while (status == GSL_CONTINUE && iter < max_iter);
131 gsl_root_fsolver_free(s);
142 gsl_function_fdf FDF;
146 FDF.params = ¶ms;
150 double x0, x = 5.0, r_expected = sqrt(5.0);
152 const gsl_root_fdfsolver_type *T = gsl_root_fdfsolver_newton;
154 gsl_root_fdfsolver *s;
155 s = gsl_root_fdfsolver_alloc(T);
157 gsl_root_fdfsolver_set(s, &FDF, x);
162 int iter = 0, max_iter = 100;
163 printf(
"using %s method\n", gsl_root_fdfsolver_name(s));
164 printf(
"%-5s %10s %10s %10s\n",
"iter",
"root",
"err",
"err(est)");
169 status = gsl_root_fdfsolver_iterate(s);
171 x = gsl_root_fdfsolver_root(s);
173 status = gsl_root_test_delta(x, x0, 0, 1e-3);
175 if (status == GSL_SUCCESS)
176 printf(
"Converged:\n");
178 printf(
"%5d %10.7f %+10.7f %10.7f\n", iter, x, x - r_expected, x - x0);
179 }
while (status == GSL_CONTINUE && iter < max_iter);
183 gsl_root_fdfsolver_free(s);
193 fmt.set_defaults(ofs);
204 inline void show_results(std::ofstream &ofs,
const T &obj,
double expected) {
205 ofs <<
"method used :" << obj.method_used() << std::endl;
206 if (obj.converged()) {
208 ofs <<
"t:" << obj.result() << std::endl;
209 ofs <<
"t (exact):" << expected << std::endl;
210 ofs <<
"error:" << abs(obj.result() - expected) << std::endl;
212 ofs <<
"failed" << std::endl;
221 auto function = [](
double x) {
return pow(x, 2) - 5; };
225 ofs << std::fixed << std::setprecision(7);
228 auto monitor = [&ofs](
size_t i,
232 ofs << i <<
"\t" << xmin <<
"\t" 233 << xmax <<
"\t" << result << std::endl;
238 ofs <<
"iter\txmin\txmax\terror\n";
239 rootFinder.
apply(0, 5, monitor, 0, 0.001);
249 auto function = [](
double x) {
return pow(x, 2) - 5; };
251 ofs << std::fixed << std::setprecision(7);
252 auto monitor = [&ofs](
size_t i,
double xmin,
double xmax,
double result) {
253 ofs << i <<
"\t" << xmin <<
"\t" << xmax <<
"\t" << result << std::endl;
257 ofs <<
"iter\txmin\txmax\terror\n";
258 rootFinder.
apply(0, 5, monitor, 0, 0.001);
259 ofs <<
"method used :" << rootFinder.method_used() << std::endl;
268 const double d = 100;
269 const double m1 = 1, m2 = 2;
270 const double f1 = 10, f2 = 15;
271 const double a1 = f1 / m1;
272 const double a2 = f2 / m2;
275 auto fn = [d, a1, a2](
double t) {
276 const auto x1 = 0.5 * a1 * pow(t, 2);
277 const auto x2 = d - 0.5 * a2 * pow(t, 2);
283 ofs << std::fixed << std::setprecision(7);
287 rootFinder.
apply(0, 100, 0, 1e-6);
290 const auto expected = sqrt(2 * d / (a1 + a2));
300 inline double f(
double x)
const {
return pow(x, 2) - 5; }
301 inline double df(
double x)
const {
return 2 * x; }
306 ofs << std::setprecision(6) << std::fixed;
309 auto monitor = [&ofs](
size_t itr,
double x0,
double x) {
310 ofs << itr <<
"\t" << x <<
"\t" << x - x0
311 <<
"\t" << x - sqrt(5) << std::endl;
316 rootFinder.
apply(5, monitor);
The quadratic_params struct.
void ex2()
ex2 Nullstellensuche mit dem Newton-Verfahren und gsl-Routinen
void show_results(std::ofstream &ofs, const T &obj, double expected)
show_results Präsentation der Ergebnisse
void quadratic_fdf(double x, void *params, double *y, double *dy)
quadratic_fdf quadratisches Polynom und Ableitung
void root4()
root4 Berechnung von sqrt(5) mit dem Newton-Verfahren
void root2()
root2 Berechnung von sqrt{5} mit dem Bisektionsverfahren
void ex1()
ex1 Bisektionsverfahren mit gsl-Routinen
auto apply(double xmin, double xmax, FN fn, double epsabs, double epsrel)
apply startet Nullstellensuche
double quadratic_fn(double x, void *params)
quadratic quadratisches Polynom
void root1()
root1 Berechnung von sqrt{5} mit dem Bisektionsverfahren
auto get_output_stream(const char *name, Format fmt=Output::terminal)
get_output_stream
static const Format terminal
static std::ofstream get_stream(const std::string &fname)
get_output_stream Öffnen einer Ausgabedatei falls die Datei nicht geöffnet werden kann wird ein Fehle...
The RootBracketing class gsl-Klasse für das Bisektionsverfahren.
void root3()
root3 zwei Teilchen bewegen sich aufeinader zu
double quadratic_deriv(double x, void *params)
quadratic_deriv Ableitung des quadratischen Polynoms
double f(double x, void *params)
f
auto apply(double startval, double epsabs=0, double epsrel=1e-3)
apply Nullstellensuche
The FDFSolver class Nullstellensuche Funktion und ihre Ableitung werden benötigt. ...