1#ifndef ROOT_ONEDIM_TEST_H
2#define ROOT_ONEDIM_TEST_H
7#include "../framework/module.h"
8#include "../framework/state_map.h"
10#include "../math/roots/onedim/secant.h"
11#include "../math/roots/onedim/bisection.h"
12#include "../math/roots/onedim/regula_falsi.h"
13#include "../math/roots/onedim/ridder.h"
14#include "../math/roots/onedim/illinois.h"
15#include "../math/roots/onedim/pegasus.h"
16#include "../math/roots/onedim/newton.h"
17#include "../math/roots/onedim/halley.h"
18#include "../math/roots/onedim/steffensen.h"
19#include "../math/roots/onedim/fixed_point.h"
20#include "../math/roots/onedim/dekker.h"
21#include "../math/roots/onedim/dekker_newton.h"
22#include "../math/roots/onedim/anderson_bjorck.h"
57 y = ans - ep * std::sin(ans);
62 return x -
epsilon * std::sin(x) -
y;
67 return 1 -
epsilon * std::cos(x);
131 double* iteration_op;
135 state_map* output_quantities,
137 : root_op{get_op(output_quantities, name +
"_root")},
138 residual_op{get_op(output_quantities, name +
"_residual")},
139 iteration_op{get_op(output_quantities, name +
"_iteration")},
140 flag_op{get_op(output_quantities, name +
"_flag")}
147 state_map
const& input_quantities, state_map* output_quantities)
151 ecc{get_input(input_quantities,
"ecc")},
152 answer{get_input(input_quantities,
"answer")},
153 max_iterations{get_input(input_quantities,
"max_iterations")},
154 abs_tol{get_input(input_quantities,
"abs_tol")},
155 rel_tol{get_input(input_quantities,
"rel_tol")},
156 lower_bracket{get_input(input_quantities,
"lower_bracket")},
157 upper_bracket{get_input(input_quantities,
"upper_bracket")},
158 single_guess{get_input(input_quantities,
"single_guess")},
161 secant_result{output_quantities,
"secant"},
162 fixed_point_result{output_quantities,
"fixed_point"},
163 newton_result{output_quantities,
"newton"},
164 halley_result{output_quantities,
"halley"},
165 steffensen_result{output_quantities,
"steffensen"},
166 bisection_result{output_quantities,
"bisection"},
167 regula_falsi_result{output_quantities,
"regula_falsi"},
168 ridder_result{output_quantities,
"ridder"},
169 illinois_result{output_quantities,
"illinois"},
170 pegasus_result{output_quantities,
"pegasus"},
171 anderson_bjorck_result{output_quantities,
"anderson_bjorck"},
172 dekker_result{output_quantities,
"dekker"},
173 dekker_newton_result{output_quantities,
"dekker_newton"}
179 static std::string
get_name() {
return "root_onedim_test"; }
184 const double& answer;
185 const double& max_iterations;
186 const double& abs_tol;
187 const double& rel_tol;
188 const double& lower_bracket;
189 const double& upper_bracket;
190 const double& single_guess;
193 result secant_result;
194 result fixed_point_result;
195 result newton_result;
196 result halley_result;
197 result steffensen_result;
198 result bisection_result;
199 result regula_falsi_result;
200 result ridder_result;
201 result illinois_result;
202 result pegasus_result;
203 result anderson_bjorck_result;
204 result dekker_result;
205 result dekker_newton_result;
208 void do_operation()
const;
210 static string_vector make_qname(std::string& name)
219 void inline update_result(
220 const result& r, root_finding::result_t& result)
const
222 update(r.root_op, result.root);
223 update(r.residual_op, result.residual);
224 update(r.iteration_op, result.iteration);
225 update(r.flag_op,
static_cast<int>(result.flag));
245 const string_vector methods = {
246 "secant",
"fixed_point",
"newton",
"halley",
"steffensen",
247 "bisection",
"regula_falsi",
"ridder",
248 "illinois",
"pegasus",
"anderson_bjorck",
"dekker",
250 for (
auto name : methods) {
251 string_vector sv = make_qname(name);
252 out.insert(out.end(), sv.begin(), sv.end());
258void root_onedim_test::do_operation()
const
261 using namespace root_finding;
265 fixed_point_test_function fix_pt_test{ecc, answer};
266 size_t iter =
static_cast<size_t>(max_iterations);
268 result = secant(iter, abs_tol, rel_tol)
269 .solve(test, lower_bracket, upper_bracket);
270 update_result(secant_result, result);
272 result = fixed_point(iter, abs_tol, rel_tol)
273 .solve(fix_pt_test, single_guess);
274 update_result(fixed_point_result, result);
276 result = newton(iter, abs_tol, rel_tol)
277 .solve(test, single_guess);
278 update_result(newton_result, result);
280 result = halley(iter, abs_tol, rel_tol)
281 .solve(test, single_guess);
282 update_result(halley_result, result);
284 result = steffensen(iter, abs_tol, rel_tol)
285 .solve(test, single_guess);
286 update_result(steffensen_result, result);
288 result = bisection(iter, abs_tol, rel_tol)
289 .solve(test, lower_bracket, upper_bracket);
290 update_result(bisection_result, result);
292 result = regula_falsi(iter, abs_tol, rel_tol)
293 .solve(test, lower_bracket, upper_bracket);
294 update_result(regula_falsi_result, result);
296 result = ridder(iter, abs_tol, rel_tol)
297 .solve(test, lower_bracket, upper_bracket);
298 update_result(ridder_result, result);
300 result = illinois(iter, abs_tol, rel_tol)
301 .solve(test, lower_bracket, upper_bracket);
302 update_result(illinois_result, result);
304 result = pegasus(iter, abs_tol, rel_tol)
305 .solve(test, lower_bracket, upper_bracket);
306 update_result(pegasus_result, result);
308 result = anderson_bjorck(iter, abs_tol, rel_tol)
309 .solve(test, lower_bracket, upper_bracket);
310 update_result(anderson_bjorck_result, result);
312 result = dekker(iter, abs_tol, rel_tol)
313 .solve(test, lower_bracket, upper_bracket);
314 update_result(dekker_result, result);
316 result = dekker_newton(iter, abs_tol, rel_tol)
317 .solve(test, lower_bracket, upper_bracket);
318 update_result(dekker_newton_result, result);
Function object for Kepler's equation. Kepler's equation relates the mean anomaly to the eccentric a...
root_onedim_test(state_map const &input_quantities, state_map *output_quantities)
static string_vector get_outputs()
static string_vector get_inputs()
static std::string get_name()
This is the standard BioCro module library; it includes the essential modules used in typical BioCro ...
fixed_point_test_function(double ep, double a)
double operator()(double x)
Function object for Kepler's equation. Kepler's equation relates the mean anomaly to the eccentric a...
double second_derivative(double x)
root_test_function(double ep, double ans)
double derivative(double x)
double operator()(double x)