Инструкция по использованию программы
1.Введите целое число k – число каналов управления от 1 до 4
2.Введите целое число L – номер опрашиваемого датчика от 26 до 40 (активные линейные)
3.Введите целое положительное число T – время, на которое нужно прервать выполнение (в секундах)
4.Введите целое положительное число опросов в серии J
5.Введите целое положительное число N – число строк плана
6.Введите массив каналов управления – целых чисел от 7 до 10
7.Введите массив из N*k значений управляющих воздействий, удовлетворяющих условиям:
для М = 7: [−70; +70];
для М = 8: [−3; +3];
для М = 9: [−5; +5];
для М = 10: [−2,5; +2,5].
Описание контрольной задачи
k = 3 L = 30 T = 5 J = 3 N = 4 M[k]: 7 8 9
U[k][N]:
-60 -30 30 60 -2 -1 1 2 -1.5 -1 1 1.5
6
Исследовать зависимость изменения Yср – среднего значения результатов опросов датчика – в условиях фиксированного управления по одному каналу и равномерного возрастания управления по другому каналу.
Было произведено изменение программы:
Изменена функция vvod: ликвидирован ввод времени T, числа строк плана N, массива управляющих воздействий U[k][N]
Изменена главная функция main:
−осуществлен ввод шага изменения значения управляющего воздействия – step, минимального Umin и максимального Umax значений управляющего воздействия;
−по значениям step, Umin, Umax в главной функции осуществлено формирование вектора из значений управляющих воздействий;
−осуществлено построение осей графика и кривой по средним значениям результатов опросов датчика.
Программа
#include "plant.h" #include "plant.c" #include <Windows.h> #include <iostream> #include <cmath> #include <vector> #define NN 256
7
using namespace std;
Plant plant; //Объект управления //Исходные данные
int k, L, J;
double Umin, Umax, Step, M[NN]; char Prod;
//Текущие значения vector <double> U; vector <double> Uusr; double y[NN];
// Подпрограмма ввода исходных данных void vvod(int &k,int &L,int &J,double M[NN])
{
cout << "Vvedite k" << '\n'; //Число каналов управления cin >> k;
cout << "Vvedite L" << '\n'; //Номер опрашиваемого датчика cin >> L;
cout << "Vvedite J" << '\n'; //Число опросов в серии cin >> J;
cout << "Vvedite Massiv M" << '\n'; //Номер канала управления for (int i = 1; i <= k; i++)
{
cin >> M[i];
}
}
//Подпрограмма подсчета среднего значения и дисперсии void calc(int J, int L, double &Ycp, double &Sy2, double y[NN])
{
Ycp = 0;
Sy2 = 0;
for (int i = 1; i <= J; i++)
{
y[i] = plant_measure(L, plant); Ycp = Ycp + y[i];
Sy2 = Sy2 + (y[i]) * (y[i]);
8
}
Ycp = Ycp / J;
Sy2 = (Sy2 - J * Ycp * Ycp) / (J - 1);
}
// Главная функция int main()
{
HDC hDC = GetDC(GetConsoleWindow()); double Ycp,Sy2,y[NN];
plant_init(plant);
vvod (k,L,J,M); //Ввод исходных данных for (int j = 1; j <= k; j++)
{
cout << "Kanal wozdejstwia"<< '\t' << M[j]<< '\n'; cout << "Vvedite shag" << '\n';
cin >> Step;
cout << "Vvedite Umin" << '\n'; cin >> Umin;
cout << "Vvedite Umax" << '\n'; cin >> Umax;
double Ustep = 0;
int a = (Umax - Umin) / Step; double b = a * Step + Umin; if (b < Umax)
{
a=a+1;
}
U.reserve (a+1); //устанавливается длина вектора
Uusr.reserve (a+1);
for (int c = 0; c <= a; c++)
{
U[c] = Umin + Ustep; Ustep = Ustep + Step;
}
9
if (b < Umax)
{
U[a] = Umax;
}
cout << "N" << '\t' << "Ui" << '\t' << "Ycp" << '\t'<< '\n'; for (int h = 0; h <= a; h++)
{
{
plant_control(M[j],U[h],plant); //Выдача управляющих воздействий
}
for (int f = 1; f <= J; f++)
{
y[f] = plant_measure(L, plant); // Опрос датчика
}
calc(J,L,Ycp,Sy2,y);
cout << h+1 << '\t' << U[h] << '\t'; cout << Ycp << '\t' << '\n'; Uusr[h] = Ycp;
}
// расчет масштабирующих коэффициентов
double Ycpmin = Uusr[0]; // Определение мин и максYcp double Ycpmax = Uusr[0];
for (int h = 0; h <= a; h++)
{
double b = Uusr[h]; if (b < Ycpmin)
{
Ycpmin = b;
}
if (b > Ycpmax)
{
Ycpmax = b;
}
}
double Kx = 1; // расчет коэффициентов
10