UtilsLite
Utilities for C++ programming
Loading...
Searching...
No Matches
Utils_zeros.hh
Go to the documentation of this file.
1/*--------------------------------------------------------------------------*\
2 | |
3 | Copyright (C) 2022 |
4 | |
5 | , __ , __ |
6 | /|/ \ /|/ \ |
7 | | __/ _ ,_ | __/ _ ,_ |
8 | | \|/ / | | | | \|/ / | | | |
9 | |(__/|__/ |_/ \_/|/|(__/|__/ |_/ \_/|/ |
10 | /| /| |
11 | \| \| |
12 | |
13 | Enrico Bertolazzi |
14 | Dipartimento di Ingegneria Industriale |
15 | Università degli Studi di Trento |
16 | email: enrico.bertolazzi@unitn.it |
17 | |
18\*--------------------------------------------------------------------------*/
19
20//
21// file: Utils_zeros.hh
22//
23
24#pragma once
25
26#ifndef UTILS_ZEROS_dot_HH
27#define UTILS_ZEROS_dot_HH
28
29#include <iostream>
30#include <sstream>
31#include <string>
32#include <algorithm>
33#include <cmath>
34
35#include "Utils.hh"
36
37namespace Utils {
38
39 using std::pow;
40 using std::abs;
41
46
47 /*
48 // __________ ____ ___ ____
49 // |__ / ____| _ \ / _ \/ ___|
50 // / /| _| | |_) | | | \___ \
51 // / /_| |___| _ <| |_| |___) |
52 // /____|_____|_| \_\\___/|____/
53 */
85
86 template <typename Real>
88 public:
89
96 virtual Real eval( Real x ) const = 0;
97
104 virtual Real eval_D( Real x ) const = 0;
105
112 virtual Real eval_DD( Real x ) const = 0;
113
120 virtual Real eval_DDD( Real x ) const = 0;
121
131 Real operator () ( Real x ) const { return this->eval(x); }
132
142 Real D( Real x ) const { return this->eval_D(x); }
143
153 Real DD( Real x ) const { return this->eval_DD(x); }
154
164 Real DDD( Real x ) const { return this->eval_DDD(x); }
165 };
166
215
216 template <typename Real>
217 class Zeros {
218
219 using Integer = int;
220
221 Integer m_max_fun_evaluation{200}; //< max number of function evaluations
222 Integer m_max_iteration{100}; //< max number of iterations
223 Real m_tolerance{pow(machine_eps<Real>(),Real(2./3.))};
224 bool m_converged{false};
225
226 mutable Integer m_iteration_count{0}; // explore iteration counter
227 mutable Integer m_fun_evaluation_count{0};
228
229 //static Real Q( Real t ) { return 1/(1-2*t); }
230 static Real Q( Real t ) { return 1+2*t; }
231
232 static Real W( Real t, Real s ) {
233 Real t2{t*t};
234 return t2*(1-4*t)+(4*s+2)*t+s+1;
235 }
236
237 static Real H( Real t, Real s, Real u ) {
238 Real t1 = t*t;
239 Real t2 = t1*t1;
240 Real t8 = s*s;
241 Real t17 = s*t8;
242 Real t23 = 2.0*u;
243 return ( (8*u+6*t2+4)*s-(6*t8+4*(s+u+1))*t1 + 2*t8 - 4*t17 + t23 + 2 )*t +
244 t1*(t8+s+u+1) + (1-3*t2+t23)*s + u - t17 + 1;
245 }
246
247 static Real J( Real t, Real s, Real u, Real v ) {
248 Real t1 = s*s;
249 Real t2 = t1*t1;
250 Real t17 = t*t;
251 Real t22 = u*u;
252 Real t32 = t17*t17;
253 Real t34 = t*t32;
254 Real t37 = t*t17;
255 Real t46 = 1+v;
256 Real t65 = u+1+v;
257 Real t76 = (-2*t22+u+4.0*v+2)*u;
258 return (2*t-1)*(2+5*t)*u*t*t2 +
259 (4*t+1)*u*s*t2+
260 (u*t22-2*u*v-u-v-1)*(4*t17+3*t+1)*(t-1)-
261 8.0*(t22*(t17/2.0-1.0/4.0)+u*(t17*t32-5.0/8.0*t34-3.0/4.0*t32+
262 3.0/8.0*t37+3.0/4.0*t17-t/8.0-1.0/4.0)+3.0/4.0*t46*(t+1.0/2.0)*(t-2.0/3.0))*t*t1+
263 4.0*(t22*(-3.0/2.0*t-1.0/4.0)+u*(t34-t32-3.0/2.0*t37+t17/4.0-t-1.0/4.0)-
264 t46*(t+1.0/4.0))*s*t1+(1.0+v+t65*t17-4.0*t65*t37-3.0*t65*t32+6.0*t65*t34+t76+4.0*(1.0+v+t76)*t)*s;
265 }
266
267 public:
268
269 Zeros() = default;
270 ~Zeros() = default;
271
277 void set_max_iterations( Integer mit );
283 void set_max_fun_evaluation( Integer mfev );
290 void set_tolerance( Real tol );
291
299 Real solve_Newton( Real x_guess, Zeros_base_fun<Real> * fun );
307 Real solve_Chebyshev( Real x_guess, Zeros_base_fun<Real> * fun );
315 Real solve_Halley( Real x_guess, Zeros_base_fun<Real> * fun );
323 Real solve_Order4( Real x_guess, Zeros_base_fun<Real> * fun );
331 Real solve_Order8( Real x_guess, Zeros_base_fun<Real> * fun );
339 Real solve_Order16( Real x_guess, Zeros_base_fun<Real> * fun );
347 Real solve_Order32( Real x_guess, Zeros_base_fun<Real> * fun );
348
352 Integer used_iter() const { return m_iteration_count; }
356 Integer num_fun_eval() const { return m_fun_evaluation_count; }
360 Real tolerance() const { return m_tolerance; }
364 bool converged() const { return m_converged; }
365
366 };
367
368 #ifndef UTILS_OS_WINDOWS
369 extern template class Zeros<float>;
370 extern template class Zeros<double>;
371 #endif
372
373}
374
375#endif
376
377//
378// eof: Utils_zeros.hh
379//
Abstract base class for defining mathematical functions used in root-finding algorithms.
Definition Utils_zeros.hh:87
virtual Real eval(Real x) const =0
Real solve_Halley(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:137
Real solve_Order16(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:239
virtual Real eval_D(Real x) const =0
bool converged() const
Definition Utils_zeros.hh:364
void set_max_fun_evaluation(Integer mfev)
Definition Utils_zeros.cc:65
Real DDD(Real x) const
Definition Utils_zeros.hh:164
virtual Real eval_DD(Real x) const =0
Real solve_Chebyshev(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:110
Real D(Real x) const
Definition Utils_zeros.hh:142
Real operator()(Real x) const
Definition Utils_zeros.hh:131
virtual Real eval_DDD(Real x) const =0
void set_max_iterations(Integer mit)
Definition Utils_zeros.cc:51
Integer num_fun_eval() const
Definition Utils_zeros.hh:356
Zeros()=default
void set_tolerance(Real tol)
Definition Utils_zeros.cc:75
Integer used_iter() const
Definition Utils_zeros.hh:352
Real tolerance() const
Definition Utils_zeros.hh:360
Real solve_Order32(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:281
Real DD(Real x) const
Definition Utils_zeros.hh:153
Real solve_Order8(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:200
Real solve_Newton(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:87
Real solve_Order4(Real x_guess, Zeros_base_fun< Real > *fun)
Definition Utils_zeros.cc:173
~Zeros()=default
Definition SystemUtils.cc:39
T machine_eps()