00001 /* 00002 ------------------------------------------------------------------- 00003 00004 Copyright (C) 2006, 2007, 2008, 2009, Andrew W. Steiner 00005 00006 This file is part of O2scl. 00007 00008 O2scl is free software; you can redistribute it and/or modify 00009 it under the terms of the GNU General Public License as published by 00010 the Free Software Foundation; either version 3 of the License, or 00011 (at your option) any later version. 00012 00013 O2scl is distributed in the hope that it will be useful, 00014 but WITHOUT ANY WARRANTY; without even the implied warranty of 00015 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00016 GNU General Public License for more details. 00017 00018 You should have received a copy of the GNU General Public License 00019 along with O2scl. If not, see <http://www.gnu.org/licenses/>. 00020 00021 ------------------------------------------------------------------- 00022 */ 00023 #ifndef O2SCL_MROOT_H 00024 #define O2SCL_MROOT_H 00025 00026 #include <o2scl/ovector_tlate.h> 00027 #include <o2scl/mm_funct.h> 00028 #include <o2scl/jacobian.h> 00029 00030 #ifndef DOXYGENP 00031 namespace o2scl { 00032 #endif 00033 00034 /** 00035 \brief Multidimensional root-finding [abstract base] 00036 00037 <b>The template parameters:</b> 00038 The template parameter \c func_t specifies the functions to 00039 solve and should be a class containing a definition 00040 \code 00041 func_t::operator()(size_t nv, const vec_t &x, vec_t &y, param_t &pa); 00042 \endcode 00043 where \c y is the value of the functions at \c x with parameter \c pa 00044 and \c x and \c y are a array-like classes defining \c operator[] 00045 of size \c nv. If the Jacobian matrix is to be specified by the 00046 user, then the parameter \c jfunc_t specifies the jacobian 00047 and should contain the definition 00048 \code 00049 jfunc_t::operator(size_t nv, vec_t &x, vec_t &y, 00050 mat_t &j, param_t &pa); 00051 \endcode 00052 where \c x is the independent variables, \c y is the array of 00053 function values, and \c j is the Jacobian matrix. This template 00054 parameter can be ignored if only the function msolve() will be used. 00055 00056 \warning Many of the routines assume that the scale of the 00057 functions and their variables is of order unity. The solution 00058 routines may lose precision if this is not the case. 00059 00060 There is an example for the usage of the multidimensional solver 00061 classes given in <tt>examples/ex_mroot.cpp</tt>, see \ref 00062 ex_mroot_sect . 00063 00064 \future Change ntrial to size_t? 00065 */ 00066 template<class param_t, class func_t, class vec_t=ovector_base, 00067 class jfunc_t=jac_funct<param_t,vec_t,omatrix_base> > class mroot { 00068 00069 public: 00070 00071 mroot() { 00072 ntrial=100; 00073 tolf=1.0e-8; 00074 verbose=0; 00075 tolx=1.0e-12; 00076 last_ntrial=0; 00077 err_nonconv=true; 00078 } 00079 00080 virtual ~mroot() {} 00081 00082 /// The maximum value of the functions for success (default 1.0e-8) 00083 double tolf; 00084 00085 /// The minimum allowable stepsize (default 1.0e-12) 00086 double tolx; 00087 00088 /// Output control (default 0) 00089 int verbose; 00090 00091 /// Maximum number of iterations (default 100) 00092 int ntrial; 00093 00094 /// The number of iterations for in the most recent minimization 00095 int last_ntrial; 00096 00097 /** \brief If true, call the error handler if msolve() or 00098 msolve_de() does not converge (default true) 00099 */ 00100 bool err_nonconv; 00101 00102 /** \brief Zero if last call to msolve() or msolve_de() converged. 00103 00104 This is particularly useful if err_nonconv is false to test 00105 if the last call to msolve() or msolve_de() converged. 00106 */ 00107 int last_conv; 00108 00109 /// Return the type, \c "mroot". 00110 virtual const char *type() { return "mroot"; } 00111 00112 /// Solve \c func using \c x as an initial guess, returning \c x. 00113 virtual int msolve(size_t n, vec_t &x, param_t &pa, func_t &func)=0; 00114 00115 /** \brief Solve \c func with derivatives \c dfunc using \c x as 00116 an initial guess, returning \c x. 00117 00118 By default, this function just calls msolve() and ignores the 00119 last argument. 00120 */ 00121 virtual int msolve_de(size_t n, vec_t &x, param_t &pa, func_t &func, 00122 jfunc_t &dfunc) { 00123 return msolve(n,x,pa,func); 00124 } 00125 00126 /** 00127 \brief Print out iteration information. 00128 00129 Depending on the value of the variable verbose, this prints out 00130 the iteration information. If verbose=0, then no information is 00131 printed, while if verbose>1, then after each iteration, the 00132 present values of x and y are output to std::cout along with the 00133 iteration number. If verbose>=2 then each iteration waits for a 00134 character. 00135 00136 This is implemented as a template class using a new vector type 00137 because sometimes the internal vector class is distinct from 00138 the user-specified vector class (e.g. in \ref gsl_mroot_hybrids). 00139 */ 00140 template<class vec2_t, class vec3_t> 00141 int print_iter(size_t n, const vec2_t &x, const vec3_t &y, 00142 int iter, double value=0.0, double limit=0.0, 00143 std::string comment="") 00144 { 00145 if (verbose<=0) return o2scl::gsl_success; 00146 00147 char ch; 00148 00149 std::cout << comment << " Iteration: " << iter << std::endl; 00150 for(size_t i=0;i<n;i++) { 00151 std::cout.width(3); 00152 std::cout << i; 00153 if (x[i]>=0.0) { 00154 std::cout << " " << x[i]; 00155 } else { 00156 std::cout << " " << x[i]; 00157 } 00158 if (y[i]>=0.0) { 00159 std::cout << " " << y[i] << std::endl; 00160 } else { 00161 std::cout << " " << y[i] << std::endl; 00162 } 00163 } 00164 std::cout << "Val: " << value << " Lim: " << limit << std::endl; 00165 if (verbose>1) { 00166 std::cout << "Press a key and type enter to continue. "; 00167 std::cin >> ch; 00168 } 00169 00170 return o2scl::gsl_success; 00171 00172 } 00173 00174 }; 00175 00176 #ifndef DOXYGENP 00177 } 00178 #endif 00179 00180 #endif
Documentation generated with Doxygen and provided under the GNU Free Documentation License. See License Information for details.
Project hosting provided by
,
O2scl Sourceforge Project Page