Добавить в корзинуПозвонить
Найти в Дзене
avbukh

Программа для исследования процессов и динамических систем на языке Си++

Давно не оставлял попыток написать программный комплекс на языке Си++ для решения всяких разнообразных задач в нелинейной динамике, теории хаоса, статистике. Были разные попытки, которые можно сгруппировать в двух пунктах: Первое направление так и забросил, хотя для некоторых задач все еще оптимально написать небольшую специальную программу. Большие комплексы, казалось бы, удобно делать с объектно-ориентированным (ООП) подходом, но прежние попытки использования ООП заканчивались созданием неповоротливого кода, в котором ради одной дополнительной функции приходилось вносить правки в разных местах. Думаю, что все дело в том, что подход, в котором базовым классом является динамическая система, не очень удобен. Делюсь идеей структуры программы, в которой базовым классом является процесс, который может принимать в разных дочерних классах самые разные формы и включает в себя классы с разными функциями, применимыми к любым процессам. На рисунке приведена структура классов в программе на 22 ап

Давно не оставлял попыток написать программный комплекс на языке Си++ для решения всяких разнообразных задач в нелинейной динамике, теории хаоса, статистике. Были разные попытки, которые можно сгруппировать в двух пунктах:

  1. Небольшие целевые программы, которые спустя время сложно адаптировать программы под новые задачи, потому что накапливается много небольших программ в разном стиле.
  2. Большие комплексы, к которым сложно было вернуться после перерыва в использовании из-за отсутствия понятной структуры.

Первое направление так и забросил, хотя для некоторых задач все еще оптимально написать небольшую специальную программу. Большие комплексы, казалось бы, удобно делать с объектно-ориентированным (ООП) подходом, но прежние попытки использования ООП заканчивались созданием неповоротливого кода, в котором ради одной дополнительной функции приходилось вносить правки в разных местах. Думаю, что все дело в том, что подход, в котором базовым классом является динамическая система, не очень удобен.

Делюсь идеей структуры программы, в которой базовым классом является процесс, который может принимать в разных дочерних классах самые разные формы и включает в себя классы с разными функциями, применимыми к любым процессам.

Программа для исследования процессов и динамических систем на языке Си++. Сплошной линией обведены классы с определенными методами, пунктирной линией обведены классы с недоопределенными методами (абстрактные), в точках обведены классы с шаблонами. Стрелками со сплошными линиями показаны включения классов в качестве полей в другие классы. Стрелками с пунктирными линиями показаны наследования, а стрелками с линиями в точку показаны применения шаблонных классов. Класс researcher продублирован несколько раз, чтобы не заплонить стрелками всю плоскость.
Программа для исследования процессов и динамических систем на языке Си++. Сплошной линией обведены классы с определенными методами, пунктирной линией обведены классы с недоопределенными методами (абстрактные), в точках обведены классы с шаблонами. Стрелками со сплошными линиями показаны включения классов в качестве полей в другие классы. Стрелками с пунктирными линиями показаны наследования, а стрелками с линиями в точку показаны применения шаблонных классов. Класс researcher продублирован несколько раз, чтобы не заплонить стрелками всю плоскость.

На рисунке приведена структура классов в программе на 22 апреля 2026. Программа, надеюсь, будет успешно расширяться. Базовым классом является process, он влючает в себя похожие на себя классы, унаследованные от extrema, и наследуется от класса observers. Классы, унаследованные от extrema могут анализировать экстремумы процессов (события), тогда как стандартный процесс исследует все точки процесса. От класса process наследуется группа классов с разными шумовыми сигналами, которые примерно однотипно можно использовать. По другой ветке от process наследуется buffer (просто немного доопределенный process), который уже включается в класс динамическая система (ds). Сам ds тоже наследуется от process, головным процессом в нем является амплитуда фазового состояния в фазовом пространстве системы.

Что мне нравится: в такой структуре очень хорошо разделены функции в классах, можно переносить методы в более низкоуровненые классы после тестирования в высокоуровенвых, можно создавать абстрактные классы с требованием определить недоппределенные методы. Все это удобно, но что мне не очень нравится: методы получения информации из классов (гетеры) прячутся очень глубоко, если это всюдуприменимые методы. В итоге приходится "пробрасывать" гетеры через всю иерархию классов до используемого высокоуровневого класса. Это, кажется, слабое место, которое я не придумал, как улучшить. Есть, правда, вариант немного уменьшить количество гетеров, вызывающих подобных себе в базовых классах, за счет открытия доступа к некоторым полям классов напрямую. Но это не очень хорошая идея, раз уж используется ООП.

Код начал выкладывать на гитхаб, используйте и редактируйте, если интересно: https://github.com/buhandrey/ProcessSimulator.

Программу пробовал разрабатывать, консультируясь с ИИ, но идея оттуда со структурой классов мне сразу не понравилась, потому что я не смог раньше подобным способом создать гибкую программу. Идея с классом process пока мне кажется наилучшей.

Наука
7 млн интересуются