From e954044c58435e762b5d915ec4c85f23cd3da5ae Mon Sep 17 00:00:00 2001 From: peacewxrld Date: Tue, 16 Dec 2025 11:25:42 +0300 Subject: [PATCH 1/5] fix yanchuk --- trunk/as06624/task_01/src/CMakeLists.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/as06624/task_01/src/CMakeLists.txt b/trunk/as06624/task_01/src/CMakeLists.txt index ccf1895a..16ae3431 100644 --- a/trunk/as06624/task_01/src/CMakeLists.txt +++ b/trunk/as06624/task_01/src/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.5) -project(tmau) +project(tmau_yanchuk) -add_executable (TMAU1 tmau.cpp) \ No newline at end of file +add_executable (tmau_yanchuk tmau.cpp) \ No newline at end of file From 0c91599e5517dc2885610ab48107078946285401 Mon Sep 17 00:00:00 2001 From: peacewxrld Date: Tue, 23 Dec 2025 22:51:05 +0300 Subject: [PATCH 2/5] lab1 --- trunk/as06613/task_01/doc/README.md | 46 ++++++++++++ trunk/as06613/task_01/src/task1.cpp | 107 ++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+) create mode 100644 trunk/as06613/task_01/doc/README.md create mode 100644 trunk/as06613/task_01/src/task1.cpp diff --git a/trunk/as06613/task_01/doc/README.md b/trunk/as06613/task_01/doc/README.md new file mode 100644 index 00000000..f87fc0b1 --- /dev/null +++ b/trunk/as06613/task_01/doc/README.md @@ -0,0 +1,46 @@ +

Министерство образования Республики Беларусь

+

Учреждение образования

+

“Брестский Государственный Технический университет”

+

Кафедра ИИТ

+






+

Лабораторная работа №1

+

По дисциплине “Теория и методы автоматического управления”

+

Тема: “Моделирование управляемого объекта”

+




+

Выполнил:

+

Студент 3 курса

+

Группы АС-66

+

Малич И.С.

+

Проверил:

+

Иванюк Д.С.

+







+

Брест 2025

