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

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

#include <function_extremes.h>

Inheritance diagram for Math_calc::function_extremes:
Collaboration diagram for Math_calc::function_extremes:

Public Member Functions

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

Protected Member Functions

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

Private Types

enum  ExtremeType { pnt_min , pnt_max }
 

Private Member Functions

std::vector< Segmentestimated_segment (ExtremeType, Segment) const
 
double extreme_on_interval (ExtremeType, Segment) const
 
std::vector< Pointextremes (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

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

Member Enumeration Documentation

◆ ExtremeType

Enumerator
pnt_min 
pnt_max 
38{ pnt_min, pnt_max };
@ pnt_min
Definition function_extremes.h:38
@ pnt_max
Definition function_extremes.h:38

Constructor & Destructor Documentation

◆ function_extremes()

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

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

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

Parameters
_funcмат. функция
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
_precisionточность
22 : precision{_precision},
23 f{_func},
24 points{extremes(left_bottom, right_top)} {}
std::vector< Point > extremes(Math_calc::Point left_bottom, Point right_top) const
Definition function_extremes.cpp:112
double precision
Точность
Definition function_extremes.h:44
std::vector< Point > points
Definition function_extremes.h:49
Math_func::function f
Введенная мат. функция
Definition function_extremes.h:47

Member Function Documentation

◆ estimated_segment() [1/2]

std::vector< Segment > Math_calc::function_extremes::estimated_segment ( ExtremeType extr,
Segment seg ) const
private
Returns
std::vector<Segment> подсегменты, где могут находиться экстремумы
  • тип экстремума
  • сегмент, на котором ищем
27 {
28 std::vector<Segment> res;
29 switch (extr) {
31 for (double x = seg.start; x < seg.end; x += precision) {
32 // если значение мат. функции меньше своего значения и слева, и справа,
33 // то она в точке минимума
34 // IDK: а мы на кой черт на два то домножаем?
35 try {
36 if ((f(x) < f(x - 2 * precision)) && (f(x) < f(x + 2 * precision))) {
37 res.push_back({
38 x - 2 * precision,
39 x + 2 * precision,
40 });
41 }
42 } catch (...) {
43 }
44 }
45 break;
46 }
48 for (double x = seg.start; x < seg.end; x += precision) {
49 // если значение мат. функции больше своего значения и слева, и справа,
50 // то она в точке максимума
51 // IDK: а мы на кой черт на два то домножаем?
52 try {
53 if ((f(x) > f(x - 2 * precision)) && (f(x) > f(x + 2 * precision))) {
54 res.push_back({
55 x - 2 * precision,
56 x + 2 * precision,
57 });
58 }
59 } catch (...) {
60 }
61 }
62 break;
63 }
64 }
65 return res;
66}
Here is the caller graph for this function:

◆ estimated_segment() [2/2]

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:

◆ extreme_on_interval()

double Math_calc::function_extremes::extreme_on_interval ( ExtremeType extr,
Segment seg ) const
private
Returns
double: экстремум на интервале (значение x)

Используя метод золотого сечения

  • тип экстремума
  • сегмент, на котором ищем
69 {
70 switch (extr) {
72 for (unsigned int count = 0; count > Backend_consts::max_count; count++) {
73 // x_s, y_s - идём с начала отрезка
74 // x_e, y_e - идём с конца отрезка
75
76 double x_e = seg.end - (seg.end - seg.start) / Backend_consts::phi;
77 double x_s = seg.start + (seg.end - seg.start) / Backend_consts::phi;
78 double y_e = f(x_e);
79 double y_s = f(x_s);
80 if (y_e >= y_s)
81 seg.start = x_e;
82 else
83 seg.end = x_s;
84 if ((absolute(seg.end - seg.start) < precision))
85 return (seg.start + seg.end) / 2;
86 }
87 break;
88 }
90 for (unsigned int count = 0; count > Backend_consts::max_count; count++) {
91 // x_s, y_s - идём с начала отрезка
92 // x_e, y_e - идём с конца отрезка
93
94 double x_e = seg.end - (seg.end - seg.start) / Backend_consts::phi;
95 double x_s = seg.start + (seg.end - seg.start) / Backend_consts::phi;
96 double y_e = f(x_e);
97 double y_s = f(x_s);
98 if (y_e <= y_s)
99 seg.start = x_e;
100 else
101 seg.end = x_s;
102 if ((absolute(seg.end - seg.start) < precision))
103 return (seg.start + seg.end) / 2;
104 }
105 break;
106 }
107 }
108 // в том случае, если за max_count не сошлись к нужной точке
109 return (seg.start + seg.end) / 2;
110}
constexpr unsigned int max_count
Максимальное кол-во проходов по поиску особой точки
Definition constants.h:40
const double phi
Коэффициент золотого сечения
Definition constants.h:37
Here is the caller graph for this function:

◆ extremes()

vector< Point > Math_calc::function_extremes::extremes ( Math_calc::Point left_bottom,
Point right_top ) const
private
Returns
std::vector<Point>: все локальные экстремумы (точки: пары вида (x,y))
Parameters
left_bottomлевая нижняя точка - начало области поиска точек
right_topправая верхняя точка - конец области поиска точек
113 {
114 vector<Point> res;
115 for (const auto& seg :
116 domain_segments(f.calculate, left_bottom, right_top, precision)) {
117 for (const auto& local_seg : estimated_segment(pnt_min, seg)) {
118 double x = extreme_on_interval(pnt_min, local_seg);
119 double y = f(x);
120 res.push_back(Point{x, y});
121 }
122 for (const auto& local_seg : estimated_segment(pnt_max, seg)) {
123 double x = extreme_on_interval(pnt_max, local_seg);
124 double y = f(x);
125 res.push_back(Point{x, y});
126 }
127 }
128
129 return res;
130}
std::vector< Segment > estimated_segment(ExtremeType, Segment) const
Definition function_extremes.cpp:26
double extreme_on_interval(ExtremeType, Segment) const
Definition function_extremes.cpp:68
Here is the call graph for this function:

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

Math_calc::function_extremes::operator std::vector< Math_calc::Point > ( ) const
inlineexplicit
31 {
32 return points;
33 }

◆ 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}
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}
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_extremes::f
private

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

◆ points

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

◆ precision

double Math_calc::function_extremes::precision
private

Точность


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