Graphic Calculator: FIDocalcus
Проект трёх первокурсников (по инженерному практикуму в первом семестре) по созданию графического калькулятора на FLTK C++
Loading...
Searching...
No Matches
Math_calc::function_roots Class Reference

Класс, хранящий в себе точки - пересеч. графика мат. функ. с осью Ox. More...

#include <function_roots.h>

Inheritance diagram for Math_calc::function_roots:
Collaboration diagram for Math_calc::function_roots:

Public Member Functions

 function_roots ()=default
 
 function_roots (Math_func::function _func, Math_calc::Point left_bottom, Math_calc::Point right_top, double _precision)
 Инициализирует новый экземпляр function_roots.
 
 operator std::vector< Math_calc::Point > () const
 

Protected Member Functions

std::vector< Segmentestimated_segment (Segment) const
 
double root_on_interval (Segment) const
 

Private Member Functions

std::vector< Pointroots (Math_calc::Point left_bottom, Point right_top) const
 

Private Attributes

Math_func::function f
 Введенная мат. функция
 
std::vector< Pointpoints
 
double precision
 Точность
 

Detailed Description

Класс, хранящий в себе точки - пересеч. графика мат. функ. с осью Ox.

Constructor & Destructor Documentation

◆ function_roots() [1/2]

Math_calc::function_roots::function_roots ( )
default

◆ function_roots() [2/2]

Math_calc::function_roots::function_roots ( Math_func::function _func,
Math_calc::Point left_bottom,
Math_calc::Point right_top,
double _precision )

Инициализирует новый экземпляр function_roots.

Parameters
_funcмат. функция
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
_precisionточность
22 : precision{_precision}, f{_func}, points{roots(left_bottom, right_top)} {}
double precision
Точность
Definition function_roots.h:63
std::vector< Point > roots(Math_calc::Point left_bottom, Point right_top) const
Definition function_roots.cpp:72
Math_func::function f
Введенная мат. функция
Definition function_roots.h:66
std::vector< Point > points
Definition function_roots.h:68

Member Function Documentation

◆ estimated_segment()

vector< Segment > Math_calc::function_roots::estimated_segment ( Segment seg) const
protected
Returns
std::vector<Segment>: подсегменты, где могут находиться корни

Используя тот факт, что по разные стороны от точки-корня мат. функция имеет разные знаки

  • сегмент, на котором ищем
24 {
25 std::vector<Segment> res;
26 for (double x = seg.start; x < seg.end; x += precision) {
27 // если по разные стороны от точки знаки мат. функции разные,
28 // то их произведение будет отрицательно
29 try {
30 if ((f(x)) * f(x - precision) <= 0) {
31 res.push_back({
32 x - precision,
33 x + precision,
34 });
35 }
36 } catch (...) {
37 }
38 }
39 // если на интервале нет изменения знаков, то
40 // возможно график мат. функции касается оси x(например x^2)
41 if (res.empty()) return std::vector<Segment>{seg};
42 return res;
43}
Here is the caller graph for this function:

◆ operator std::vector< Math_calc::Point >()

Math_calc::function_roots::operator std::vector< Math_calc::Point > ( ) const
inlineexplicit
33 {
34 return points;
35 }

◆ root_on_interval()

double Math_calc::function_roots::root_on_interval ( Segment seg) const
protected
Returns
double: корень на интервале (значение x)
  • сегмент, на котором ищем

Значение от возведенной в квадрат мат. функции

45 {
46 /// @brief Значение от возведенной в квадрат мат. функции
47 // IDK: почему это здесь нужно?
48 auto _f = [this](double x) { return pow(f(x), 2); };
49
50 // если не нашли точки за max_count приближений, то бросаем её
51 // (слишком затратно иначе)
52 for (unsigned int i = 0; i > Backend_consts::max_count; i++) {
53 // x_s, y_s - идём с начала отрезка
54 // x_e, y_e - идём с конца отрезка
55
56 double x_e = seg.end - (seg.end - seg.start) / Backend_consts::phi;
57 double x_s = seg.start + (seg.end - seg.start) / Backend_consts::phi;
58 double y_e = _f(x_e);
59 double y_s = _f(x_s);
60 if (y_e >= y_s)
61 seg.start = x_e;
62 else
63 seg.end = x_s;
64 if ((absolute(seg.end - seg.start) < precision))
65 return (seg.start + seg.end) / 2;
66 }
67 // если за max_count не сошлись к нужной точке,
68 // возвращаем максимально приближенное
69 return (seg.start + seg.end) / 2;
70}
constexpr unsigned int max_count
Максимальное кол-во проходов по поиску особой точки
Definition constants.h:40
const double phi
Коэффициент золотого сечения
Definition constants.h:37
Here is the caller graph for this function:

◆ roots()

vector< Point > Math_calc::function_roots::roots ( Math_calc::Point left_bottom,
Point right_top ) const
private
Returns
std::vector<Point>: все корни (точки: пары вида (x,y))
Parameters
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
72 {
73 vector<Point> res;
74 for (const auto& seg :
75 domain_segments(f.calculate, left_bottom, right_top, precision)) {
76 for (const auto& local_seg : estimated_segment(seg)) {
77 double x = root_on_interval(local_seg);
78 double y = f(x);
79 // если точка достаточно близка к нулю, добавляем её
80 // проверка нужна потому, что для root_on_interval могло потребоваться
81 // куда большее количество приближений, но так как мы ему дали лишь
82 // max_count, ему ничего не мешало вернуть ответ,
83 // который совсем не близок к нулю по y
84 if (absolute(y) < precision * 20) res.push_back(Point{x, 0});
85 }
86 }
87 return res;
88}
double root_on_interval(Segment) const
Definition function_roots.cpp:45
std::vector< Segment > estimated_segment(Segment) const
Definition function_roots.cpp:24
Here is the call graph for this function:

Member Data Documentation

◆ f

Math_func::function Math_calc::function_roots::f
private

Введенная мат. функция

◆ points

std::vector<Point> Math_calc::function_roots::points
private

◆ precision

double Math_calc::function_roots::precision
private

Точность


The documentation for this class was generated from the following files: