Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

61 рядки
1.3 KiB

  1. //
  2. // LolRemez - Remez algorithm implementation
  3. //
  4. // Copyright © 2005—2015 Sam Hocevar <sam@hocevar.net>
  5. //
  6. // This program is free software. It comes without any warranty, to
  7. // the extent permitted by applicable law. You can redistribute it
  8. // and/or modify it under the terms of the Do What the Fuck You Want
  9. // to Public License, Version 2, as published by the WTFPL Task Force.
  10. // See http://www.wtfpl.net/ for more details.
  11. //
  12. #pragma once
  13. //
  14. // The remez_solver class
  15. // ----------------------
  16. //
  17. #include <cstdio>
  18. #include "expression.h"
  19. class remez_solver
  20. {
  21. public:
  22. remez_solver(int order, int decimals);
  23. void run(lol::real a, lol::real b,
  24. char const *func, char const *weight = nullptr);
  25. private:
  26. void remez_init();
  27. void remez_step();
  28. void find_zeroes();
  29. void find_extrema();
  30. void print_poly();
  31. lol::real eval_estimate(lol::real const &x);
  32. lol::real eval_func(lol::real const &x);
  33. lol::real eval_weight(lol::real const &x);
  34. lol::real eval_error(lol::real const &x);
  35. private:
  36. /* User-defined parameters */
  37. expression m_func, m_weight;
  38. int m_order, m_decimals;
  39. bool m_has_weight;
  40. /* Solver state */
  41. lol::polynomial<lol::real> m_estimate;
  42. lol::array<lol::real> m_zeroes;
  43. lol::array<lol::real> m_control;
  44. lol::real m_k1, m_k2, m_epsilon, m_error;
  45. };