solve.h
上传用户:center1979
上传日期:2022-07-26
资源大小:50633k
文件大小:2k
源码类别:

OpenGL

开发平台:

Visual C++

  1. // solve.h
  2. // 
  3. // Copyright (C) 2001, Chris Laurel <claurel@shatters.net>
  4. //
  5. // This program is free software; you can redistribute it and/or
  6. // modify it under the terms of the GNU General Public License
  7. // as published by the Free Software Foundation; either version 2
  8. // of the License, or (at your option) any later version.
  9. #include <utility>
  10. // Solve a function using the bisection method.  Returns a pair
  11. // with the solution as the first element and the error as the second.
  12. template<class T, class F> std::pair<T, T> solve_bisection(F f,
  13.                                                            T lower, T upper,
  14.                                                            T err,
  15.                                                            int maxIter = 100)
  16. {
  17.     T x = 0.0;
  18.     for (int i = 0; i < maxIter; i++)
  19.     {
  20.         x = (lower + upper) * (T) 0.5;
  21.         if (upper - lower < 2 * err)
  22.             break;
  23.         T y = f(x);
  24.         if (y < 0)
  25.             lower = x;
  26.         else
  27.             upper = x;
  28.     }
  29.     return std::make_pair(x, (upper - lower) / 2);
  30. }
  31. // Solve using iteration; terminate when error is below err or the maximum
  32. // number of iterations is reached.
  33. template<class T, class F> std::pair<T, T> solve_iteration(F f,
  34.                                                            T x0,
  35.                                                            T err,
  36.                                                            int maxIter = 100)
  37. {
  38.     T x = 0;
  39.     T x2 = x0;
  40.     for (int i = 0; i < maxIter; i++)
  41.     {
  42.         x = x2;
  43.         x2 = f(x);
  44.         if (abs(x2 - x) < err)
  45.             return std::make_pair(x2, x2 - x);
  46.     }
  47.     return std::make_pair(x2, x2 - x);
  48. }
  49. // Solve using iteration method and a fixed number of steps.
  50. template<class T, class F> std::pair<T, T> solve_iteration_fixed(F f,
  51.                                                                  T x0,
  52.                                                                  int maxIter)
  53. {
  54.     T x = 0;
  55.     T x2 = x0;
  56.     for (int i = 0; i < maxIter; i++)
  57.     {
  58.         x = x2;
  59.         x2 = f(x);
  60.     }
  61.     return std::make_pair(x2, x2 - x);
  62. }