forked from brstu/TMAU-2024
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
28 changed files
with
807 additions
and
7 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
# Отчёт | ||
|
||
## Об отчёте | ||
|
||
Данный отчет содержит информацию о программе, моделирующей ПИД-регулятор. В качестве объекта управления используется математическая модель, а также классы линейной и нелинейной природы. | ||
## Классы | ||
|
||
### Класс `MathematicalModel` | ||
|
||
Это абстрактный базовый класс для математических моделей. Он включает виртуальную функцию calcOutput, которую необходимо реализовать в производных классах. Эта функция принимает текущий выход, предыдущий выход и входной сигнал, возвращая вычисленную модель результата. | ||
|
||
### Класс `LinearModel` | ||
|
||
Класс LinModel, который наследует MathModel, представляет собой линейную модель. Он включает два коэффициента: coefficientAи coefficientB, используется для вычисления выходного значения формулы coefficientA * currentOutput + coefficientB * input. | ||
|
||
### Класс `NonLinearModel` | ||
|
||
представляет нелинейную математическую модель. Данный класс наследуется от абстрактного класса MathModel и реализует его виртуальную функцию calcOutput. Имеет четыре приватных переменных - coefficientA, coefficientB, coefficientC и coefficientD, которые используются в формуле для вычисления выходного значения модели. Конструктор класса принимает значения коэффициентов coefficientA, coefficientB, coefficientC и coefficientD и инициализирует соответствующие приватные переменные. | ||
|
||
Функция calcOutputпереопределена в классе NonlinearModelи использует формулу coefficientA * currentOutput - coefficientB * pow(previousOutput, 2) + coefficientC * input + coefficientD * sin(input)для вычисления выходного значения на основе текущих и выходных значений, а также входного значения. | ||
### Класс `PIDController` | ||
|
||
Класс PIDRegulatorреализации работы ПИД-регулятора. Он включает три коэффициента: gainP, gainIи gainD, которые соответствуют пропорциональному, интегральному и дифференциальному составляющему регулятору. Функция calcOutputпринимает текущую величину ошибки и вычисляет управляющий сигнал, о гравитации на этих коэффициентах и накопленных ошибках. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,82 @@ | ||
<p align="center"> Министерство образования Республики Беларусь</p> | ||
<p align="center">Учреждение образования</p> | ||
<p align="center">“Брестский Государственный технический университет”</p> | ||
<p align="center">Кафедра ИИТ</p> | ||
<br><br><br><br><br><br><br> | ||
<p align="center">Лабораторная работа №2</p> | ||
<p align="center">По дисциплине “Теория и методы автоматического управления”</p> | ||
<p align="center">Тема: “Изучение ПИД-регуляторов”</p> | ||
<br><br><br><br><br> | ||
<p align="right">Выполнил:</p> | ||
<p align="right">Студент 3 курса</p> | ||
<p align="right">Группы АС-63</p> | ||
<p align="right">Крагель А.М.</p> | ||
<p align="right">Проверил:</p> | ||
<p align="right">Ситковец Я. С.</p> | ||
<br><br><br><br><br> | ||
<p align="center">Брест 2024</p> | ||
|
||
--- | ||
|
||
## Цель работы: | ||
Написать программу на языке C++, которая моделирует работу ПИД-регулятора. В качестве объекта управления: математическая модель, которая была получена в прошлой работе. Реализуйте программу с использованием объектно-ориентированного подхода, включая не менее трех классов с использованием наследования. | ||
## Ход работы | ||
Была реализована программа на языке С++, моделирующая работу ПИД-регулятор. Для документирования программы был использован инструмент Doxygen, затем документация была преобразована в Markdown (.md). Результаты работы программы были записаны в файл results.txt. | ||
|
||
Итерация 1: | ||
Выход линейной модели: 0.5 | ||
Выход нелинейной модели: 0.284147 | ||
Ошибка: 0.215853 | ||
Управляющий сигнал: 0.36695 | ||
|
||
Итерация 2: | ||
Выход линейной модели: 0.9 | ||
Выход нелинейной модели: 0.471095 | ||
Ошибка: 0.428905 | ||
Управляющий сигнал: 0.793894 | ||
|
||
Итерация 3: | ||
Выход линейной модели: 1.22 | ||
Выход нелинейной модели: 0.550058 | ||
Ошибка: 0.669942 | ||
Управляющий сигнал: 1.3755 | ||
|
||
Итерация 4: | ||
Выход линейной модели: 1.476 | ||
Выход нелинейной модели: 0.572912 | ||
Ошибка: 0.903088 | ||
Управляющий сигнал: 2.05861 | ||
|
||
Итерация 5: | ||
Выход линейной модели: 1.6808 | ||
Выход нелинейной модели: 0.578363 | ||
Ошибка: 1.10244 | ||
Управляющий сигнал: 2.80242 | ||
|
||
Итерация 6: | ||
Выход линейной модели: 1.84464 | ||
Выход нелинейной модели: 0.579586 | ||
Ошибка: 1.26505 | ||
Управляющий сигнал: 3.59022 | ||
|
||
Итерация 7: | ||
Выход линейной модели: 1.97571 | ||
Выход нелинейной модели: 0.579856 | ||
Ошибка: 1.39586 | ||
Управляющий сигнал: 4.41258 | ||
|
||
Итерация 8: | ||
Выход линейной модели: 2.08057 | ||
Выход нелинейной модели: 0.579915 | ||
Ошибка: 1.50065 | ||
Управляющий сигнал: 5.26251 | ||
|
||
Итерация 9: | ||
Выход линейной модели: 2.16446 | ||
Выход нелинейной модели: 0.579928 | ||
Управляющий сигнал: 6.13446 | ||
|
||
Выход линейной модели: 2.23156 | ||
Выход нелинейной модели: 0.579931 | ||
Ошибка: 1.65163 | ||
Управляющий сигнал: 7.02403 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
Итерация 1: | ||
Выход линейной модели: 0.5 | ||
Выход нелинейной модели: 0.284147 | ||
Ошибка: 0.215853 | ||
Управляющий сигнал: 0.36695 | ||
|
||
Итерация 2: | ||
Выход линейной модели: 0.9 | ||
Выход нелинейной модели: 0.471095 | ||
Ошибка: 0.428905 | ||
Управляющий сигнал: 0.793894 | ||
|
||
Итерация 3: | ||
Выход линейной модели: 1.22 | ||
Выход нелинейной модели: 0.550058 | ||
Ошибка: 0.669942 | ||
Управляющий сигнал: 1.3755 | ||
|
||
Итерация 4: | ||
Выход линейной модели: 1.476 | ||
Выход нелинейной модели: 0.572912 | ||
Ошибка: 0.903088 | ||
Управляющий сигнал: 2.05861 | ||
|
||
Итерация 5: | ||
Выход линейной модели: 1.6808 | ||
Выход нелинейной модели: 0.578363 | ||
Ошибка: 1.10244 | ||
Управляющий сигнал: 2.80242 | ||
|
||
Итерация 6: | ||
Выход линейной модели: 1.84464 | ||
Выход нелинейной модели: 0.579586 | ||
Ошибка: 1.26505 | ||
Управляющий сигнал: 3.59022 | ||
|
||
Итерация 7: | ||
Выход линейной модели: 1.97571 | ||
Выход нелинейной модели: 0.579856 | ||
Ошибка: 1.39586 | ||
Управляющий сигнал: 4.41258 | ||
|
||
Итерация 8: | ||
Выход линейной модели: 2.08057 | ||
Выход нелинейной модели: 0.579915 | ||
Ошибка: 1.50065 | ||
Управляющий сигнал: 5.26251 | ||
|
||
Итерация 9: | ||
Выход линейной модели: 2.16446 | ||
Выход нелинейной модели: 0.579928 | ||
Управляющий сигнал: 6.13446 | ||
|
||
Выход линейной модели: 2.23156 | ||
Выход нелинейной модели: 0.579931 | ||
Ошибка: 1.65163 | ||
Управляющий сигнал: 7.02403 |
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
cmake_minimum_required (VERSION 2.4.0) | ||
project (pidcontroller) | ||
|
||
add_executable(pidcontroller main.cpp) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,114 @@ | ||
#include <iostream> | ||
#include <vector> | ||
#include <cmath> | ||
|
||
using namespace std; | ||
|
||
class MathematicalModel { | ||
public: | ||
virtual double calculateOutput(double current, double previous, double input) const = 0; | ||
virtual ~MathematicalModel() = default; | ||
}; | ||
|
||
class LinearModel : public MathematicalModel { | ||
private: | ||
double a; | ||
double b; | ||
|
||
public: | ||
explicit LinearModel(double a, double b) : a(a), b(b) {} | ||
|
||
double calculateOutput(double current, double previous, double input) const override { | ||
return a * current + b * input; | ||
} | ||
}; | ||
|
||
class NonLinearModel : public MathematicalModel { | ||
private: | ||
double a; | ||
double b; | ||
double c; | ||
double d; | ||
|
||
public: | ||
NonLinearModel(double a, double b, double c, double d) | ||
: a(a), b(b), c(c), d(d) {} | ||
|
||
double calculateOutput(double current, double previous, double input) const override { | ||
return a * current - b * pow(previous, 2) + c * input + d * sin(input); | ||
} | ||
}; | ||
|
||
class PIDController { | ||
private: | ||
double kp; | ||
double ki; | ||
double kd; | ||
double lastError = 0.0; | ||
double accumulatedError = 0.0; | ||
|
||
public: | ||
explicit PIDController(double kp, double ki, double kd) | ||
: kp(kp), ki(ki), kd(kd) {} | ||
|
||
double compute(double error) { | ||
accumulatedError += error; | ||
double deltaError = error - lastError; | ||
double output = kp * error + ki * accumulatedError + kd * deltaError; | ||
lastError = error; | ||
return output; | ||
} | ||
}; | ||
|
||
int main() { | ||
setlocale(LC_ALL, "Russian"); | ||
|
||
double linearA = 0.8; | ||
double linearB = 0.5; | ||
|
||
double nonLinearA = 0.8; | ||
double nonLinearB = 0.5; | ||
double nonLinearC = 0.2; | ||
double nonLinearD = 0.1; | ||
|
||
double linearOutput = 0.0; | ||
double nonLinearOutput = 0.0; | ||
double lastNonLinearOutput = 0.0; | ||
|
||
double inputValue = 1.0; | ||
|
||
LinearModel linearModel(linearA, linearB); | ||
NonLinearModel nonLinearModel(nonLinearA, nonLinearB, nonLinearC, nonLinearD); | ||
PIDController pidController(1.0, 0.5, 0.2); | ||
|
||
vector<double> linearOutputs; | ||
vector<double> nonLinearOutputs; | ||
vector<double> errors; | ||
vector<double> controlOutputs; | ||
|
||
for (int i = 1; i <= 10; i++) { | ||
linearOutput = linearModel.calculateOutput(linearOutput, 0, inputValue); | ||
nonLinearOutput = nonLinearModel.calculateOutput(nonLinearOutput, lastNonLinearOutput, inputValue); | ||
lastNonLinearOutput = nonLinearOutput; | ||
|
||
double error = linearOutput - nonLinearOutput; | ||
double controlOutput = pidController.compute(error); | ||
|
||
linearOutputs.push_back(linearOutput); | ||
nonLinearOutputs.push_back(nonLinearOutput); | ||
errors.push_back(error); | ||
controlOutputs.push_back(controlOutput); | ||
} | ||
|
||
// Вывод результатов для каждой итерации | ||
for (int i = 0; i < 10; i++) { | ||
cout << "Итерация " << i + 1 << ":\n"; | ||
cout << "Выход линейной модели: " << linearOutputs[i] << '\n'; | ||
cout << "Выход нелинейной модели: " << nonLinearOutputs[i] << '\n'; | ||
cout << "Ошибка: " << errors[i] << '\n'; | ||
cout << "Управляющий сигнал: " << controlOutputs[i] << '\n'; | ||
cout << '\n'; | ||
} | ||
|
||
return 0; | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
# Отчет о лабораторной работе: Моделирование температуры объекта | ||
|
||
# Цель работы | ||
Цель данной лабораторной работы заключается в разработке программы на C++, которая будет моделировать температуру объекта, описываемую линейной и нелинейной математическими моделями. | ||
|
||
# Введение | ||
Температура объекта может быть описана с помощью дифференциального уравнения, которое при дискретизации преобразуется в линейную и нелинейную модель. Линейная модель позволяет предсказать температуру на основе предыдущих значений и передаваемого тепла, тогда как нелинейная модель учитывает дополнительные эффекты. | ||
|
||
# Описание моделей | ||
1. Линейная модель: | ||
y_{t+1} = a*y_t + b*u_t | ||
Здесь: | ||
- y_t — текущая температура, | ||
- u_t — передаваемое тепло, | ||
- a и b — коэффициенты. | ||
|
||
2. Нелинейная модель: | ||
y_{t+1} = a*y_t - b*(y_{t-1})^2 + c*u_t + d*sin(u_{t-1}) | ||
Здесь: | ||
- y_{t-1} — предыдущее значение температуры, | ||
- c и d — дополнительные коэффициенты. | ||
|
||
# Описание алгоритма | ||
1. Ввод данных: Пользователь вводит коэффициенты a, b, c, d и количество шагов времени t. | ||
2. Линейная модель: | ||
- Пользователь вводит начальное значение температуры y и передаваемое на каждой итерации тепло u. | ||
- Программа вычисляет температуру на каждом шаге по линейной формуле и выводит результаты. | ||
3. Нелинейная модель: | ||
- Пользователь вводит начальное значение температуры для второго массива и передаваемое на каждой итерации тепло. | ||
- Программа вычисляет температуру по нелинейной формуле, учитывая предыдущее значение температуры и выводит результаты. | ||
|
||
# Результаты | ||
Программа успешно моделирует температуру объекта в соответствии с заданными формулами. Пользователь может вводить различные коэффициенты и управляющие сигналы, что позволяет анализировать влияние этих параметров на температуру. | ||
|
||
# Выводы | ||
В ходе лабораторной работы была разработана программа, позволяющая моделировать температуру объекта с использованием линейной и нелинейной моделей. Результаты моделирования показывают, как изменения в коэффициентах и передаваемом тепле влияют на температуру объекта. Данная программа может быть использована для дальнейших исследований в области управления температурой в различных системах. |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,4 @@ | ||
cmake_minimum_required(VERSION 3.10) | ||
project(Task01) | ||
|
||
add_executable(Task01_6321 main.cpp) |
Oops, something went wrong.