Оценка моделей Используя данные частотного диапазона

Программное обеспечение System Identification Toolbox™ позволяет вам использовать данные частотного диапазона, чтобы идентифицировать линейные модели в командной строке и в приложении System Identification. Можно оценить и непрерывное время и дискретное время линейные модели с помощью данных частотного диапазона. Эта тема представляет обзор оценки модели тулбокс с помощью данных частотного диапазона. Для примера оценки модели с помощью данных частотного диапазона смотрите Идентификацию Частотного диапазона: Оценка Моделей Используя Данные о Частотном диапазоне.

Данные частотного диапазона могут иметь два типа:

  • Данные ввода - вывода частотного диапазона — Вы получаете данные путем вычисления преобразований Фурье входа временного интервала, u (t), и выводите, y (t), сигналы. Данные являются набором входа, U (ω), и выход, Y (ω), сигнализирует в частотном диапазоне. В тулбоксе данные ввода - вывода частотного диапазона представлены с помощью iddata объекты. Для получения дополнительной информации смотрите Данные Частотного диапазона Представления в Тулбоксе.

  • Данные частотной характеристики — Также вызвали функцию частоты или функцию частотной характеристики (FRF), данные состоят из измерений передаточной функции, G (), из системы в дискретном наборе частот ω. Данные частотной характеристики на частоте, которую ω говорит вам, как линейная система отвечает на синусоидальный вход той же частоты. В тулбоксе данные частотной характеристики представлены с помощью idfrd объекты. Для получения дополнительной информации смотрите Данные Частотного диапазона Представления в Тулбоксе. Можно получить данные частотной характеристики следующими способами:

    • Измерьте значения данных частотной характеристики непосредственно, такой как при помощи спектра анализатор.

    • Выполните спектральный анализ временного интервала или данных ввода - вывода частотного диапазона (iddata объекты) использование команд, таких как spa и spafdr.

    • Вычислите частотную характеристику идентифицированной линейной модели с помощью команд, таких как freqresp, bode, и idfrd.

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

Преимущества Использования данных частотного диапазона

Используя частотный диапазон данные имеют следующие преимущества:

  • Сжатие данных — можно сжать длинные записи данных, когда вы преобразуете данные временного интервала в частотный диапазон. Например, можно использовать логарифмически распределенные частоты.

  • Не однородность — данные Частотного диапазона не должны быть расположены равными интервалами. Ваши данные могут иметь зависимое частотой разрешение так, чтобы больше точек данных использовалось в необходимых областях частоты. Например, частоты интереса могли быть областью значений пропускной способности системы, или около резонансов системы.

  • При предварительной фильтрации — Предварительная фильтрация данных в частотном диапазоне становится простой. Это соответствует присвоению различных весов к различным частотам данных.

  • Сигнал непрерывного времени - можно представлять сигналы непрерывного времени с помощью данных частотного диапазона и использовать данные в оценке.

Представление данных частотного диапазона в тулбоксе

Прежде, чем выполнить оценку модели, вы задаете данные частотного диапазона как объекты в тулбоксе. Можно задать и данные частотного диапазона непрерывного времени и дискретного времени.

  • Данные ввода - вывода частотного диапазона — Задают как iddata объект. В объекте вы храните U (ω), Y (ω) и вектор частоты ω. Область свойством объекта является 'Frequency', указывать, что объект содержит сигналы частотного диапазона. Если U (ω), Y (ω) является преобразованиями Фурье дискретного времени сигналов дискретного времени, произведенных с интервалом выборки Ts, обозначьте интервал выборки в iddata объект. Если U (ω), Y (ω) является преобразованиями Фурье сигналов непрерывного времени, задает Ts как 0 в iddata объект.

    Чтобы отобразить данные на графике в командной строке, используйте plot команда.

    Например, можно построить фазу и величину данных ввода - вывода частотного диапазона.

    Загрузите данные ввода - вывода временного интервала.

    load iddata1 z1

    Временной интервал вводит u и выходные параметры y хранятся в z1, iddata возразите чей Domain свойство установлено в 'Time'.

    Преобразование Фурье данные, чтобы получить данные ввода - вывода частотного диапазона.

    zf = fft(z1);

    Область свойство zf установлен в 'Frequency', указание, что это - данные частотного диапазона.

    Постройте величину и фазу данных ввода - вывода частотного диапазона.

    plot(zf)

  • Данные частотной характеристики — Задают как idfrd объект. Если у вас есть программное обеспечение Control System Toolbox™, можно также задать данные как frd объект.

    Чтобы отобразить данные на графике в командной строке, используйте bode команда.

    Например, можно построить частотную характеристику модели передаточной функции.

    Создайте модель передаточной функции своей системы.

    sys = tf([1 0.2],[1 2 1 1]);

    Вычислите частотную характеристику модели передаточной функции, sys, в 100 точках частоты. Укажите диапазон частот как от 0,1 рад/с до 10 рад/с.

    freq = logspace(-1,1,100);
    frdModel = idfrd(sys,freq);

    Постройте частотную характеристику модели.

    bode(frdModel)

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

