Загрузка данных


%% Лабораторная работа: Упрощение линейных систем
% Вариант №12
clear; clc; close all;

%% 1. Определение исходной системы
s = tf('s');
num = [5000 25000];
den = [1 10 38 60 36];
W = tf(num, den);

%% 2. Упрощение модели до 3-го порядка
% Используем метод сбалансированного сокращения (balred), 
% так как это стандартный инструмент MATLAB для задач из методички.
W_red = balred(W, 3); 

fprintf('--- Исходная система (Вариант 12) ---\n');
display(W);
fprintf('--- Упрощенная система (3-й порядок) ---\n');
display(W_red);

%% 3. Сравнение разомкнутых систем
figure('Name', 'Разомкнутая система: Вариант 12');
step(W, 'b', W_red, 'r--');
grid on;
legend('Исходная (4 пор.)', 'Упрощенная (3 пор.)');
title('Переходная характеристика разомкнутой системы');

%% 4. Сравнение замкнутых систем (единичная ОС)
W_cl = feedback(W, 1);
W_red_cl = feedback(W_red, 1);

figure('Name', 'Замкнутая система: Вариант 12');
step(W_cl, 'b', W_red_cl, 'r--');
grid on;
legend('Исходная', 'Упрощенная');
title('Переходный процесс замкнутой системы');

%% 5. Расчет и вывод показателей качества
info = stepinfo(W_cl);
info_red = stepinfo(W_red_cl);

fprintf('\nАнализ точности аппроксимации:\n');
fprintf('%-20s | %-10s | %-10s | %-10s\n', 'Показатель', 'Оригинал', 'Упрощ.', 'Ошибка %');
fprintf('------------------------------------------------------------\n');

% Проверка основных метрик
metrics = {'SettlingTime', 'Overshoot', 'PeakTime'};
labels = {'Время рег. (с)', 'Перерегулирование %', 'Время пика (с)'};

for i = 1:length(metrics)
    m = metrics{i};
    val_orig = info.(m);
    val_red = info_red.(m);
    
    % Защита от деления на 0 для перерегулирования
    if val_orig == 0 && val_red == 0
        err = 0;
    else
        err = abs(val_orig - val_red) / (val_orig + eps) * 100;
    end
    
    fprintf('%-20s | %-10.3f | %-10.3f | %-10.2f%%\n', labels{i}, val_orig, val_red, err);
end

% Проверка условия 10%
if abs(info.SettlingTime - info_red.SettlingTime)/info.SettlingTime < 0.1
    disp('Результат: Условие по длительности процесса (<10%) ВЫПОЛНЕНО.');
else
    disp('Результат: Ошибка превышает 10%. Требуется уточнение модели.');
end