+ +--- +## Task 1. Modeling controlled object + +В результате выполнения программы получаем вывод линейного и нелинейного изменения температуры по соответствующим входным данным. +ЛИНЕЙНАЯ МОДЕЛЬ + 0 - 20.0 + 1 10.0 18.0 + 2 15.0 17.4 + 3 20.0 17.9 + 4 25.0 19.3 + 5 30.0 21.5 + 6 25.0 22.2 + 7 20.0 21.7 + 8 15.0 20.4 + 9 10.0 18.3 + 10 5.0 15.7 +НЕЛИНЕЙНАЯ МОДЕЛЬ +0 5.0 20.0 + 1 10.000 13.102 + 2 15.000 9.617 + 3 20.000 11.080 + 4 25.000 14.423 + 5 30.000 17.855 + 6 25.000 17.820 + 7 20.000 15.272 + 8 15.000 12.107 + 9 10.000 9.207 + 10 5.000 6.425 \ No newline at end of file diff --git a/trunk/as06613/task_01/src/task1.cpp b/trunk/as06613/task_01/src/task1.cpp new file mode 100644 index 00000000..29e60d55 --- /dev/null +++ b/trunk/as06613/task_01/src/task1.cpp @@ -0,0 +1,107 @@ +#include +#include +#include +#include + +class TemperatureModel { +private: + double a; + double b; + double c; + double d; + double y_prev = 0; + double y_prev2 = 0; + double u_prev = 0; + bool is_nonlinear; + +public: + + TemperatureModel(double a_val, double b_val) + : a(a_val), b(b_val), c(0), d(0), is_nonlinear(false) { + } + + + TemperatureModel(double a_val, double b_val, double c_val, double d_val) + : a(a_val), b(b_val), c(c_val), d(d_val), is_nonlinear(true) { + } + + void setInitialConditions(double y0, double y1 = 0, double u0 = 0) { + y_prev = y0; + y_prev2 = y1; + u_prev = u0; + } + + double calculateNext(double u_current) { + double y_next; + + if (is_nonlinear) { + + y_next = a * y_prev - b * y_prev2 * y_prev2 + c * u_current + d * sin(u_prev); + } + else { + + y_next = a * y_prev + b * u_current; + } + + + y_prev2 = y_prev; + y_prev = y_next; + u_prev = u_current; + + return y_next; + } + + double getCurrentTemperature() const { + return y_prev; + } +}; + +void testLinearModel() { + std::cout << "=== LINEAR MODEL TEST ===" << std::endl; + + double a = 0.8; + double b = 0.2; + + TemperatureModel model(a, b); + model.setInitialConditions(20.0); + + std::vector control_inputs = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; + + std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; + std::cout << "0\t-\t20.0" << std::endl; + + for (size_t t = 0; t < control_inputs.size(); ++t) { + double u = control_inputs[t]; + double y = model.calculateNext(u); + std::cout << std::fixed << std::setprecision(1) << std::setw(4) << t + 1 << std::setw(8) << u << std::setw(12) << y << std::endl; + } +} + +void testNonlinearModel() { + std::cout << "\n=== NONLINEAR MODEL TEST ===" << std::endl; + + double a = 0.7; + double b = 0.01; + double c = 0.3; + double d = 0.1; + + TemperatureModel model(a, b, c, d); + model.setInitialConditions(20.0, 19.5, 5.0); + + std::vector control_inputs = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; + + std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; + std::cout << "0\t5.0\t20.0" << std::endl; + + for (size_t t = 0; t < control_inputs.size(); ++t) { + double u = control_inputs[t]; + double y = model.calculateNext(u); + std::cout << std::fixed << std::setprecision(3) << std::setw(4) << t + 1 << std::setw(8) << u << std::setw(12) << y << std::endl; + } +} + +int main() { + testLinearModel(); + testNonlinearModel(); + return 0; +} \ No newline at end of file From cb2133dbb0f56cf514d7938e50f95f5ad838a47b Mon Sep 17 00:00:00 2001 From: peacewxrld Date: Tue, 23 Dec 2025 23:51:49 +0300 Subject: [PATCH 3/5] ayo bro --- trunk/as06613/task_01/src/CMakeLists.txt | 12 ++++ .../task_01/src/{task1.cpp => main.cpp} | 71 +++++++------------ 2 files changed, 39 insertions(+), 44 deletions(-) create mode 100644 trunk/as06613/task_01/src/CMakeLists.txt rename trunk/as06613/task_01/src/{task1.cpp => main.cpp} (52%) diff --git a/trunk/as06613/task_01/src/CMakeLists.txt b/trunk/as06613/task_01/src/CMakeLists.txt new file mode 100644 index 00000000..8600cedb --- /dev/null +++ b/trunk/as06613/task_01/src/CMakeLists.txt @@ -0,0 +1,12 @@ +cmake_minimum_required(VERSION 3.10) + +project(TemperatureModelSimulation LANGUAGES CXX) + +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_CXX_STANDARD_REQUIRED ON) + +add_executable(TemperatureModelSimulation main.cpp) + +set_target_properties(TemperatureModelSimulation PROPERTIES + RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} +) \ No newline at end of file diff --git a/trunk/as06613/task_01/src/task1.cpp b/trunk/as06613/task_01/src/main.cpp similarity index 52% rename from trunk/as06613/task_01/src/task1.cpp rename to trunk/as06613/task_01/src/main.cpp index 29e60d55..e00d5d31 100644 --- a/trunk/as06613/task_01/src/task1.cpp +++ b/trunk/as06613/task_01/src/main.cpp @@ -2,6 +2,8 @@ #include #include #include +#include +#include class TemperatureModel { private: @@ -15,12 +17,10 @@ class TemperatureModel { bool is_nonlinear; public: - TemperatureModel(double a_val, double b_val) : a(a_val), b(b_val), c(0), d(0), is_nonlinear(false) { } - TemperatureModel(double a_val, double b_val, double c_val, double d_val) : a(a_val), b(b_val), c(c_val), d(d_val), is_nonlinear(true) { } @@ -35,15 +35,11 @@ class TemperatureModel { double y_next; if (is_nonlinear) { - y_next = a * y_prev - b * y_prev2 * y_prev2 + c * u_current + d * sin(u_prev); - } - else { - + } else { y_next = a * y_prev + b * u_current; } - y_prev2 = y_prev; y_prev = y_next; u_prev = u_current; @@ -56,52 +52,39 @@ class TemperatureModel { } }; -void testLinearModel() { - std::cout << "=== LINEAR MODEL TEST ===" << std::endl; - - double a = 0.8; - double b = 0.2; - - TemperatureModel model(a, b); - model.setInitialConditions(20.0); - - std::vector control_inputs = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; - +void runSimulation(TemperatureModel& model, const std::vector& control_inputs, int steps, double timestep) { std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; - std::cout << "0\t-\t20.0" << std::endl; - - for (size_t t = 0; t < control_inputs.size(); ++t) { - double u = control_inputs[t]; + + for (int t = 0; t < steps; ++t) { + double u = (t < control_inputs.size()) ? control_inputs[t] : 0; double y = model.calculateNext(u); - std::cout << std::fixed << std::setprecision(1) << std::setw(4) << t + 1 << std::setw(8) << u << std::setw(12) << y << std::endl; + std::cout << std::fixed << std::setprecision(1) << std::setw(4) << t << std::setw(8) << u << std::setw(12) << y << std::endl; + + std::this_thread::sleep_for(std::chrono::milliseconds(int(timestep * 1000))); } } -void testNonlinearModel() { - std::cout << "\n=== NONLINEAR MODEL TEST ===" << std::endl; - - double a = 0.7; - double b = 0.01; - double c = 0.3; +int main() { + double a_linear = 0.8; + double b_linear = 0.2; + double a_nonlinear = 0.7; + double b_nonlinear = 0.01; + double c = 0.3; double d = 0.1; - TemperatureModel model(a, b, c, d); - model.setInitialConditions(20.0, 19.5, 5.0); - - std::vector control_inputs = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; + TemperatureModel linear_model(a_linear, b_linear); + linear_model.setInitialConditions(20.0); + + std::vector control_inputs_linear = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; + runSimulation(linear_model, control_inputs_linear, control_inputs_linear.size(), 1.0); - std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; - std::cout << "0\t5.0\t20.0" << std::endl; + std::cout << "\n=== NONLINEAR MODEL TEST ===" << std::endl; - for (size_t t = 0; t < control_inputs.size(); ++t) { - double u = control_inputs[t]; - double y = model.calculateNext(u); - std::cout << std::fixed << std::setprecision(3) << std::setw(4) << t + 1 << std::setw(8) << u << std::setw(12) << y << std::endl; - } -} + TemperatureModel nonlinear_model(a_nonlinear, b_nonlinear, c, d); + nonlinear_model.setInitialConditions(20.0, 19.5, 5.0); + + std::vector control_inputs_nonlinear = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; + runSimulation(nonlinear_model, control_inputs_nonlinear, control_inputs_nonlinear.size(), 1.0); -int main() { - testLinearModel(); - testNonlinearModel(); return 0; } \ No newline at end of file From c4751e2ae256df701f54cce18ceaac3862961365 Mon Sep 17 00:00:00 2001 From: peacewxrld Date: Wed, 24 Dec 2025 00:05:49 +0300 Subject: [PATCH 4/5] ayo bro --- trunk/as06613/task_01/src/CMakeLists.txt | 6 +-- trunk/as06613/task_01/src/main.cpp | 54 ++++++++++++------------ 2 files changed, 31 insertions(+), 29 deletions(-) diff --git a/trunk/as06613/task_01/src/CMakeLists.txt b/trunk/as06613/task_01/src/CMakeLists.txt index 8600cedb..77da8ac8 100644 --- a/trunk/as06613/task_01/src/CMakeLists.txt +++ b/trunk/as06613/task_01/src/CMakeLists.txt @@ -1,12 +1,12 @@ cmake_minimum_required(VERSION 3.10) -project(TemperatureModelSimulation LANGUAGES CXX) +project(TemperatureModelWithInterface LANGUAGES CXX) set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD_REQUIRED ON) -add_executable(TemperatureModelSimulation main.cpp) +add_executable(TemperatureModelWithInterface main.cpp) -set_target_properties(TemperatureModelSimulation PROPERTIES +set_target_properties(TemperatureModelWithInterface PROPERTIES RUNTIME_OUTPUT_DIRECTORY ${CMAKE_BINARY_DIR} ) \ No newline at end of file diff --git a/trunk/as06613/task_01/src/main.cpp b/trunk/as06613/task_01/src/main.cpp index e00d5d31..b42d3b47 100644 --- a/trunk/as06613/task_01/src/main.cpp +++ b/trunk/as06613/task_01/src/main.cpp @@ -1,11 +1,19 @@ #include #include #include -#include +#include #include #include -class TemperatureModel { +class ITemperatureModel { +public: + virtual void setInitialConditions(double y0, double y1 = 0, double u0 = 0) = 0; + virtual double calculateNext(double u_current) = 0; + virtual double getCurrentTemperature() const = 0; + virtual ~ITemperatureModel() = default; +}; + +class TemperatureModel : public ITemperatureModel { private: double a; double b; @@ -17,28 +25,20 @@ class TemperatureModel { bool is_nonlinear; public: - TemperatureModel(double a_val, double b_val) - : a(a_val), b(b_val), c(0), d(0), is_nonlinear(false) { - } - - TemperatureModel(double a_val, double b_val, double c_val, double d_val) - : a(a_val), b(b_val), c(c_val), d(d_val), is_nonlinear(true) { + TemperatureModel(double a_val, double b_val, double c_val = 0, double d_val = 0) + : a(a_val), b(b_val), c(c_val), d(d_val), is_nonlinear(c_val != 0 || d_val != 0) { } - void setInitialConditions(double y0, double y1 = 0, double u0 = 0) { + void setInitialConditions(double y0, double y1 = 0, double u0 = 0) override { y_prev = y0; y_prev2 = y1; u_prev = u0; } - double calculateNext(double u_current) { - double y_next; - - if (is_nonlinear) { - y_next = a * y_prev - b * y_prev2 * y_prev2 + c * u_current + d * sin(u_prev); - } else { - y_next = a * y_prev + b * u_current; - } + double calculateNext(double u_current) override { + double y_next = is_nonlinear ? + a * y_prev - b * y_prev2 * y_prev2 + c * u_current + d * sin(u_prev) : + a * y_prev + b * u_current; y_prev2 = y_prev; y_prev = y_next; @@ -47,14 +47,14 @@ class TemperatureModel { return y_next; } - double getCurrentTemperature() const { + double getCurrentTemperature() const override { return y_prev; } }; -void runSimulation(TemperatureModel& model, const std::vector& control_inputs, int steps, double timestep) { +void runSimulation(ITemperatureModel& model, const std::vector& control_inputs, int steps, double timestep) { std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; - + for (int t = 0; t < steps; ++t) { double u = (t < control_inputs.size()) ? control_inputs[t] : 0; double y = model.calculateNext(u); @@ -65,24 +65,26 @@ void runSimulation(TemperatureModel& model, const std::vector& control_i } int main() { - double a_linear = 0.8; + double a_linear = 0.8; double b_linear = 0.2; - double a_nonlinear = 0.7; - double b_nonlinear = 0.01; - double c = 0.3; + double a_nonlinear = 0.7; + double b_nonlinear = 0.01; + double c = 0.3; double d = 0.1; + // Линейная модель TemperatureModel linear_model(a_linear, b_linear); linear_model.setInitialConditions(20.0); - + std::vector control_inputs_linear = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; runSimulation(linear_model, control_inputs_linear, control_inputs_linear.size(), 1.0); std::cout << "\n=== NONLINEAR MODEL TEST ===" << std::endl; + // Нелинейная модель TemperatureModel nonlinear_model(a_nonlinear, b_nonlinear, c, d); nonlinear_model.setInitialConditions(20.0, 19.5, 5.0); - + std::vector control_inputs_nonlinear = { 10, 15, 20, 25, 30, 25, 20, 15, 10, 5 }; runSimulation(nonlinear_model, control_inputs_nonlinear, control_inputs_nonlinear.size(), 1.0); From a33ead9dd5f812cb528a3a7470194755fe6d120c Mon Sep 17 00:00:00 2001 From: peacewxrld Date: Wed, 24 Dec 2025 00:22:39 +0300 Subject: [PATCH 5/5] ayo bro --- trunk/as06613/task_01/src/main.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/trunk/as06613/task_01/src/main.cpp b/trunk/as06613/task_01/src/main.cpp index b42d3b47..ff7af3b3 100644 --- a/trunk/as06613/task_01/src/main.cpp +++ b/trunk/as06613/task_01/src/main.cpp @@ -52,10 +52,10 @@ class TemperatureModel : public ITemperatureModel { } }; -void runSimulation(ITemperatureModel& model, const std::vector& control_inputs, int steps, double timestep) { +void runSimulation(ITemperatureModel& model, const std::vector& control_inputs, std::size_t steps, double timestep) { std::cout << std::setw(4) << "Time" << std::setw(8) << "Control" << std::setw(12) << "Temperature" << std::endl; - for (int t = 0; t < steps; ++t) { + for (std::size_t t = 0; t < steps; ++t) { double u = (t < control_inputs.size()) ? control_inputs[t] : 0; double y = model.calculateNext(u); std::cout << std::fixed << std::setprecision(1) << std::setw(4) << t << std::setw(8) << u << std::setw(12) << y << std::endl;