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

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

#include <function_crosses.h>

Inheritance diagram for Math_calc::function_crosses:
Collaboration diagram for Math_calc::function_crosses:

Public Member Functions

 function_crosses (std::pair< Math_func::function, Math_func::function > funcs, Math_calc::Point left_bottom, Math_calc::Point right_top, double _precision)
 Инициализирует новый экземпляр function_crosses.
 
 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< Pointcrosses (Math_calc::Point left_bottom, Point right_top) const
 Считает все пересечения двух мат. функций
 
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

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

Constructor & Destructor Documentation

◆ function_crosses()

Math_calc::function_crosses::function_crosses ( std::pair< Math_func::function, Math_func::function > funcs,
Math_calc::Point left_bottom,
Math_calc::Point right_top,
double _precision )

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

Поиск точек происходит на прямоугольной области, края которой - точки

Parameters
funcsпара мат. функций
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
_precisionточность
22 : function_roots{Math_func::function{funcs.first.get_func_str() + "-(" +
23 funcs.second.get_func_str() + ")"},
24 left_bottom, right_top, _precision},
25 precision{_precision},
26 f{funcs.first},
27 points{crosses(left_bottom, right_top)} {}
std::vector< Point > crosses(Math_calc::Point left_bottom, Point right_top) const
Считает все пересечения двух мат. функций
Definition function_crosses.cpp:29
double precision
Точность
Definition function_crosses.h:44
std::vector< Point > points
Definition function_crosses.h:50
Math_func::function f
Одна из введенных мат. функций
Definition function_crosses.h:48
Математическая функция
Definition function.h:14
std::string get_func_str() const
Возвращает значение мат. функции в виде строки
Definition function.h:59

Member Function Documentation

◆ crosses()

vector< Point > Math_calc::function_crosses::crosses ( Math_calc::Point left_bottom,
Point right_top ) const
private

Считает все пересечения двух мат. функций

Parameters
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
Returns
std::vector<Point>: точки пересечения двух мат. функций
30 {
31 vector<Point> res;
32 for (const auto& seg :
33 domain_segments(f.calculate, left_bottom, right_top, precision)) {
34 for (const auto& local_seg : estimated_segment(seg)) {
35 double x = function_roots::root_on_interval(local_seg);
36 double y = f(x);
37 // отличие от нахождения корней заключается в том,
38 // что теперь нам не нужна проверка на приближенность нулю
39 res.push_back(Point{x, y});
40 }
41 }
42 return res;
43}
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:

◆ estimated_segment()

vector< Segment > Math_calc::function_roots::estimated_segment ( Segment seg) const
protectedinherited
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}
double precision
Точность
Definition function_roots.h:63
Math_func::function f
Введенная мат. функция
Definition function_roots.h:66
Here is the caller graph for this function:

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

Math_calc::function_crosses::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
protectedinherited
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
privateinherited
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}
Here is the call graph for this function:

Member Data Documentation

◆ f

Math_func::function Math_calc::function_crosses::f
private

Одна из введенных мат. функций

◆ points

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

◆ precision

double Math_calc::function_crosses::precision
private

Точность


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