Можно также преобразовать между частотным диапазоном и типами данных временного интервала с помощью следующих команд.

Исходный формат данныхК данным временного интервала
(iddata объект
К данным частотного диапазона
(iddata объект
К данным частотной характеристики
(idfrd объект
Данные временного интервала
(iddata объект
Нет данныхИспользуйте fft
  • Используйте etfe, spa, или spafdr.

  • Оцените линейную параметрическую модель от iddata объект и использование idfrd вычислить данные частотной характеристики.

Данные частотного диапазона
(iddata объект
Используйте ifft (работает только на равномерно расположенные с интервалами данные частотного диапазона).Нет данных
  • Используйте etfe, spa, или spafdr.

  • Оцените линейную параметрическую модель от iddata объект и использование idfrd вычислить данные частотной характеристики.

Данные частотной характеристики
(idfrd объект
Не поддерживаемыйИспользуйте iddata. Программное обеспечение создает частотный диапазон iddata объект, который имеет то же отношение между выходом и входом как исходный idfrd объектные данные частотной характеристики.
  • Используйте spafdr. Программное обеспечение вычисляет данные частотной характеристики с различным разрешением (номер и интервал частот), чем исходные данные.

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

Непрерывное время и данные частотного диапазона дискретного времени

В отличие от данных временного интервала, шаг расчета Ts из частотного диапазона данные могут быть нулем. Данные частотного диапазона с нулевым Ts называется данными непрерывного времени. Данные частотного диапазона с Ts больше, чем нуль называется данными дискретного времени.

Можно получить данные частотного диапазона непрерывного времени (Ts = 0) следующими способами:

  • Сгенерируйте данные с известного непрерывного времени аналитические выражения.

    Например, предположите, что вы знаете, что частотная характеристика вашей системы G(ω)=1/(b+jω), где b является константой. Также примите, что входные параметры временного интервала к вашей системе, u(t)=eatsinw0t, где a является константой, больше, чем нуль, и u (t) является нулем навсегда t меньше, чем нуль. Можно вычислить преобразование Фурье u (t), чтобы получить

    U(ω)=ω0/[(a+jω)2+w02]

    Используя U (ω) и G (ω) можно затем получить выражение частотного диапазона для выходных параметров:

    Y(ω)=G(ω)U(ω)

    Можно теперь выполнить аналитические выражения для Y (ω) и U (ω) по сетке значений частоты (ωgrid=ω1,ω2,...,ωn), и получите вектор значений данных ввода - вывода частотного диапазона (Ygrid,Ugrid). Можно группировать данные ввода - вывода как непрерывное время iddata объект путем определения нулевого шага расчета, Ts.

    Ts = 0;
    zf = iddata(Ygrid,Ugrid,Ts,'Frequency',wgrid)
  • Вычислите частотную характеристику линейной системы непрерывного времени в сетке частот.

    Например, в следующем коде, вы генерируете данные частотной характеристики непрерывного времени, FRDc, из модели передаточной функции непрерывного времени, sys для сетки частот, freq.

    sys = idtf(1,[1 2 2]);
    freq = logspace(-2,2,100);
    FRDc = idfrd(sys,freq);
  • Измерьте амплитуды и фазы из синусоидального эксперимента, где система измерения использует фильтры сглаживания. Вы измеряете ответ системы к синусоидальным входным параметрам на различных частотах и группируете данные как idfrd объект. Например, данные частотной характеристики, измеренные со спектром анализатор, являются непрерывным временем.

    Можно также провести эксперимент при помощи периодического, сигналы непрерывного времени (несколько синусоид) как входные параметры к системе и измерению ответа системы. Затем можно группировать входные и выходные данные как iddata объект.

Можно получить данные частотного диапазона дискретного времени (Ts > 0) следующими способами:

  • Преобразуйте измеренные значения временного интервала с помощью дискретного преобразования Фурье.

    Например, в следующем коде, вы вычисляете дискретное преобразование Фурье данных временного интервала, y, это измеряется в дискретных моментах времени с шагом расчета 0,01 секунды.

    t = 0:0.01:10;
    y = iddata(sin(2*pi*10*t),[],0.01);
    Y = fft(y);
  • Вычислите частотную характеристику линейной системы дискретного времени.

    Например, в следующем коде, вы генерируете данные частотной характеристики дискретного времени, FRDd, из модели передаточной функции дискретного времени, sys. Вы задаете ненулевой шаг расчета для создания модели дискретного времени.

    Ts = 1;
    sys = idtf(1,[1 0.2 2.1],Ts);
    FRDd = idfrd(sys,logspace(-2,2,100));

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

Примечание

Для данных дискретного времени программное обеспечение игнорирует данные частотного диапазона выше частоты Найквиста во время оценки.

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

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

Чтобы просмотреть побочные данные, отобразите данные на графике в приложении или используйте plot (для iddata объекты) или bode (для idfrd объекты) команды. После идентификации побочных данных в графике можно удалить их. Например, если вы хотите удалить точки данных 20–30 из zf, частотный диапазон iddata объект, используйте следующий синтаксис:

zf(20:30) = [];

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

Вы можете также предварительный фильтр высокочастотный шум в ваших данных. Вы можете данные частотного диапазона предварительного фильтра в приложении, или использовать idfilt в командной строке. Предварительная фильтрация данных может также помочь удалить дрейфы, которые являются низкочастотными воздействиями. В дополнение к минимизации шума предварительная фильтрация позволяет вам фокусировать свою модель на определенных диапазонах частот. Частотный диапазон интереса часто соответствует полосе пропускания по точкам останова на Диаграмме Боде. Например, если вы моделируете объект для приложений системы управления, вы можете предварительный фильтр данные, чтобы улучшить частоты вокруг желаемой полосы пропускания замкнутой системы.

Для получения дополнительной информации смотрите Данные о Фильтрации.

Оценка линейных параметрических моделей

После того, как вы предварительно обработали данные частотного диапазона, можно использовать их, чтобы оценить модели непрерывного и дискретного времени.

Поддерживаемые типы модели

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

Тип моделиДополнительная информацияКоманды оценкиОценка приложение
Модели передаточной функции См. оценочные модели передаточной функции в приложении System Identification.
Модели в пространстве состоянийПредполагаемый K матрица модели в пространстве состояний является нулем.Смотрите оценочные модели в пространстве состояний в приложении System Identification.
Модели процессовВозмущение не оценивается.Смотрите, что оценочные модели процессов Используют приложение.
Модели полинома ввода - выводаМожно оценить только модели ARX и ошибка на выходе.
  • oe

  • arx

  • iv4

  • ivx

  • polyest с na, nc, и nd порядки полинома, заданного как нуль

См. оценочные модели полинома в приложении.
Линейные модели серого ящикаПараметры модели, которые только связаны с шумовым матричным K не оцениваются.Оценка модели серого ящика не доступна в приложении.
Модели корреляции
(Модели импульсной характеристики)
 См., что оценочные модели импульсной характеристики Используют приложение System Identification.
Модели частотной характеристики
(Оцененный как idfrd объекты
 См. оценочные модели частотной характеристики в приложении.

Прежде, чем выполнить оценку, можно задать опции оценки, такой как, как программное обеспечение обрабатывает начальные условия данных об оценке. Чтобы сделать так в командной строке, используйте набор опции оценки, соответствующий команде оценки. Например, предположите, что вы хотите оценить модель передаточной функции из данных частотного диапазона, zf, и вы также хотите оценить начальные условия данных. Используйте tfestOptions набор опции, чтобы задать опции оценки, и затем оценить модель.

opt = tfestOptions('InitialCondition','estimate');
sys = tfest(zf,opt);

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

Примечание

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

Вы не можете выполнить следующие оценки с помощью данных частотного диапазона:

Оценка моделей непрерывного и дискретного времени

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

Можно оценить все поддерживаемые линейные модели как модели непрерывного времени, за исключением моделей корреляции (см. impulseest). Можно оценить модели непрерывного времени с помощью и данных непрерывного времени и дискретного времени. Для получения информации о данных непрерывного времени и дискретного времени смотрите Данные Частотного диапазона Непрерывного времени и Дискретного времени.

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

  • Данные ввода - вывода частотного диапазона дискретного времени (iddata объект) — Задают междемонстрационное поведение входного сигнала временного интервала u (t) что вы Фурье, преобразованный, чтобы получить входной сигнал частотного диапазона U (ω).

  • Данные частотной характеристики дискретного времени (idfrd объект) — данные сгенерированы путем вычисления частотной характеристики модели дискретного времени. Задайте междемонстрационное поведение как метод дискретизации, принятый, чтобы вычислить модель дискретного времени из базовой модели непрерывного времени. Для примера смотрите, Задают Междемонстрационное Поведение для Данных Частотной характеристики Дискретного времени.

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

Задайте междемонстрационное поведение для данных частотной характеристики дискретного времени

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

Сгенерируйте данные частотной характеристики дискретного времени. Для этого первое построение модель передаточной функции непрерывного времени, sys. Затем преобразуйте его в модель дискретного времени, sysd, использование c2d команда и метод хранения первого порядка (FOH). Используйте модель sysd дискретного времени сгенерировать данные частотной характеристики на заданных частотах, freq.

sys = idtf([1 0.2],[1 2 1 1]);
sysd = c2d(sys,1,c2dOptions('Method','foh'));
freq = logspace(-1,0,10);
FRdata = idfrd(sysd,freq);

FRdata данные дискретного времени. Программное обеспечение устанавливает InterSample свойство FRdata к 'foh', который является методом дискретизации, который использовался, чтобы получить sysd от sys.

Оцените передаточную функцию непрерывного времени третьего порядка из данных дискретного времени.

model1 = tfest(FRdata,3,1)
model1 =
 
        s + 0.2
  -------------------
  s^3 + 2 s^2 + s + 1
 
Continuous-time identified transfer function.

Parameterization:
   Number of poles: 3   Number of zeros: 1
   Number of free coefficients: 5
   Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties.

Status:                                                   
Estimated using TFEST on frequency response data "FRdata".
Fit to estimation data: 100%                              
FPE: 4.345e-31, MSE: 8.453e-32                            

model1 модель непрерывного времени, оцененные данные частотной характеристики дискретного времени использования. Базовая динамика непрерывного времени исходной модели sys третьего порядка получены в model1 потому что правильное междемонстрационное поведение задано в FRdata.

Теперь задайте междемонстрационное поведение как хранение нулевого порядка (ZOH) и оцените модель передаточной функции третьего порядка.

FRdata.InterSample = 'zoh';
model2 = tfest(FRdata,3,1)
model2 =
 
          -15.49 s - 3.264
  ---------------------------------
  s^3 - 30.03 s^2 - 6.872 s - 17.02
 
Continuous-time identified transfer function.

Parameterization:
   Number of poles: 3   Number of zeros: 1
   Number of free coefficients: 5
   Use "tfdata", "getpvec", "getcov" for parameters and their uncertainties.

Status:                                                   
Estimated using TFEST on frequency response data "FRdata".
Fit to estimation data: 94.82%                            
FPE: 0.004674, MSE: 0.001557                              

model2 не получает динамику исходной модели sys. Таким образом производящие связанные ошибки введены по оценке модели, когда междемонстрационное поведение правильно не задано.

Преобразуйте модель данных частотной характеристики в передаточную функцию

В этом примере показано, как преобразовать модель данных частотной характеристики (FRD) в модель передаточной функции. Вы обрабатываете модель FRD как данные об оценке и затем оцениваете передаточную функцию.

Получите модель FRD.

Например, используйте bode получить величину и данные о фазовом отклике для следующей системы пятого порядка:

G(s)=s+0.2s5+s4+0.8s3+0.4s2+0.12s+0.04

Используйте 100 точек частоты между от 0,1 рад/с до 10 рад/с, чтобы получить модель FRD. Используйте frd создать объект модели частотной характеристики.

freq = logspace(-1,1,100);
sys0 = tf([1 0.2],[1 1  0.8  0.4  0.12  0.04]);
[mag,phase] = bode(sys0,freq);
frdModel = frd(mag.*exp(1j*phase*pi/180),freq);

Получите лучшее приближение третьего порядка к системной динамике путем оценки передаточной функции с 3 нулями и 3 полюсами.

np = 3;
nz = 3;
sys = tfest(frdModel,np,nz);

sys предполагаемая передаточная функция.

Сравните ответ Модели FRD и предполагаемой модели передаточной функции.

bode(frdModel,sys,freq(1:50));

Модель FRD сгенерирована от системы пятого порядка sys0. В то время как sys, приближение третьего порядка, не получает целый ответ sys0, это получает ответ хорошо приблизительно до 0,6 рад/с.

Проверка предполагаемой модели

После оценки модели для вашей системы можно подтвердить, воспроизводит ли это поведение системы в приемлемых границах. Рекомендуется, чтобы вы использовали отдельные наборы данных в оценке и проверке вашей модели. Можно использовать временной интервал или данные частотного диапазона, чтобы подтвердить модель, оцененную с помощью данных частотного диапазона. Если вы используете данные о валидации ввода - вывода, чтобы подтвердить предполагаемую модель, можно сравнить симулированный ответ модели на измеренный вывод данных валидации. Если ваши данные о валидации являются данными частотной характеристики, можно сравнить его с частотной характеристикой модели. Например, чтобы сравнить выход предполагаемой модели sys к измеренным данным о валидации zv, используйте следующий синтаксис:

compare(zv,sys);

Можно также выполнить остаточный анализ. Для получения дополнительной информации смотрите, Подтверждая Модели После Оценки.

Идентификация частотного диапазона Поиска и устранения проблем

Когда вы оцениваете модель с помощью данных частотного диапазона, алгоритм оценки минимизирует потерю (стоимость) функция. Например, если вы оцениваете SISO линейная модель из данных частотной характеристики f, алгоритм оценки минимизирует следующую функцию потерь наименьших квадратов:

minimizeG(ω)k=1Nf|W(ωk)(G(ωk)f(ωk))|2

Здесь W зависимый частотой вес, который вы задаете, G линейная модель, которая должна быть оценена, ω является частотой, и Nf является количеством частот, на которых данные доступны. Количество (G(ωk)f(ωk)) ошибка частотной характеристики. Для данных ввода - вывода частотного диапазона алгоритм минимизирует взвешенную норму ошибки на выходе вместо ошибки частотной характеристики. Для получения дополнительной информации смотрите Функцию потерь и Метрики качества Модели. Во время оценки побочная или неполученная динамика в ваших данных может произвести функцию потерь и привести к неудовлетворительной оценке модели.

  • Неожиданная, побочная динамика — Обычно наблюдала, когда высокие области величины данных имеют низкое отношение сигнал-шум. Подходящая ошибка вокруг этих фрагментов данных имеет большой вклад в функцию потерь. В результате алгоритм оценки может сверхсоответствовать и присвоить неожиданную динамику шуму в этих областях. Диагностировать эту проблему:

    • Улучшите отношение сигнал-шум — можно собрать больше чем один набор данных и насчитать их. Если у вас есть данные ввода - вывода частотного диапазона, можно объединить несколько наборов данных при помощи merge команда. Используйте эти данные в оценке, чтобы получить улучшенный результат. В качестве альтернативы можно отфильтровать набор данных и использовать его в оценке. Например, используйте фильтр скользящего среднего значения по данным, чтобы сглаживать измеренный ответ. Примените фильтр сглаживания только в областях данных, где вы уверены, что негладкость происходит из-за шума, и не из-за системной динамики.

    • Уменьшайте удар определенных фрагментов данных по функции потерь — можно задать зависимый частотой вес. Например, если вы оцениваете модель передаточной функции, задаете вес в WeightingFilter опция опции оценки установила tfestOptions. Задайте маленький вес в областях частоты, где побочные движущие силы существуют. В качестве альтернативы используйте меньше точек данных вокруг этой области частоты.

  • Неполученная динамика — Обычно наблюдала, когда движущие силы, которые вы хотите получить, имеют низкую величину относительно остальной части данных. Поскольку плохая подгонка к низким данным о величине способствует меньше функции потерь, алгоритм может проигнорировать эти движущие силы, чтобы уменьшать ошибки на других частотах. Диагностировать эту проблему:

    • Укажите, что зависимый частотой вес — Задает большой вес для области частоты, где требуется получить динамику.

    • Используйте больше точек данных вокруг этой области.

Для примера этих методов поиска и устранения неисправностей смотрите Идентификацию Частотного диапазона Поиска и устранения неисправностей Моделей Передаточной функции.

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

Следующие шаги после идентификации модели

После оценки модели можно выполнить преобразования моделей, извлечь параметры модели, и симулировать и предсказать ответ модели. Некоторые задачи, которые можно выполнить:

Похожие темы